DRAFT
ECMPS Emissions
Check Specifications

United States Environmental Protection Agency
Office of Air and Radiation
Clean Air Markets Division

Ariel Rios Building
1200 Pennsylvania Avenue
Washington, DC 20460

March 07, 2012


-------
Table of Contents

Appendix D and E Status	1

Daily Calibration Status	39

Daily Calibration Test	53

Daily Emissions Data	102

Daily Test	120

Flow-to-Load Status	127

Hourly Aggregation	141

Hourly Appendix D	190

Hourly Appendix E	256

Hourly Apportionment	275

Hourly Calculated Data	294

Hourly Derived Data	362

Hourly General	436

Hourly Monitor Data	463

Hourly Operating Data	526

Linearity Status	582

LME	611

RAT A Status	666


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Appendix D and E Status

Environmental Protection Agency

Page 1 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-1

Check Name:

Determine Appendix E Status

Related Former Checks:

Applicability:

Description:

Validation Tables:

Fuel Code (Lookup Table)

Specifications:

Set PriorAppendixERecord = null.

Set InvalidAppendixERecord = null.

Set CurrentAppendixEStatus = null.

Set PriorAppendixEEventRecord = null.

Set SubsequentAppendixERecord = null
Set AppendixEMissingOpDatalnfo = null.

If (App E Op Code in set {N, W, X, Y, Z} ) AND AppENOXE System ID is not null)

Append AppE NOXE System ID to NOXE System ID Array.

Locate the most recent record in AppendixETestRecordsByLocationForQAStatus for the location where the SystemID is
equal to the AppE NOXE System ID and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to
the CurrentOperatingDate/Hour.

if (AppendixETestRecordsByLocationFor(QAStatus\s found)

Set PriorAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.

Locate the most recent record in AppendixETestRecords By Location ForOAStatus for the location where the
SystemID is equal to the AppENOXESystemID and the TestResultCode is equal to "INVALID" and the
EndDate/Hour is prior to the CurrentOperatingDate/Hour and the EndDate/Hour is greater than the
Prior A ppen dixE/?£?«¦>/*
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentAppendixEStatus = "Prior Test Not Yet Evaluated",
else if (PriorA ppendixE Record.TcslRcsuhCodc = null)

Set CurrentAppendixE Status = "OOC-Prior Test Has Critical Errors".

Set PriorTestExpirationDate = PriorAppendixERecord.TestExpirationD ate

if (PriorTestExpirationDate is null)

Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
PriorAppendixERecord.EndDate/Hour.

if (CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate)

Set CurrentAppendixEStatus = "OOC-Expired".

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the
AppENOXESystemID and the RequiredTestCode is equal to 75 and the QACertEventDate/Hour is
prior to the CurrentOperatingDate/Hour and theQACertEventDate/Hour is on or after the
Prior AppendixERecord. EndD ate/Hour

if {QACertificationEventRecords is found)

Set PriorAppendixEEventRecord = the found record in QACertificationEventRecords.

if (the number of calendar days ON OR AFTER the

Prior A ppendixEE ventRecord. Q A C crt E vcn t D a tc and ON OR BEFORE the

CurrentOperatingDate/Hour > 180)

Set CurrentAppendixEStatus = "OOC-Event".

else if (PriorAppendixEEventRecord .MinOpDaysPriorQuarter is null)
Set PriorAppendixEEventRecord .MinOpDaysPriorQuarter = 0
Set PriorAppendixEEventRecord .MaxOpDaysPriorQuarter = 0

for each quarter beginning with the quarter of the

Prior A ppendixEE vent Record Q A C crt E vcn t D a tc and continuing through the
quarter BEFORE the CurrentOperatingDate/Hour

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Locate the record in OperatingSuppDataRecordsbyLocation where
the OpTypeCode is equal to "OPDAYS" and the reporting period is
equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Environmental Protection Agency

Page 3 of 703


-------
Draft ECMPS Emissions Check Specifications

else

3/7/2012 12:00:00AM

Set PriorAppendbcEEventRecordMinOpDaysPriorQuarter

= -1

Set AppendixEMissingOpDatalnfo = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked and
[QTR] is the number of the quarter being checked,
exit for.

If the quarter being checked is the quarter of the
Prior A ppendixE E ventRecord Q A C crt E vcn t D a tc

If (OperatingSuppDataRecordsbyLocation. Op Value
MINUS the number of calendar days in the quarter
being checked that are PRIOR to the
PriorAppendixEEventRecord. Q ACertEventDate >

0)

Set

Prior A ppendixE E ventRecord M i n Op D ay s P

riorQuarter =

OperatingSuppDataRecordsbyL ocatiott. Op

Value MINUS the number of calendar days in
the quarter being checked that are PRIOR to
the

Prior A ppendixE E ventRecord Q A C crt E vcn t

Date

If (OperatingSuppDataRecordsbyLocation. Op Value
is less than the number of calendar days in the
quarter being checked that are ON OR AFTER the
Prior A ppendixE E ventRecord Q A C crt E vcn t D a tc)

Set

Prior A ppendixE E ventRecord M a\Op Day sP

riorQuarter =

OperatingSuppDataRecordsbyL ocatiott. Op

Value.

else

Set

Prior A ppendixE E ventRecord M a\Op Day sP

riorQuarter = the number of calendar days in
the quarter being checked that are ON OR
AFTER the

Prior A ppendixE E ventRecord Q A C crt E vcn t

Date.

else

Set

Environmental Protection Agency

Page 4 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

PriorAppendixEEventRecordMrnOpDaysPriorQua
rter =

PriorAppendixEEventRecordMinOpDaysPnorQua
rter +

OperatingSuppDataRecordsbyLocation. Op Value.

Set Prior A ppendixE E ventRecord M a \ 0 p D ay s

PriorQuarter =

PriorAppendixEEventRecord.MaxOpDaysPriorQua
rter +

OperatingSuppDataRecordsbyLocation. Op Value.

If i CurrenlAppendixEStatus does NOT begin with "OOC")

if (Rpt Period Op Time Accumulator Array for the Location == -1)

set CurrentAppendixEStatus = "Invalid Op Data"

elseif (PriorAppendixEEventRecord.MmOpDaysPnorQuarter == -1)

set CurrentAppendixEStatus = "Missing Op Data"

else if (PriorAppendixEEventRecord.MinOpDaysPviovQuartQV + Rpt Period Op
Days Accumulator Array for the Location > 30)

Set CurrentAppendixEStatus = "OOC-Event".

else if (PriorAppendixEEventRecord.MaxOpDaysPviovQuartQV + Rpt Period Op
Days Accumulator Array for the Location > 30)

Set CurrentAppendixEStatus = "Undetermined-Event".

else

Set CurrentAppendixEStatus = "IC".

else

Set CurrentAppendixEStatus = "IC".

if (AppEFuelCode is not equal to "MIX")

Locate the earliest record in AppendixETestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the AppENOXESystemID and the TestResultCode is not equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour

if (AppendixETestRecordsIiyLocationForQAStatus is found)

Set SubsequentAppendixERecord = the found record in

Environmental Protection Agency

Page 5 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

AppendixE TestRecordsByL ocationForQAStatus.

Locate the earliest record in AppendixETestRecordsllyLocationForQAStatus for the location
where the SystemID is equal to the AppENOXESystemID and the TestResultCode is equal to
"INVALID" and the EndDate/Hour is on or after the CurrentOperatingDate/Hour and the
EndDate/Hour is before the SubsequentAppendixERecord.EndDate/Hour

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in
AppendixETestRecordsByLocationF orQAStatus.

Locate the earliest record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
AppEFuelCode and the OpTypeCode is equal to "OPHOURS"

If OperatingSuppDataRecordsbyLocation is found)

Set FuelOpSuppDataRecord = the found record in OperatingSuppDataRecordsbyLocation

Set DateFuelFirstCombusted = end date of quarter of the FuelOpSuppDataRecord
.RptPeriodID - int((FuelOpSuppDataRecord .OpValue - l)/24) days

if (If OperatingSuppDataRecordsbyLocation is found AND DateFuelFirstCombusted is more than
180 calendar days before the CurrentOperatingDate/Hour)

Set CurrentAppendixEStatus = "OOC-No Prior Test"

else

Locate the record in the FuelCode lookup table where the FuelCode is equal to
AppEFuelCode

Locate the record in FuelRecordsByHourLocation for the hour and location where the
FuelCode is equal to the FuelCode.UnitFuelCode

if (FuelRecordsByHourLocation is not found OR more than one
FuelRecordsByHourLocation is found)

Set CurrentAppendixEStatus = "Invalid Location Fuel"

else if (FuelRecordsByHourLocationin&icatorCo&Q is equal to "S",

if (SubsequentAppendixERecord.QANQQdsEvdluationFlag = "Y")

Set CurrentAppendixEStatus = "Subsequent Test Not Yet Evaluated".

else if (SubsequentAppendixERecord. TestResultCode = null)

Set CurrentAppendixEStatus = "OOC-Subsequent Test Has Critical Errors".

else

Set CurrentAppendixEStatus = "IC"

Environmental Protection Agency

Page 6 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set PriorAppendixERecord = SubsequentAppendixERecord

else

Set CurrentAppendixEStatus = "OOC-No Prior Test"

else

Set CurrentAppendixE Status = "OOC-No Prior Test"

Locate the earliest record in AppendbcETestRecordsllyLocationForQA Status for the location
where the SystemID is equal to the AppENOXESystemID and the TestResultCode is equal to
"INVALID" and the EndDate/Hour is on or after the CurrentOperatingDate/Hour

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in
AppendixETestRecordsByLocationForQAStatus.

else

Set CurrentAppendixEStatus = "OOC-No Prior Test"
if (CurrentAppendixEStatus begins with "OOC")
if (InvalidAppendixERecord is not null)

Set CurrentAppendixEStatus = CurrentAppendixEStatus &

if (CurrentAppendixEStatus does not begin with "IC")

Return result CurrentAppendixEStatus.

Environmental Protection Agency

Page 7 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

Invalid Location
Fuel

Invalid Monitor
System

Invalid Op Data

Missing Fuel Op
Data

Missing Op Data

OOC-Event

OOC-Event*

OOC-Expired

OOC-Expired*

OOC-No Prior
Test

OOC-No Prior
Test*

OOC-Prior Test
Has Critical
Errors

OOC-Prior Test
Has Critical
Errors*

OOC-Subsequen
t Test Has
Critical Errors
OOC-Subsequen
t Test Has
Critical Errors*
Prior Test Not
Yet Evaluated

Subsequent Test
Not Yet
Evaluated

Response

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because you did not report a single, valid unit fuel record for FuelCode [unitfuel]
that was active during the current hour.

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Monitor System record for the NOXE system has a critical error.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the OperatingTime in at least one Hourly Operating Data records was
missing or invalid.

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Op Supp Data record for OPHOURS for FuelCode [fuel] is missing for
one or more previous reporting periods. If you have submitted emissions data for
prior quarters, you should be able to retrieve these records by logging on to the
EPA host.

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Op Supp Data record for OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for MonitoringSystemID [ID], but you did not
perform a subsequent Appendix E test within the specified timeframe.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for MonitoringSystemID [ID], but you did not
perform a subsequent Appendix E test within the specified timeframe. An invalid
Appendix E test was ignored.

The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
expired.

The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
expired. An invalid prior Appendix E test TestNumber [invtestnum] was ignored.
You did not report a prior Appendix E test for MonitoringSystemID [ID],

You did not report a prior Appendix E test for MonitoringSystemID [ID], An
invalid prior Appendix E test Test Number [invtestnum] was ignored.
The applicable prior Appendix E test TestNumber [testnum] for
MonitoringSystemID [ID] has critical errors.

The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
critical errors. An invalid prior Appendix E test TestNumber [invtestnum] was
ignored.

The subsequent recertification Appendix E test TestNumber [subtestnum] for
MonitoringSystemID [ID] has critical errors.

The subsequent recertification Appendix E test TestNumber [subtestnum] for
MonitoringSystemID [ID] has critical errors. An invalid Appendix E test
TestNumber [invtestnum] was ignored.

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the applicable prior Appendix E test TestNumber [testnum] for the system
has not yet been evaluated.

The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the subsequent certification test TestNumber [subtestnum] for the system
has not yet been evaluated.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 8 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Undetermined-E The software could not determine if the current hour was within the 30-operating
vent	day window required to conduct another Appendix E test following

QACertEventCode [code] QACertEventDate [eventdate] for MonitoringSystemID
[ID].

Critical Error Level 1

Usage:

1

2

3

Process/Category:

Conditions:

Process/Category:

Conditions:

Process/Category:

Conditions:

Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 9 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-2

Check Name:

Locate Most Recent Prior Accuracy Test

Related Former Checks:

Applicability:

Description:

Specifications:

Set CurrentAccuracyStatus = null.

Set PriorAccuracy Record = null.

Set InvalidAccuracyRecord = null.

Set Inappropriate Transmitter Transducer Test to false.

Locate the most recent record in AccuracyTestRecordsByLocationForQAStatus for the location where the ComponentID is equal
to the FuelFlowComponentRecordToCheck.ComponentlD and the TestResult is not equal to "INVALID" and the EndDate/Hour is
prior to the CurrentOperatingDate/Hour

if (AccuracyTestRecordsByLocationForQAStatus is found)

Set Prior Accuracy Record = the found record in Accuracy TestRecordsByLocationForQAStatus.

if (PriorAccuracy Record. TcstTypcC'odc is equal to "FFACCTT" AND
FuelFlowComponentRecordToCheck.SampleAcqmsitionMeihod is not equal to "ORF", "NOZ", or " VEN")

Set Inappropriate Transmitter Transducer Test to true.

Locate the most recent record in AccuracyTestRecordsByLocationForQAStatusfor the location where the ComponentID is
equal to the FuelFlowComponentRecordToCheck Component ID and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour and the EndDate/Hour is greater than the Prior Accuracy Record. EndDate/Hour and the
TestResult is equal to "INVALID".

if (AccuracyTestRecordsByLocationForQAStatus is found)

Set InvalidAccuracyRecord = the found record in AccuracyTestRecordsByLocationForQAStatus.
if (i^i7w4ccMracj7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentAccuracyStatus = "OOC-No Prior Accuracy Test"

Locate the most recent record in AccuracyTestRecordsByLocationForQAStatus for the location where the ComponentID is
equal to the FuelFlowComponentRecordToCheck.Componcn11D and the TestResult is equal to "INVALID" and the
EndDate/Hour is prior to the CurrentOperatingDate/Hour.

if (AccuracyTestRecordsIiyLocationForQAStatus is found)

Set InvalidAccuracyRecord = the found record in AccuracyTestRecordsByLocationForQAStatus.

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 11 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-3

Check Name:

Locate Most Recent Prior Accuracy Event

Related Former Checks:

Applicability:

Description:

Specifications:

Set Prior A ecu racy E ventRecord = null.

If i CurrentA ccuracyStatus is null)

Locate the most recent record in QACertificationEventRecords WHERE

a)	the ComponentID is equal to the FuelFlowComponentRecordToCheck. Component ID AND

b)	FFACCRequired is equal to "Y" AND

c)	the QACertEventDate/Hour is prior to the CurrentOperatingDate/Hour AND

d)	the QACertEventDate/Hour is after the later of the PriorA ecu racy Record EndDatc/Hour and the
Praw4ccwracj7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 13 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-4

Check Name:

Related Former Checks:

Determine Eligibility for Fuel Flow to Load Testing (Accuracy)

Applicability:

Description:

Specifications:

Set FF2LAccuracyEligible = null.
Set FF2LAccuracyCheckDate = null.

if (CurrentAccuracyStatus is null)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemID and the TestResult is equal to "PASSED", "EXC168H", "INPROG", or
"FAILED" and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter
of the later of the Prior A ccuracy Record EndDatc and the i^ioMccwracjTtecon/.ReinstallationDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2 LAccuracyEligible = true.

Set FF2LAccuracyCheckDate = the later of the Prior Accuracy Record. EndDate and the
Praw4ccwracj7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (PEITestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

else

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and
the PEITestRecordsByLocationForQAStatus.EndDate.

else if (PriorAccuracyTestRecord.TcslTypcCodc is equal to "FFACCTT")

Locate the latest record in PEITestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the FuelFlowComponentRecords. ComponentID and the TestResult is
equal to "PASSED" and the quarter is in the same or adjacent quarter of the
Prior A ccuracyRecord. EndD ate.

if (PEITestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

else

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
PEITestRecordsByLocationForQAStatusEndD&tQ.

Results:

Result

Usage:

1

Response Severity
Process/Category: Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 15 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-5

Check Name:

Evaluate Fuel Flow to Load Tests (Accuracy)

Related Former Checks:

Applicability:

Description:

Specifications:

Set FF2LAccuracyBeginYearQuarter = null.

Set FF2LA ccuracyEndYearOuarter = null.

Set InvalidFF2LTestNumber = null.

Set MissingFF2L YearOuarter = null.

if (FF2LAccuracy Eligible == true)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck System ID and the TestResult is equal to "FAILED" and the quarter is prior to the
quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the
Prior A ccuracy Record EndDatc and the Prior A ccuracy Record.Rcm^VcxWcWxonDcW.c.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF 2 LTestRecordsBy Location ForOAStatus.l cskNumbcr
Set CurrentA ecu racy Status = "OOC-Fuel Flow to Load Test Failed",
exit check.

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemlD and the TestResult is NULL and the quarter is prior to the quarter of the
CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the Prior A ccuracy Record EndDatc and
the PriorAccuracyRecordRQmsia[\ai\onDaiQ.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2LTestRecordsByLocationForQAStatus.T estNumber
Set CurrentAccuracyStatus = "OOC-Fuel Flow to Load Test Has Critical Errors",
exit check.

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck System ID and the QANeedsE valuation flag is equal to " Y" and the quarter is prior to
the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the
Prior Accuracy Record. EndDate and the Prior A ccuracy Record R c i n s t a 11 a t i o n D a t c.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2LTestRecordsByLocationForQAStatus.T estNumber
Set CurrentAccuracyStatus = "Fuel Flow to Load Test Has Not Yet Been Evaluated".
exit check.

Locate the earliest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheckSystemlD and the TestResult is equal to "PASSED", "FEW168H", or "EXC168H"
and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later
of the Prior Accuracy Record. EndDate and the Prior Accuracy Record.Rcw^iiMiAxox^iAc.

Environmental Protection Agency

Page 16 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2LAccuracyBeginYearQuarter = FF2LTestRecordsIiyLocationForQA Status Ycar &
FF2LTestRecordsByLocationForQAStatus. Quarter.

else

Set FF2 LAccuracyBeginYear Quarter = null

Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck System ID and the TestResult is equal to "INPROG" and the quarter is prior to the
quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the
Prior A ecu racy Record EndDatc and the Praw4ccwracj7?ecw
FF2LAccuracyBegin YearQuarter)

Set InvalidFF2LTestNumber = FF 2 LTestRecords By Location ForQAStatus.T cslNumbcr
Set CurrentAccuracyStatus = "OOC-Invalid Fuel Flow to Load Test".
exit check.

else if (FF2L TestRecordsIiyLocationForQA Status Year/Quarter is more than 4 quarters after the quarter of the
FF2 LA ccuracyCh eckDate)

Set InvalidFF2LTestNumber = FF2LTestRecordsByLocationForQAStatus.TestNumber
Set CurrentAccuracyStatus = "Undetermined-Baseline Period Expired",
exit check.

Set FF2LAccuracyBeginYearQuarter = the quarter after the quarter of the FF2LAccuracyCheckDate.

Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemlD and the TestResult is equal to "PASSED", "EXC168H", "INPROG", or
"FEW168H", and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the
quarter of the later of the Prior A ccuracy Record EndDatc and the Prior A ecu racy Record R c i n s t a 11 a t i o n D a t c.

Set FF2 LA ccuracy End YearQuarter = FF2L TestRecordsIiyLocationForQA Status Y car &
FF2LTestRecordsByLocationForQAStatus. Quarter.

for each quarter between the FF2LAccuracyBeginYearQuarter and the FF2 LA ecu racy End YearQuarter (inclusive)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to
the FuelFlowComponentRecordToCheck. SystemID and the quarter is equal to the quarter to check.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (FF 2LTestRecords By Location ForQA Status! cslRcsuh = "FEW168H")

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
CurrentFuelFlowRecord.FuclCode and the OpTypeCode is equal to "OPHOURS" or "OSHOURS"

Environmental Protection Agency

Page 17 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

and the quarter is equal to the quarter to check and the OpValue >= 168.

if (OperatingSuppDataRecordsbyLocation is found)

Locate any record in FF2LBaselineRecordsByLocationForQAStatus for the location
where the SystemID is equal to the FuelFlowComponentRecordToCheck.SystemlD, and
the EndDate is within the quarter being checked.

If not found,

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
CurrentFuelFlowRecord.FuelCode and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and the
quarter is equal to the quarter to check and the OpValue >= 168.

if (OperatingSuppDataRecordsbyLocation is found)

Set MissingFF2LYearQuarter equal to the year/quarter to check.

Set CurrentAccuracyStatus = "Undetermined-Missing Fuel Flow to Load Test".

Exit check.

Set InvalidFF2LTestNumber =

FF2LTestRecordsByLocationForQAStatus.TesfNumber

Set CurrentAccuracyStatus = "OOC-Invalid Fuel Flow to Load Test".

Exit check.

else

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 18 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-6

Check Name:

Determine Accuracy Test Expiration Date

Related Former Checks:

Applicability:

Description:

Specifications:

Set AccuracyMissingOpDatalnfo = null,
if (CurrentAccuracyStatus is null)

Set PriorTestExpirationDate = Prior A ccuracy Record T est E \ p i ra ti on D a te.

for each quarter subsequent to the quarter of the later of the PriorAccuracyRecordSadDaXQlUovx and the
Praw4ccwracj7?ecw the last day of the quarter being checked)

Add 1 quarter to the PriorTestExpirationDate.

else

Locate the record in OperatingSuppDataRecordsbyLocation where the OpTypeCode is
equal to "OPHOURS" and the reporting period is equal to the quarter to check and the
FuelCode is equal to CurrentFuelFlowRecord. Fucl Code.

if (OperatingSuppDataRecordsbyLocation is not found)

Locate the record in OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OPHOURS" and the reporting period is equal to the
quarter to check and the FuelCode is null.

if (OperatingSuppDataRecordsbyLocation is not found)

Environmental Protection Agency

Page 19 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set AccuracyMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the
year of the quarter being checked and [QTR] is the number of the quarter
being checked).

else

Add 1 quarter to the PriorTestExpirationDate.
else if (()peratingSuppI)ataRecordsbyLocation Op Va 1 lie <= 168)

Add 1 quarter to the PriorTestExpirationDate.

else

Locate a record in TestExtensionExemptionRecords for the location where the
ComponentID is equal to the FuelFlowComponentRecordToCheck Component ID.
the reporting period is equal to the quarter to check , AND the
ExtensionExemptionCode is equal to "NONQADB".

if (TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

else if (OSO Reporter == true and the quarter to check is the 2nd quarter)

if (FF2LAccuracyEligible == true and the quarter to check is between the

FF2 LAccuracyBeginYear Quarter and the FF 2 LAccuracyEndYearOuarter (inclusive))

Add 1 quarter to the PriorTestExpirationDate.

Locate a record in TestExtensionExemptionRecords for the location where the reporting period is
equal to the quarter to check , AND the ExtensionExemptionCode is equal to "NONQAOS" and the
FuelCode is equal to the GurrentFuelFlowRecord. FuclCodc.

if (TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

else

Locate a record in TestExtensionExemptionRecords for the location where the
ComponentID is equal to the FuelFlowComponentRecordToCheck Component ID. the
reporting period is equal to the quarter to check , AND the ExtensionExemptionCode is equal
to "NONQADB".

if (TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.
else if (OSO Reporter == true and the quarter to check is the 1 st or 4th quarter)

Environmental Protection Agency

Page 20 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (FF2LAccuracyEligible == true and the 2nd quarter following the quarter being checked is between the
FF2LAccuracyBeginYearQuarter and the FF2LAccuracyEndYearQuarter (inclusive))

Add 1 quarter to the PriorTestExpirationDate.

else

Locate a record in TestExtensionExemptionRecords for the location where the reporting period is
equal to the quarter to check , AND the ExtensionExemptionCode is equal to "NONQAOS" and the
FuelCode is equal to the CurrentFuelFlowRecord. FuclCodc.

if (TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

else

Locate a record in TestExtensionExemptionRecords for the location where the
ComponentID is equal to the FuelFlowGomponentRecordToGheck Component ID. the
reporting period is equal to the quarter to check , AND the ExtensionExemptionCode is equal
to "NONQADB".

if (TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

if (CurrentOperatingDate/Hour> PriorTestExpirationDate)

if (AccuracyMissingOpDatalnfo is not null)

Set CurrentAccuracyStatus = "Missing Op Data"

Return result CurrentAccuracyStatus .

else if (FF2LAccuracyEligible == false)

Set CurrentAccuracyStatus = "OOC-Accuracy Test Expired-Fuel Flow To Load Test Ignored".

Return result CurrentAccuracyStatus .

else

Set CurrentAccuracyStatus = "OOC-Accuracy Test Expired"

else

Set CurrentAccuracyStatus = "IC-Extension"

If (CurrentAccuracyStatus does not begin with "IC" and is not null)

if (CurrentAccuracyStatus starts with "OOC" or "Undetermined" AND InvalidAccuracyRecord is not null)
Set CurrentAccuracyStatus = CurrentAccuracyStatus &"*"

Environmental Protection Agency

Page 21 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Return result CurrentAccuracyStatus.
else if i Inapprorpriate Transmitter Transducer Test == true)

Return result "Inappropriate Transmitter Transducer Test" // do NOT set current accuracy status

Environmental Protection Agency

Page 22 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

Accuracy Test
Not Yet
Evaluated
Fuel Flow to
Load Test Has
Not Yet Been
Evaluated
Inappropriate
Transmitter
Transducer Test

Missing Op Data

OOC-Accuracy
Test Aborted
OOC-Accuracy
Test Aborted*
OOC-Accuracy
Test Expired
OOC-Accuracy
Test Expired*
OOC-Accuracy
Test

Expired-Fuel
Flow To Load
Test Ignored
OOC-Accuracy
Test

Expired-Fuel
Flow To Load
Test Ignored*
OOC-Accuracy
Test Failed
OOC-Accuracy
Test Failed*
OOC-Accuracy
Test Has Critical
Errors

OOC-Accuracy
Test Has Critical
Errors*
OOC-Event

OOC-Event*

OOC-Fuel Flow
to Load Test
Failed

Response	Severity

The [testtype] status for [key] could not be determined, because the applicable	Critical Error Level 1

prior [testtype] with TestNumber [testnum] has not yet been evaluated.

The [testtype] status for [key] could not be determined, because a prior	Critical Error Level 1

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [flf21testnum]
has not yet been evaluated.

The prior [testtype] for [key] with TestNumber [testnum] is a transmitter/transducer Critical Error Level 2
test], but this type of test is inappropriate for the SampleAcquisitionMethodCode
for the fuel flowmeter. A transmitter/transducer test can only be performed on a
NOZ, VEN, and ORF fuel flowmeter.

The [testtype] status for [key] could not be determined, because the Op Supp Data	Critical Error Level 1

record for OPHOURS, OSHOURS, or OPDAYS is missing for

[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you

have submitted emissions data for prior quarters, you should be able to retrieve

these records by logging on to the EPA host.

The applicable prior [testtype] for [key] with TestNumber [testnum] was aborted.	Critical Error Level 1

The prior [testtype] for [key] with TestNumber [testnum] was aborted. An invalid	Critical Error Level 1

prior [testtype] with TestNumber [invtestnum] was ignored.

The prior [testtype] for [key] with TestNumber [testnum] has expired.	Critical Error Level 1

The prior [testtype] for [key] with TestNumber [testnum] has expired. An invalid	Critical Error Level 1

prior [testtype] with TestNumber [invtestnum] was ignored.

The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior	Critical Error Level 1

fuel-flow-to-load test for MonitoringSystemID [ID] was ignored.

The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior	Critical Error Level 1

fuel-flow-to-load test for MonitoringSystemID [ID] was ignored. An invalid prior
[testtype] with TestNumber [invtestnum] was also ignored.

The applicable prior [testtype] for [key] with TestNumber [testnum] failed.	Critical Error Level 1

The prior [testtype] for [key] with TestNumber [testnum] failed. An invalid prior	Critical Error Level 1

[testtype] with TestNumber [invtestnum] was ignored.

The applicable prior [testtype] for [key] with TestNumber [testnum] has critical	Critical Error Level 1

errors.

The prior [testtype] for [key] with TestNumber [testnum] has critical errors. An	Critical Error Level 1

invalid prior [testtype] with TestNumber [invtestnum] was ignored.

You reported a QA Certification Event record for QACertEventCode [code]	Critical Error Level 1

QACertEventDate [eventdate] for [key], but you did not perform a subsequent

[testtype].

You reported a QA Certification Event record for QACertEventCode [code]	Critical Error Level 1

QACertEventDate [eventdate] for [key], but you did not perform a subsequent
[testtype]. An invalid [testtype] was ignored.

The [testtype] status for [key] could not be determined, because a prior	Critical Error Level 1

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [flf21testnum]
has failed.

Environmental Protection Agency

Page 23 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-Fuel Flow
to Load Test
F ailed*

OOC-Fuel Flow
to Load Test
Has Critical
Errors

OOC-Fuel Flow
to Load Test
Has Critical
Errors*
OOC-Invalid
Fuel Flow to
Load Test

OOC-Invalid
Fuel Flow to
Load Test*

OOC-No Prior
Accuracy Test
OOC-No Prior
Accuracy Test*
Undetermined-B
aseline Period
Expired

Undetermined-M
issing Fuel Flow
to Load Test

The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]
has failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]
has critical errors.

The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]
has critical errors. An invalid [testtype] with TestNumber [invtestnum] was
ignored.

The [testtype] status for [key] could not be determined, because one or more prior
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you
reported a prior test indicating that baseline data collection was completed; or (2)
the TestResultCode indicates that there were fewer than 168 fuel QA operating
hours in the quarter, yet your emissions data for that quarter indicates otherwise.
The [testtype] status for [key] could not be determined, because one or more prior
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you
reported a prior test indicating that baseline data collection was completed; or (2)
the TestResultCode indicates that there were fewer than 168 fuel QA operating
hours in the quarter, yet your emissions data for that quarter indicates otherwise.
An invalid [testtype] with TestNumber [invtestnum] was ignored.

You did not report a prior [testtype] for [key].

You did not report a valid prior [testtype] for [key]. An invalid [testtype] with
TestNumber [invtestnum] was ignored.

The [testtype] status for [key] could not be determined, because, according to the

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [If21testnum],

baseline data was still being collected after the deadline.

The [testtype] status for [key] could not be determined, because a prior

fuel-flow-to-load test for MonitoringSystemID [ID] was missing for [missingff21].

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 24 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-7

Check Name:

Determine if Component Requires a PEI Test

Related Former Checks:

Applicability:

Description:

Specifications:

Set PEIRequired = false.

if {PriorAccuracy Record is not null and PriorAccuracyRecord.TcslTypcCodc is equal to "FFACCTT")

Set PEIRequired = true.

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 25 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-8

Check Name:

Locate Most Recent Prior PEI Test

Related Former Checks:

Applicability:

Description:

Specifications:

Set CurrentPEIStatus = null.

Set PriorPEIRecord = null.

if {PEIRequired == true)

Locate the most recent record in PEITestRecordsByLocationForQAStatus for the location where the ComponentID is equal
to the FuelFlowComponentRecordToCheck.Componcnl\D and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour

if (PEITestRecordsByLocationForQAStatus is found)

Set PriorPEIRecord = the found record in PEITestRecordsByLocationForQAStatus.

if (Prior PE//?«.-wy/. Q A N cc d s E v a 1 u a t i o n F1 a g = "Y")

Set CurrentPEIStatus = "PEI Test Not Yet Evaluated".
else if (PriorPEIRecord TestResul tCode is null)

Set CurrentPEIStatus = "OOC-PEI Test Has Critical Errors",
else if (PriorPEIRecord T est Resul tC ode = "FAILED")

Set CurrentPEIStatus = "OOC-PEI Test Failed",
else if (PriorPEIRecord T est Resul tC ode = "ABORTED")

Set CurrentPEIStatus = "OOC-PEI Test Aborted".

else

Set CurrentPEIStatus = "OOC-No Prior PEI Test".

if (CurrentPEIStatus is not null)

Return result CurrentPEIStatus.

Environmental Protection Agency

Page 26 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

OOC-No Prior
PEI Test
OOC-PEI Test
Aborted
OOC-PEI Test
Failed

OOC-PEI Test
Has Critical
Errors

PEI Test Not Yet The [testtype] status for [key] could not be determined, because the applicable
Evaluated	prior [testtype] with TestNumber [testnum] has not yet been evaluated.

Usage:

Response

You did not report a prior [testtype] for [key].

The applicable prior [testtype] for [key] with TestNumber [testnum] was aborted.

The applicable prior [testtype] for [key] with TestNumber [testnum] failed.

The applicable prior [testtype] for [key] with TestNumber [testnum] has critical
errors.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

1

Process/Category:

Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 27 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

ADESTAT-9

Check Name:

Locate Most Recent Prior PEI Event

Related Former Checks:

Applicability:

Description:

Specifications:

Set PriorPEIEventRecord = null.

If (PEIRequired == true AND CurrentPEIStatus is null)

Locate the most recent record in QACertificationEventRecords WHERE

a)	the ComponentID is equal to the FuelFlowComponentRecordToCheck. Component ID AND

b)	PEIRequired is equal to " Y" AND

c)	the QACertEventDate/Hour is prior to the CurrentOperatingDate/Hour AND

d)	the QACertEventDate/Hour is after the PriorPEIRecord.EndDate/Hour.

if (QACertificationEventRecords is found)

Set PriorPEIEventRecord = the found record in QACertificationEventRecords.
Set CurrentPEIStatus = "OOC-Event".

else

Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
PriorPEIRecord. EndD ate.

if (CurrentOperatingDate is AFTER the PriorTestExpirationDate)

Set CurrentPEIStatus = "OOC-PEI Test Expired".

else

Set PriorTestExpirationDate = 12 quarters after the end of the quarter of the PriorPEIRecord. EndD ate.
Set PriorPE//?ec««/. T e s t E \ p i r a t i o n D a t e = PriorTestExpirationDate.

If (CurrentOperatingDate is ON OR BEFORE the PriorTestExpirationDate)

Set CurrentPEIStatus = "IC".

If (CurrentPEIStatus starts with "OOC")

Return result CurrentPEIStatus.

Results:

Result
OOC-Event

Response

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [key], but you did not perform a subsequent
[testtype].

The prior [testtype] for [key] with TestNumber [testnum] has expired.

Severity

Critical Error Level 1

OOC-PEI Test
Expired

Critical Error Level 1

Environmental Protection Agency

Page 28 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 29 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Name:

Related Former Checks:

Check Code:

ADESTAT-10

Determine Eligibility for Fuel Flow to Load Testing (PEI)

Applicability:

Description:

Specifications:

Set FF2LPEIEligible = null
Set FF2LPEICheckDate = null.

if (PEIRequired == true AND CurrentPEIStatus is null)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck. System ID and the CalculatedTestResult is equal to "PASSED", "FEW168H",
"EXC168H", "INPROG", or "FAILED" and the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the
Year/Quarter is subsequent to the quarter of the Prior PEI Record E nd D a tc.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2LPEIEligible = true.

Set FF2LPEICheckDate = PriorPEIRecord E nd D a tc.

for each record in FuelFlowComponentRecords

Locate the latest record in AccuracyTestRecordsByLocationForQAStatusfor the location where the
ComponentID is equal to the FuelFlowComponentRecords. ComponentID and the TestResult is equal to
"PASSED" and the Year/Quarter of the later of the EndDate and Reinstallation Date is in the same or
adjacent quarter of the Prior PE I Record EndDate.

if (AccuracyTestRecordsIiyLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
A ecu racy TestRecordsByL ocation For OA Status EndDate and the
A ccuracyTestRecords By Location ForOAStatusRcmsl'dU'dtionDdlc.

if (FuelFlowComponentRecords. ComponentID is not equal to
FuelFlowComponentRecordToCheck.Componcnl\D AND

A ccuracyTestRecordsBy Location ForOA Status! cslTypcCodc is equal to "FFACCTT")

Locate the latest record in PEITestRecordsByLocationForQAStatus for the location where
the ComponentID is equal to the FuelFlowComponentRecords. ComponentID and the
TestResult is equal to "PASSED" and the Year/Quarter is in the same or adjacent quarter of
the PriorPEIRecord.EndDate.

if (PEITestRecordsByLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

else

else

Environmental Protection Agency

Page 30 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
PEITestRecordsByLocationForQA Status. EndD ate.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 31 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Name:

Check Code:

ADESTAT-11

Evaluate Fuel Flow to Load Tests (PEI)

Related Former Checks:

Applicability:

Description:

Specifications:

Set FF2LPEIBeginYearQuarter = null.

Set FF2LPEIEndYearQuarter = null.

if (FF2LPEIEligible == true)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemID and the CalculatedTestResult is equal to "FAILED" and the Year/Quarter
is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the
PriorPEIRecord. EndD ate.

if (FF2/, TestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF 2 LTestRecords By Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "OOC-Fuel Flow to Load Test Failed".

Return result CurrentPEIStatus.

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemlD and the CalculatedTestResult is NULL and the Year/Quarter is prior to the
quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the PriorPEIRecord. EndD ate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2 L TestRecordsByL ocation ForQA Status T c st N urn bcr
Set CurrentPEIStatus = "OOC-Fuel Flow to Load Test Has Critical Errors".

Return result CurrentPEIStatus.

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck S\ slcm\D and the QANeedsEvaluation flag is equal to " Y" and the Year/Quarter is
prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the
PriorPEIRecord. EndD ate.

if (FF2 L TestRecordsByL ocation ForQA Status is found)

Set InvalidFF2LTestNumber = FF 2 LTestRecords By Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "Fuel Flow to Load Test Has Not Yet Been Evaluated".

Return result CurrentPEIStatus.

Locate the earliest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck System ID and the CalculatedTestResult is equal to "PASSED", "FEW168H", or
"EXC168H" and the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to
the quarter of the PriorPEIRecord. EndD ate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Environmental Protection Agency

Page 32 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set FF2LPEIBeginYearQuarter = FF2LTestRecordsIiy Location ForQAStatus Ycar &
FF2L TestRecordsByLocationForQAStatus. Quarter.

else

Set FF2 LPEIBeginYear Quarter = null

Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystsmlT) and the CalculatedTestResult is equal to "INPROG" and the Year/Quarter
is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the
PriorPEIRecord. EndD ate.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (Set FF2LPEIBeginYearQuarter is not null AND FF2I
FF2LPEIBegin YearQuarter)

Set InvalidFF2LTestNumber = FF 2LTestRecordsByLocation ForQA Status.TcslNumbcr
Set CurrentPEIStatus = "OOC-Invalid Fuel Flow to Load Test".

Return result CurrentPEIStatus.

else if (FF2L TestRecordsIiy Location ForQA Status Year/Quarter is more than 4 quarters after the quarter of the
FF2LPEICh eckDate)

Set InvalidFF2LTestNumber = FF 2LTestRecordsByLocation ForQA Status.TcslNumbcr
Set CurrentPEIStatus = "Undetermined-Baseline Period Expired".

Return result CurrentPEIStatus.

Set FF2LPEIBeginYearQuarter to the quarter after the quarter of the FF2LPEICheckDate.

Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck System ID and the CalculatedTestResult is equal to "PASSED", "FEW168H", or
"EXC168H" and the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to
the quarter of the PriorPEIRecord. EndD ate.

Set FF2 L PEIEnd YearQuarter = FF2L TestRecordsIiy Location ForQA Status Y car &

FF2LTestRecordsByLocationForQAStatus. Quarter.

for each quarter between the FF2LPEIBeginYearQuarter and the FF2LPEIEndYearQuarter (inclusive)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to
the FuelFlowComponentRecordToCheck. SystemID and the Year/Quarter is equal to the year/quarter to check.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (FF 2 LTestRecords By Location ForQAStatus.C'ci\cu\'cilcdJ cslRcsuh = "FEW168H")

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
CurrentFuelFlowRecord. FuclC'odc and the OpTypeCode is equal to "OPHOURS" or "OSHOURS"
and the Year/Quarter is equal to the year/quarter to check and the OpValue >= 168.

if (OperatingSuppDataRecordsbyLocation is found)

Environmental Protection Agency

Page 33 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Locate any record in FF2LBaselineRecordsByLocationForQAStatus for the location
where the SystemID is equal to the FuelFlowComponentRecordToCheck. System ID. and
the EndDate is within the quarter being checked.

If not found,

Set InvalidFF2LTestNumber =

FF2LTestRecordsByLocationForQAStatus.TesfNumber
Set CurrentPEIStatus = "OOC-Invalid Fuel Flow to Load Test".

Return result CurrentPEIStatus.

else

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
CurrentFuelFlowRecord.FuelCode and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and the
Year/Quarter is equal to the year/quarter to check and the OpValue >= 168.

if (OperatingSuppDataRecordsbyLocation is found)

Set MissingFF2L YearOuarter equal to the year/quarter to check.

Set CurrentPEIStatus = "Undetermined-Missing Fuel Flow to Load Test".

Return result CurrentPEIStatus.

Results:

Result
Fuel Flow to
Load Test Has
Not Yet Been
Evaluated
OOC-Fuel Flow
to Load Test
Failed

OOC-Fuel Flow
to Load Test
Has Critical
Errors

OOC-Invalid
Fuel Flow to
Load Test

Undetermined-B
aseline Period
Expired

Undetermined-M
issing Fuel Flow
to Load Test

Response

The [testtype] status for [key] could not be determined, because a prior

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]

has not yet been evaluated.

The [testtype] status for [key] could not be determined, because a prior

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]

has failed.

The [testtype] status for [key] could not be determined, because a prior

fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum]

has critical errors.

The [testtype] status for [key] could not be determined, because one or more prior
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you
reported a prior test indicating that baseline data collection was completed; or (2)
the TestResultCode indicates that there were fewer than 168 fuel QA operating
hours in the quarter, yet your emissions data for that quarter indicates otherwise.
The [testtype] status for [key] could not be determined, because, according to the
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum],
baseline data was still being collected after the deadline.

The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] was missing for [missingff21].

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 34 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	ADESTAT-12

Check Name:	Determine PEI Test Expiration Date

Related Former Checks:

Applicability:

Description:

Specifications:

Set PEIMissingOpDatalnfo = null.

if (PEIRequired == true AND CurrentPEIStatus is null)

Set PriorTestExpirationDate = PriorPEIRecord TcstExpirationDatc.

for each quarter subsequent to the quarter of the Prior PEI Record E n d D a t c and prior to the quarter of the
CurrentOperatingDate

Set OSO Reporter to false.

Locate a LocationReportingFrequency record for the test location where ReportingFrequencyCode = "OS", the
BeginQuarter is on or before the quarter being checked, and the EndQuarter is null or is on or after the quarter being
checked.

If found,

Set OSO Reporter to true.

if (OSO Reporter == false or the quarter to check is the 3rd quarter)

if (FF 2 L PE IE ligib le == true and the quarter to check is between the FF2LPEIBeginYearQuarter and the
FF2LPEIEndYearQuarter (inclusive))

Add 1 quarter to the PriorTestExpirationDate.

else if (OSO Reporter == true and the quarter to check is the 2nd quarter)

if (FF 2 L PE IE ligib le == true and the quarter to check is between the FF2LPEIBeginYearQuarter and the
FF2LPEIEndYearQuarter (inclusive))

Add 3 quarters to the PriorTestExpirationDate.

if (CurrentOperatingDate > PriorTestExpirationDate)

if (PEIMissingOpDatalnfo is not null)

Set CurrentPEIStatus = "Missing Op Data"

else if (FF2LPEIEligible == false)

Set CurrentPEIStatus = "OOC-PEI Test Expired-Fuel Flow To Load Test Ignored"

else

Environmental Protection Agency

Page 35 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentPEIStatus = "OOC-PEI Test Expired"
Return result CurrentPEIStatus.

else

Set CurrentPEIStatus = "IC-Extension"

Results:

Result

Missing Op Data

OOC-PEI Test
Expired
OOC-PEI Test
Expired-Fuel
Flow To Load
Test Ignored

Usage:

1

Response

The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

The prior [testtype] for [key] with TestNumber [testnum] has expired.

The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior
fuel-flow-to-load test for MonitoringSystemID [ID] was ignored.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 36 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	ADESTAT-13

Check Name:	Determine System Appendix D Status

Related Former Checks:

Applicability:

Description:

Specifications:

if (CurrentAppendixDStatus == "OOC-Multiple Reasons" OR (CurrentAppendixDStatus starts with "OOC" and
CurrentAccuracyStatus starts with "OOC" and CurrentAppendixDStatus <> CurrentAccuracyStatus11

Set CurrentAppendixDStatus = "OOC-Multiple Reasons"

else if (CurrentAppendixDStatus starts with "OOC")

--do nothing

else if i CurrentA ccuracyStatus starts with "OOC")

Set CurrentAppendixDStatus = CurrentAccuracyStatus.

else if ((CurrentAppendixDStatus is not null and does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does
not end with "Not Yet Evaluated") and (CurrentAccuracyStatus does not start with "IC" or "Undetermined" and
CurrentAccuracyStatus does not end with "Not Yet Evaluated") and CurrentAppendixDStatus <> CurrentAccuracyStatus)

Set CurrentAppendixDStatus = "Invalid Data".

else if (CurrentAppendixDStatus does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does not end with
"Not Yet Evaluated" AND CurrentAppendixDStatus is not null)

-- do nothing

else if (CurrentAccuracyStatus does not start with "IC" or "Undetermined" and CurrentAccuracyStatus does not end with "Not
Yet Evaluated")

Set CurrentAppendixDStatus = CurrentAccuracyStatus.

else if (CurrentAppendixDStatus ends with "Not Yet Evaluated" or CurrentAccuracyStatus ends with "Not Yet Evaluated")

Set CurrentAppendixDStatus = "Test Not Yet Evaluated"

else if (CurrentAppendixDStatus starts with "Undetermined" or CurrentAccuracyStatus starts with "Undetermined")

Set CurrentAppendixDStatus = "Undetermined"

else if (CurrentAppendixDStatus == "IC-Extension" or CurrentAccuracyStatus == "IC-Extension")

Set CurrentAppendixDStatus = "IC-Extension"

else

Set CurrentAppendixDStatus = "IC"

Environmental Protection Agency

Page 37 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (PEIRequired == true)

if (CurrentAppendixDStatus == "OOC-Multiple Reasons" OR (CurrentAppendixDStatus starts with "OOC" and
CurrentPEIStatus starts with "OOC" and CurrentAppendixDStatus CurrentPEIStatus) i

Set CurrentAppendixDStatus = "OOC-Multiple Reasons"

else if (CurrentAppendixDStatus starts with "OOC")

-- do nothing

else if (CurrentPEIStatus starts with "OOC")

Set CurrentAppendixDStatus = CurrentPEIStatus.

else if ((CurrentAppendixDStatus is not null and does not start with "IC" or "Undetermined" and
CurrentAppendixDStatus does not end with "Not Yet Evaluated") and (CurrentPEIStatus does not start with "IC" or
"Undetermined" and CurrentPEIStatus does not end with "Not Yet Evaluated") and CurrentAppendixDStatus <>
CurrentPEIStatus)

Set CurrentAppendixDStatus = "Invalid Data".

else if (CurrentAppendixDStatus does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does not end
with "Not Yet Evaluated" AND CurrentAppendixDStatus is not null)

-- do nothing

else if (CurrentPEIStatus does not start with "IC" or "Undetermined" and CurrentPEIStatus does not end with "Not Yet
Evaluated")

Set CurrentAppendixDStatus = CurrentPEIStatus.
else if (CurrentAppendixDStatus ends with "Not Yet Evaluated" or CurrentPEIStatus ends with "Not Yet Evaluated")

Set CurrentAppendixDStatus = "Test Not Yet Evaluated"
else if (CurrentAppendixDStatus starts with "Undetermined" or CurrentPEIStatus starts with "Undetermined")

Set CurrentAppendixDStatus = "Undetermined"
else if (CurrentAppendixDStatus == "IC-Extension" or CurrentPEIStatus == "IC-Extension")
Set CurrentAppendixDStatus = "IC-Extension"

else

Set CurrentAppendixDStatus = "IC

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 38 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Daily Calibration Status

Environmental Protection Agency

Page 39 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DCSTAT-1

Check Name:	Locate Most Recent Prior Daily Calibration Test

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set PriorDailyCalRecord = null.

Set InvalidDaifyCalRecord = null.

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to " Y" AND

c)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DailyCalTestRecordsByLocationForQAStatus is found)

Set PriorDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	the ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "N" AND

c)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

if (DailyCalTestRecordsByLocationForQAStatus is found AND EndDate/Hour/Min is greater than the
PriorDailyCalRecord EndDatc/Hour/M i n)

Set InvalidDaifyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

else

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	the ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "N" AND

c)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DaifyCalTestRecordsByLocationForQAStatus is found)

Set InvalidDaifyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

Results:

Result	Response	Severity

Environmental Protection Agency

Page 40 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

C02 Daily Calibration Status Evaluation
FLOW Daily Calibration Status Evaluation
NOX Daily Calibration Status Evaluation
02 Dry Daily Calibration Status Evaluation
02 Wet Daily Calibration Status Evaluation
S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 41 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DCSTAT-2

Check Name:	Locate Most Recent Prior Event

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set PriorDailyCalEventRecord = null.

Set CurrentDailyCalStatus = null.

Locate the most recent record in QACertificationEventRecords where:

a)	the ComponentID is equal to the ApplicableComponentID AND

b)	the QACertEventDate/Hour is on or prior to the CurrentMHVRecord.Date/Hour AND

AND either

a)	PriorDailyCalRecord is null AND the QACertEventDate/Hour is in the CurrentReportingPeriod OR

b)	QACertEventDate/Hour is after the PriorDailyCalRecord EndDatc/Hour

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode o 20, 25, 26, 30, or 172 and CurrentAnalyzerRangeUsed = "H" OR

d)	QACertEventCode <> 35 or 171 and CurrentAnalyzerRangeUsed = "L"

if (QACertificationEventRecords is found)

Set PriorDailyCalEventRecord = the found record in QACertificationEventRecords

If (PriorDailyCalEventRecord is null)

if (PriorDailyCalRecord is null)

if (the number of clock hours between the First Day of Operation/First Hour of Operation and the
CurrentMHVRecord.Date/Hour is less than 25)

Set CurrentDailyCalStatus = "IC-Undetermined".

else

Locate the latest record in HourlyOpData where the Date/Hour is ON OR PRIOR to the 24th clock hour
following the First Day of Operation/First Hour of Operation and OpTime is equal to zero.

if (HourlyOpData is found)

Locate the first record in HourlyOpData where the Date/Hour is after the Date/Hour in the
HourlyOpData record found above and ON OR PRIOR to the CurentMH VRecord Date/Hour and
the OpTime is greater than zero.

if (not found OR the number of clock hours between HourlyOpData.Date/Hour and the
CurrentMHVRecord Date/Hour is less than 8)

Environmental Protection Agency

Page 42 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentDailyCalStatus = "IC-Undetermined".

else

Set CurrentDailyCalStatus = "OOC-No Prior Test".

else

Set CurrentDailyCalStatus = "OOC-No Prior Test".

else

if (PriorDailyCalRecord .TestResultCode = null)

Set CurrentDailyCalStatus = "OOC-Test Has Critical Errors",
else if (PriorDailyCalRecord .TestResultCode = "FAILED")

Set CurrentDailyCalStatus = "OOC-Test Failed",
else if (PriorDailyCalRecord .TestResultCode = "ABORTED")

Set CurrentDailyCalStatus = "OOC-Test Aborted".

else

Set CurrentDailyCalStatus = "OOC-Event".

if (InvalidDailyCalRecord is not null and InvalidDailyCalRecord.EndDate/Hour is BEFORE the
PriorDailyCalEventRecord.Q ACcrlE\cnlD'dlc/Hour)

Set InvalidDailyCalRecord = null.

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions

Data Evaluation Report	

	C02 Daily Calibration Status Evaluation

2

Process/Category:

Emissions

Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

3

Process/Category:

Emissions

Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

4

Process/Category:

Emissions

Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

5

Process/Category:

Emissions

Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

6

Process/Category:

Emissions

Data Evaluation Report	

	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 43 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DCSTAT-3

Check Name:	Determine Test Expiration Date for Most Recent Prior Daily Calibration Test

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set OnlineDailyCalRecord to null.

if (CurrentDailyCalStatus is null)

if (Prior DailyCalRecord Onl inc Indicator == 1)

if (the number of clock hours between the Prior DailyCalRecord Date/Hour and the CurrentMH VRecord Date/Hour
is less than 26)

Set CurrentDailyCalStatus = "IC".

else

Locate the latest record in HourlyOpData where OpTime is equal to zero and the number of clock hours
between the Date/Hour and the Prior DailyCalRecord D a tc/H o ur is less than or equal to 26.

if {HourlyOpData is found)

Locate the earliest record in HourlyOpData where the Date/Hour is after the Date/Hour in the
HourlyOpData record found above and OpTime is greater than zero.

if (the number of clock hours between the HourlyOpData.Date/Hour and the
CurrentMHVRecord.Date/Hour is greater than or equal to 8)

Set CurrentDailyCalStatus = "OOC-Expired".

else

Set CurrentDailyCalStatus = "IC-Grace".

else

Set CurrentDailyCalStatus = "OOC-Expired".

else

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the ApplicableComponentlD AND

b)	ValidFlag is equal to " Y" AND

c)	the Onlinelndicator = 1 AND

d)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DailyCalTestRecordsByLocationForQAStatus is found

Environmental Protection Agency

Page 44 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set OnlineDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.
if (InvalidDailyCalRecord is null)

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	the ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "N" AND

c)	the Onlinelndicator = 1 AND

d)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

if (DailyCalTestRecordsByLocationForQAStatus is found AND the EndDate/Hour is after the
OnlineDailyCalRecord.EndDatefHoxxr AND the EndDate/Hour is equal to or prior to the
PriorDailyCalRecord. D ate/Hour)

set InvalidDailyCalRecord = the found record in
Daily CalTestRecordsByLocationForQAStatus.

if (OnlineDailyCalRecord .TestResultCode = null)

Set CurrentDailyCalStatus = "OOC-Prior Online Test Has Critical Errors".

else if (OnlineDailyCalRecord .TestResultCode = "FAILED")

Set CurrentDailyCalStatus = "OOC-Prior Online Test Failed".

else if (OnlineDailyCalRecord.TestResultCode = "ABORTED")

Set CurrentDailyCalStatus = "OOC-Prior Online Test Aborted".

else if (the number of OPERATING hours between the OnlineDailyCalRecord Date/Hour and the
CurrentMHVRecord.Date/Hour is less than 26 AND the number of clock hours between the
PriorDailyCalRecordDatelWom and the CurrentMHVRecord.Date/Hour is less than 26)

Set CurrentDailyCalStatus = "IC".

else

if (the number of clock hours between the OnlineDailyCalRecord.Date/Hour and the
CurrentMHVRecord.Date/Hour is less than 26)

Set CurrentDailyCalStatus = "IC".

else

Locate the latest record in HourlyOpData where OpTime is equal to zero and the number of
clock hours between the Date/Hour and the OnlineDailyCalRecord Date/Hour is less than
or equal to 26.

if (HourlyOpData is found)

Locate the earliest record in HourlyOpData where the Date/Hour is after the

Environmental Protection Agency

Page 45 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Date/Hour in the HourlyOpData record found above and OpTime is greater than
zero.

if (the number of clock hours between the HourlyOpData.Date/Hour and the
CurrentMHVRecord.Date/Hour is greater than or equal to 8)

Set CurrentDailyCalStatus = "OOC-Expired".

else

Set CurrentDailyCalStatus = "IC-Grace".

else

Set CurrentDailyCalStatus = "OOC-Expired".

else

if (Rpt Period Op Hour Accumulator Array for the location is less than 26)

Set CurrentDailyCalStatus = "IC-Undetermined".

else

Set CurrentDailyCalStatus = "OOC-Expired".

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Calibration Status Evaluation

2	Process/Category: Emissions Data Evaluation Report	FLOW Daily Calibration Status Evaluation

3	Process/Category: Emissions Data Evaluation Report	NOX Daily Calibration Status Evaluation

4	Process/Category: Emissions Data Evaluation Report	02 Dry Daily Calibration Status Evaluation

5	Process/Category: Emissions Data Evaluation Report	02 Wet Daily Calibration Status Evaluation

6	Process/Category: Emissions Data Evaluation Report	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 46 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DCSTAT-4

Check Name:	Determine Final Daily Calibration Status

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set AlternateDailyCalRecord = null.

if (CurrentDailyCalStatus begins with "OOC")

if (In villi ill) aUyCalReconl is not null)

Set CurrentDailyCalStatus = CurrentDailyCalStatus &

Return result CurrentDailyCalStatus.

else if (DualRangeStatus = true and CurrentDailyCalStatus begins with "IC")

if (CurrentAnalyzerRangeUsed = "H")

Set AlternateAnalyzerRange = "L".

Set AlternateComponentlD = LowRangeComponentlD.

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentlD = HighRangeComponentlD.

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the AlternateComponentlD AND

b)	ValidFlag = "Y" AND

c)	SpanScaleCode is equal to the AlternateAnalyzerRange
if (DailyCalTestRecordsByLocationForQAStatus is found)

Set AlternateDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.
if (.AlternateDailyCalRecord is not null)

if (AIternuteDuilyCulRecoril TcstRcsultC'odc = null)

Set CurrentDailyCalStatus = "OOC-Alternate Range Test Has Critical Errors",
else if (AIternuteDuilyCulRecoril.TcstRcsultC'odc = "FAILED")

Set CurrentDailyCalStatus = "OOC-Alternate Range Test Failed",
else if (AIternuteDuilyCulRecoril TcstRcsultC'odc = "ABORTED")

Set CurrentDailyCalStatus = "OOC-Alternate Range Test Aborted".

Environmental Protection Agency

Page 47 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Locate the latest record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the AlternateComponentID AND

b)	the SpanScaleCode is equal to the AlternateAnalyzerRange

c)	the TestResultCode is equal to "FAILED" or "ABORTED"

if (DailyCalTestRecordsByLocationForQAStatus is found AND (either the PriorDailyCalRecord is null
or EndDate/Hour/Minute is after the PriorDailyCalRecord.'Ex\ADiAdY{ouxlM\x\i&c))

Set CurrentDailyCalStatus = "OOC-No Passing Test After Alternate Range Failed Test".

(Report this status in the Evaluation Report under the Prior Daily CalRecord.1 cs,\D'A[dY\ovir.)

Else

Locate the latest record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the ApplicableComponentID AND

b)	the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

c)	the TestResultCode is equal to "FAILED" or "ABORTED"

if (Daily CalTestRecordsByLocationForQAStatus is found AND EndD ate/Hour/Minute is after the
A IternateDailyCalRecord. EndDatc/Hour/M i nlite)

Set CurrentDailyCalStatus = "OOC-No Passing Alternate Range Test After Failed Test".
(Report this status in the Evaluation Report under the
PriorDailyCalRecord. T estD ate/Hour.)

if (CurrentDailyCalStatus begins with "OOC")

if (InvalidDailyCalRecord is not null)

Set CurrentDailyCalStatus = CurrentDailyCalStatus &

Locate the record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the AlternateComponentID AND

b)	ValidFlag is equal to "N" AND

c)	the SpanScaleCode is equal to the AlternateAnalyzerRange

if (DailyCalTestRecordsByLocationFor(QA Status is found AND the EndDate/Hour is after the
AlternateDailyCalRecord.EndDatQ/Hour)

Set InvalidDailyCalRecord = the found record in

DailyCalTestRecordsByLocationForQAStatus.

Set CurrentDailyCalStatus = CurrentDailyCalStatus &

Return result CurrentDailyCalStatus .

Environmental Protection Agency

Page 48 of 703


-------
Draft ECMPS Emissions Check Specifications

elseif (CurrentDailyCalStatus does not begin with "IC")
Return result CurrentDailyCalStatus .

3/7/2012 12:00:00AM

Environmental Protection Agency

Page 49 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

OOC-Alternate
Range Test
Aborted
OOC-Alternate
Range Test
Aborted*
OOC-Alternate
Range Test
Failed

OOC-Alternate
Range Test
Failed*

OOC-Alternate
Range Test Has
Critical Errors
OOC-Alternate
Range Test Has
Critical Errors*
OOC-Event

OOC-Event*

OOC-Expired
OOC-Expired*

OOC-No Passing
Alternate Range
Test After Failed
Test

OOC-No Passing
Alternate Range
Test After Failed
Test*

OOC-No Passing
Test After
Alternate Range
Failed Test

OOC-No Passing
Test After
Alternate Range
Failed Test*

OOC-No Prior
Test

Response	Severity

The prior daily calibration test for the alternate range [altscale] of [compkey], which Critical Error Level 1

was completed on [altdate], was aborted.

The prior daily calibration test for the alternate range [altscale] of [compkey], which Critical Error Level 1
was completed on [altdate], was aborted. An invalid daily calibration test
completed on [invdate] was ignored.

The prior daily calibration test for the alternate range [altscale] of [compkey], which Critical Error Level 1
was completed on [altdate], failed.

The prior daily calibration test for the alternate range [altscale] of [compkey], which Critical Error Level 1
was completed on [altdate], failed. An invalid daily calibration test completed on
[invdate] was ignored.

The prior daily calibration test for the alternate range [altscale] of [compkey], which Critical Error Level 1
was completed on [altdate], has critical errors.

The prior daily calibration test for the alternate range [altscale] of [compkey], which
was completed on [altdate], has critical errors. An invalid daily calibration test
completed on [invdate] was ignored.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [compkey], but you did not perform a
subsequent daily calibration test.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [compkey], but you did not perform a
subsequent daily calibration test. An invalid daily calibration test completed on
[invdate] was ignored.

The prior daily calibration test for [compkey] completed on [date] has expired.
The prior daily calibration test for [compkey] completed on [date] has expired. An
invalid daily calibration test completed on [invdate] was ignored.

The prior daily calibration test for [compkey] was completed on [date], however a
subsequent passing test on [altscale] has not been completed. When a daily
calibration test is failed for a dual-range analyzer, you must complete a passing
daily calibration test on both ranges before the monitor is considered to be
in-control. An invalid daily calibration test completed on [invdate] was ignored.
The prior daily calibration test for [compkey] was completed on [date], however a
subsequent passing test on [altscale] has not been completed. When a daily
calibration test is failed for a dual-range analyzer, you must complete a passing
daily calibration test on both ranges before the monitor is considered to be
in-control. An invalid daily calibration test completed on [invdate] was ignored.
The prior daily calibration test for [compkey] was completed on [date], which is
prior to a failed or aborted test for the alternate range [altscale]. When a daily
calibration test is failed for a dual-range analyzer, you must complete a passing
daily calibration test on both ranges before the monitor is considered to be
in-control.

The prior daily calibration test for [compkey] was completed on [date], which is
prior to a failed or aborted test for the alternate range [altscale]. When a daily
calibration test is failed for a dual-range analyzer, you must complete a passing
daily calibration test on both ranges before the monitor is considered to be
in-control. An invalid daily calibration test completed on [invdate] was ignored.
You did not report a prior daily calibration test for [compkey] during the reporting
period. Any daily calibration test that may have been completed in a prior
reporting period has expired.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 50 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-No Prior
Test*

OOC-No

Probationary

Calibration Test

OOC-No

Probationary

Calibration

Test*

OOC-Prior

Online Test

Aborted

OOC-Prior

Online Test

Aborted*

OOC-Prior

Online Test

Expired

OOC-Prior

Online Test

Expired*

OOC-Prior

Online Test

Failed

OOC-Prior

Online Test

Failed*

OOC-Prior

Online Test Has

Critical Errors

OOC-Prior

Online Test Has

Critical Errors*

OOC-Test

Aborted

OOC-Test

Aborted*

OOC-Test Failed

OOC-Test

Failed*

OOC-Test Has

Critical Errors

OOC-Test Has

Critical Errors*

You did not report a prior daily calibration test for [compkey] during the reporting
period. Any daily calibration test that may have been completed in a prior
reporting period has expired. An invalid daily calibration test completed on
[invdate] was ignored.

This check result is obsolete.

Critical Error Level 1

No Errors

This check result is obsolete.

No Errors

The prior online daily calibration test for [compkey] completed on [ondate] was
aborted.

Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] was
aborted. An invalid daily calibration test completed on [invdate] was ignored.

Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] has
expired.

Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] has
expired. An invalid daily calibration test completed on [invdate] was ignored.

Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] failed.

Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] failed.	Critical Error Level 1

An invalid daily calibration test completed on [invdate] was ignored.

The prior online daily calibration test for [compkey] completed on [ondate] has	Critical Error Level 1

critical errors.

The prior online daily calibration test for [compkey] completed on [ondate] has	Critical Error Level 1

critical errors. An invalid daily calibration test completed on [invdate] was ignored.

The prior daily calibration test for [compkey] completed on [date] was aborted.	Critical Error Level 1

The prior daily calibration test for [compkey] completed on [date] was aborted. An	Critical Error Level 1
invalid daily calibration test completed on [invdate] was ignored.

The prior daily calibration test for [compkey] completed on [date] failed.	Critical Error Level 1

The prior daily calibration test for [compkey] completed on [date] failed. An invalid	Critical Error Level 1
daily calibration test completed on [invdate] was ignored.

The prior daily calibration test for [compkey] completed on [date] has critical errors.	Critical Error Level 1

The prior daily calibration test for [compkey] completed on [date] has critical errors. Critical Error Level 1
An invalid daily calibration test completed on [invdate] was ignored.

Environmental Protection Agency

Page 51 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

C02 Daily Calibration Status Evaluation
FLOW Daily Calibration Status Evaluation
NOX Daily Calibration Status Evaluation
02 Dry Daily Calibration Status Evaluation
02 Wet Daily Calibration Status Evaluation
S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 52 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Daily Calibration Test

Environmental Protection Agency

Page 53 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the daily calibration test:

Set Daily Cal Calc Result to null.

Set Daily Cal Fail Date and Daily Cal Fail Hour to null.

If the ComponentID is null,

set Daily Cal Component Type Valid to false, and return result A.

Otherwise,

If the ComponentTypeCode of the associated component is equal to "S02", "NOX", "C02", "02", or "FLOW",
set Daily Cal Component Type Valid to true.

Otherwise,

set Daily Cal Component Type Valid to false, and return result B.

If component is invalid, do not perform injection-based checks. Set the calculated values to null.

DAYCAL-1

Daily Calibration Test Component Type Check
CEM Check

Results:

Result	Response	Severity

A	You did not provide [fieldname], which is required, for [key].	Fatal

B	The ComponentTypeCode in the monitoring plan is [comptype]. This type of	Critical Error Level 1

component does not require a calibration test. Only component types 'S02',

'NOX', 'C02', '02', or 'FLOW' may have a daily calibration test.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 54 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-2

Check Name:	Aborted and Incomplete Daily Calibration Test Check

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test:

Set Evaluate Upscale Injection AND Evaluate Zero Injection to false.

If Daily Cal Component Type Valid is equal to true,

If the TestResultCode is equal to "ABORTED",

set Daily Cal Calc Result to "ABORTED", and return result A.

If the TestResultCode is equal to "INC",

set Daily Cal Calc Result to "INC".

If ZeroInjectionDate, ZeroInjectionHour, and ZeroMeasuredValue are not null,
set Evaluate Zero Injection to true.

If UpscalelnjectionDate, UpscalelnjectionHour, and UpscaleMeasuredValue are not null,
set Evaluate Upscale Injection to true.

Otherwise,

set Evaluate Upscale Injection AND Evaluate Zero Injection to true.

Results:

Result	Response	Severity

A	The TestResultCode indicates that the [type] test for [key] was aborted. If the test	Informational Message

was aborted for a reason not related to monitor performance, you should not report
the test.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 55 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-3

Check Name:	Online Offline Indicator Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For a daily calibration test:

Set Daily Cal Calc Online Ind to null.

If ZeroOpTime is equal to 0 OR UpscaleOpTime is equal to 0
set Daily Cal Calc Online Ind to 0

else if ZeroOpTime is equal to 1 AND UpscaleOpTime is equal to 1
set Daily Cal Calc Online Ind to 1

else

set Daily Cal Calc Online Ind to the OnlineOfflinelndicator.

If (OnlineOfflinelndicator is null)
return result A.

else

If (Daily Cal Calc Online Ind is equal to 0)

If (OnlineOfflinelndicator is equal to 1)
return result B.

else

Locate the latest OOC Test Record for the location where the ComponentID and SpanScaleCode is
equal to the ComponentID and SpanScaleCode in the current test and the EndDate/Hour is prior to
the Date/Hour of the current test.

If not found,

Set Ignored Daily Calibration Tests to true.

If {Daily Cal Calc Result <> "INVALID")

set Daily Cal Calc Result to "IGNORED"

Otherwise,

Locate an OA Certification Event Record for the location where the ComponentID is equal
to the ComponentID in the current test AND OOCRequired == "Y" AND the
EventDate/Hour is after the EndDate/Hour of the retrieved OOC test AND the
EventDate/Hour is on or before the EndDate/Hour of the current test AND EITHER

a)	SpanScaleCode in the current test is null OR

b)	SpanScaleCode in the current test == "H" and QACertEventCode o 20, 25, 26, 30, or 172
OR

c)	SpanScaleCode in the current test == "L" and QACertEventCode o 35 or 171
If found,

Environmental Protection Agency

Page 56 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result D.

Results:

Result

A

B

C
D

Response

You did not provide [fieldname], which is required, for [key].
The OnlineOfflinelndicator in the daily calibration test indicates that the test was
performed on-line, but OperatingTime in the Hourly Operating Data record is 0.
This check result is obsolete.

The test was peformed while the unit was not operating, but this is not valid,
because you reported an QA Certification Event record indicating that you needed
to perform an online-offline calibration demonstration allowing you to conduct
off-line daily calibration tests. However, you have not reported an online-offline
calibration demonstration subsequent to the EventDate and EventHour in the QA
Certification Event record.

Severity

Critical Error Level 1
Critical Error Level 1

No Errors

Critical Error Level 2

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 57 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-4

Check Name:

Test Span Scale Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For a daily calibration test with a valid component:

Set Daily Cal Span Scale Valid to true.

If the ComponentTypeCode of the associated component is not equal to "FLOW",

If the SpanScaleCode is null,

set Daily Cal Span Scale Valid to false, and return result A.

If the SpanScaleCode is not equal to "H" or "L",

set Daily Cal Span Scale Valid to false, and return result B.

If the EM Test Date Valid AND EM Test Hour Valid are true,

If the SpanScaleCode is equal to "H"

Locate an Analyzer Range record for the component where the AnalyzerRangeCode is equal to "L",
the BeginDate and BeginHour is on or before the Date and Hour in the current test, and the EndDate
is null or the EndDate and EndHour is on or after the Date and Hour of the current test.

If found,

set Daily Cal Span Scale Valid to false, and return result C.

If the SpanScaleCode is equal to "L"

Locate an Analyzer Range record for the component where the AnalyzerRangeCode is equal to "H",
the BeginDate and BeginHour is on or before the Date and Hour of the current test, and the EndDate
is null or the EndDate and EndHour is on or after the Date and Hour of the current test.

If found,

set Daily Cal Span Scale Valid to false, and return result C.

Otherwise,

If the SpanScaleCode is not null,

set Daily Cal Span Scale Valid to false, and return result D.

Environmental Protection Agency

Page 58 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

C
D

Response

You did not provide [fieldname], which is required, for [key].

You reported the value [value], which is not in the list of valid values, in the field

[fieldname] for [key].

The active analyzer range for the component is inconsistent with the span scale
[value] reported for the [type] test for [key].

You reported a SpanScaleCode in the [type] test for [key], but this is not
appropriate for flow component.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 59 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-5

Check Name:	Determine Span Value

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For a daily calibration test:

Set Daily Cal Span Value to null.

If EM Test Date Valid, EM Test Hour Valid, and Daily Cal Span Scale Value are all true,

Locate the System Component records for the associated component with the earliest Begin Date.

If found,

If the BeginDate in the retrieved record is not null, the BeginHour in the retrieved record is between 0 and 23,
and the BeginDate and BeginHour is later than the Date and Hour of the test.

Locate a Span Record for the location where the ComponentTypeCode equal to the
ComponentTypeCode of the associated component, the SpanScaleCode is equal to the
SpanScaleCode in the test, the Span Value is greater than 0, the BeginDate and BeginHour is on or
before the BeginDate and BeginHour of the retrieved record, and the EndDate is null or the EndDate
and EndHour is after the BeginDate and BeginHour of the retrieved record.

Otherwise,

Locate a Span Record for the location where the ComponentTypeCode equal to the
ComponentTypeCode of the associated component, the SpanScaleCode is equal to the
SpanScaleCode in the test, the Span Value is greater than 0, the BeginDate and BeginHour is on or
before the Date and Hour of the test, and the EndDate is null or the EndDate and EndHour is after
the Date and Hour of the test.

If not found,

return result A.

If more than one record is found,
return result B.

If one record is found,

set Daily Cal Span Value to the SpanValue in the retrieved span record.

else

return result C.

Environmental Protection Agency

Page 60 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

Response

You have not reported a valid monitoring plan span record that was active during
the test for [key].

You reported more than one monitoring plan span record that was active during the
test for [key].

The component reported for [key] is not part of any monitoring system.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 61 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-6

Check Name:

Daily Calibration Test Upscale Gas Level Code Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If the UpscaleGasCode is null,

set Daily Cal Upscale Gas Level Valid to false, and return result A.

If the UpscaleGasCode is not equal to "MID" or "HIGH",

set Daily Cal Upscale Gas Level Valid to false, and return result B.

If the ComponentTypeCode of the associated component is equal to "FLOW", and the UpscaleGasLevelCode is equal to
"MID",

set Daily Cal Upscale Gas Level Valid to false, and return result C.

Otherwise,

set Daily Cal Upscale Gas Level Valid to true.

Results:

Result

A

B

Response

You did not provide [fieldname], which is required, for [key].

You reported the value [value], which is not in the list of valid values, in the field

[fieldname] for [key].

You have reported a value of "MID" as the UpscaleGasCode. This value is not
appropriate for flow components.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 62 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-7

Check Name:	Reference Values Consistent with Calibration Gas Levels

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale and zero injection:

If ZeroReferenceValue greater than or equal to 0, UpscaleReferenceValue greater than 0, AND ZeroReferenceValue is greater
than or equal to UpscaleReferenceValue,

set Daily Cal Calc Result to "INVALID", and return result A.

Results:

Result	Response	Severity

A	The reference value is not consistent with the reported calibration gas levels in the	Critical Error Level 1

daily calibration test for [key]. The reference values of zero-level gas injection or
reference signals must be less than that of the upscale gas injection.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 63 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-8

Check Name:	Zero Measured Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with a zero injection:

If ZeroMeasuredValue is null,
return result A.

Results:

Severity

required, for [key].	Critical Error Level 1

Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is
Usage:

1	Process/Category: Emissions Data Evaluation

Environmental Protection Agency

Page 64 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-9

Check Name:	Zero Reference Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with a zero injection:

If ZeroReferenceValue is null,
return result A.

If ZeroReferenceValue is less than 0,
return result B.

Results:

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is required, for [key].

B	The value [value] in the field [fieldname] for [key] is not within the range of valid

values. This value must be greater than or equal to zero.

Environmental Protection Agency

Page 65 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-10

Check Name:	Zero Calibration Error Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with a zero injection:

If the ZeroCalibrationError is null,
return result A.

If the ZeroCalibrationError is less than 0,
return result B.

Results:

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is required, for [key].

B	The value [value] in the field [fieldname] for [key] is not within the range of valid

values. This value must be greater than or equal to zero.

Environmental Protection Agency

Page 66 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-11

Check Name:	Zero APS Indicator Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with a zero injection:

If ZeroAPSIndicator is null,
return result A.

Results:

Severity

required, for [key].	Critical Error Level 1

Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is
Usage:

1	Process/Category: Emissions Data Evaluation

Environmental Protection Agency

Page 67 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-12

Check Name:	Upscale Measured Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If UpscaleMeasuredValue is null,
return result A.

Results:

Severity

required, for [key].	Critical Error Level 1

Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is
Usage:

1	Process/Category: Emissions Data Evaluation

Environmental Protection Agency

Page 68 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-13

Check Name:	Upscale Reference Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If UpscaleReferenceValue is null,
return result A.

If UpscaleReferenceValue is less than or equal to 0,
return result B.

Results:

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is required, for [key].

B	The value [value] in the field [fieldname] for [key] is not within the range of valid

values. This value must be greater than zero.

Environmental Protection Agency

Page 69 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-14

Check Name:	Upscale Calibration Error Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If the UpscaleCalibrationError is null,
return result A.

If the UpscaleCalibrationError is less than 0,
return result B.

Results:

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is required, for [key].

B	The value [value] in the field [fieldname] for [key] is not within the range of valid

values. This value must be greater than or equal to zero.

Environmental Protection Agency

Page 70 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-15

Check Name:	Upscale APS Indicator Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If UpscaleAPSIndicator is null,
return result A.

Results:

Severity

required, for [key].	Critical Error Level 1

Report	Daily Calibration Test

Result	Response

A	You did not provide [fieldname], which is
Usage:

1	Process/Category: Emissions Data Evaluation

Environmental Protection Agency

Page 71 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-16

Check Name:	Upscale Injection Time Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If the UpscalelnjectionHour is not between 0 and 23, or the UpscalelnjectionMinute is null and Legacy Data Evaluation ==
false, or the UpscalelnjectionMinute is not between 0 and 59,

set Daily Cal Upscale Injection Time Valid to false, and return result A.

Otherwise,

set Daily Cal Upscale Injection Time Valid to true.

Results:

Result	Response

A	The [type] date, hour, and/or minute for [key] is invalid.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Seventy

Critical Error Level 1

Environmental Protection Agency

Page 72 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-17

Check Name:

Zero Injection Time Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily calibration test with a zero injection:

If the ZeroInjectionHour is not between 0 and 23, or the ZeroInjectionMinute is null and Legacy Data Evaluation == false,
or the ZeroInjectionMinute is not between 0 and 59,

set Daily Cal Injection Times Valid to false, and return result A.

else if Legacy Data Evaluation == false, the UpscalelnjectionDate is not null, the UpscalelnjectionHour is between 0 and
23, the UpscalelnjectionMinute is between 0 and 59, and the UpscalelnjectionDate, UpscalelnjectionHour, and
UpscalelnjectionMinute are equal to the ZeroInjectionDate, ZeroInjectionHour, and ZeroInjectionMinute, and the
associated ComponentTypeCode is not equal to "FLOW"

set Daily Cal Injection Times Valid to false, and return result B.

set Daily Cal Injection Times Valid to Daily Cal Upscale Injection Time Valid.

Locate another Daily Calibration Test Record for the location where the ComponentID and SpanScale are equal to
the ComponentID and SpanScale in the current record, TestResultCode is not equal to "INC", and the
EndDate/Hour/Minute is between the UpscalelnjectionDate/Hour/Minute and ZeroInjectionDate/Hour/Minuteof
the current test.

If found,

return result C.

else

If the absolute value of the difference between the ZeroInjectionDate/Hour and the
UpscalelnjectionDate/Hour in the current test is greater than 1,
return result D.

Otherwise,

Environmental Protection Agency

Page 73 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

C
D

Response

The [type] date, hour, and/or minute for [key] is invalid.

You reported that the zero injection and upscale injection for [key] were performed
at the same time. This is invalid.

This [testtype] was conducted at the same time as another [testtype] for the same
component and range.

The zero and upscale injections for [key] were not performed in the same or
adjacent clock hours.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 74 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-18

Check Name:

Zero Reference Value Consistent with Span

Related Former Checks:
Applicability:

CEM Check

Description:

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with a Daily Cal Span Value that is not null and a ZeroReferenceValue greater than or equal to 0:

Calculate Zero Reference Percent of Span = ZeroReference Value / Daily Cal Span Value * 100, and round to result to one
decimal place.

If Zero Reference Percent of Span is greater than 20.0,

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and the FieldDescription
is equal to "GasPercentOfSpan".

If Zero Reference Percent of Span is greater than 20.0 + Tolerance in the cross-check record,
return result A.

Otherwise,

return result B.

Results:

Result
A

The tag value of at least one Zero level reference signal or calibration gas for [key]
is [percent]%, which does not meet the performance specifications of 40 CFR Part
75. The concentration of the zero reference signal or calibration gas must be less
than or equal to 20.0% of the span value. The test is invalid.

Response

Severity

Critical Error Level 2

B

The tag value of at least one zero level reference signal or calibration gas for [key]
is [percent]%, which does not meet the performance specifications of 40 CFR Part
75. The concentration of the zero reference signal or calibration gas must be less
than or equal to 20.0% of the span value.

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 75 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-19

Check Name:

Upscale Reference Value Consistent with Span

Related Former Checks:
Applicability:

CEM Check

Description:

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with a Daily Cal Span Value that is not null and an UpscaleReferenceValue greater than 0:

Calculate Upscale Reference Percent of Span = UpscaleReferenceValue / Daily Cal Span Value * 100, and round to result
to one decimal place.

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and the FieldDescription is
equal to "GasPercentOfSpan".

If UpscaleGasLevelCode is equal to "MID", and the ComponentTypeCode of the associated component is not equal to
"FLOW",

If Upscale Reference Percent of Span is less than 50.0 or greater than 60.0,

If Upscale Reference Percent of Span is less than 50.0 - Tolerance in the cross-check record or Upscale
Reference Percent of Span greater than 60.0 + Tolerance in the cross-check record,
return result A.

Otherwise,

return result B.

If Upscale Reference Percent of Span is less than 50.0 or greater than 70.0,

If Upscale Reference Percent of Span is less than 50.0 - Tolerance in the cross-check record or
Upscale Reference Percent of Span greater than 70.0 + Tolerance in the cross-check record,
return result C.

Otherwise,

return result D.

If Upscale Reference Percent of Span is greater than 100.0,
return result E

If Upscale Reference Percent of Span is less than 80.0,

If Upscale Reference Percent of Span is less than 80.0 - Tolerance in the cross-check record,
return result E.

If UpscaleGasLevelCode is equal to "HIGH",

If the ComponentTypeCode of the associated component is equal to "FLOW",

Otherwise,

Environmental Protection Agency

Page 76 of 703


-------
Draft ECMPS Emissions Check Specifications

Otherwise,

return result F.

3/7/2012 12:00:00AM

Results:

Result
A

B

D

Response

The tag value of at least one Mid level reference signal or calibration gas for [key]
is [percent]%, which does not meet the performance specifications of 40 CFR Part
75. The concentration of the mid reference signal or calibration gas must be
between 50.0% and 60.0% of the span value. The test is invalid.

The tag value of at least one Mid level reference signal or calibration gas for [key]
is [percent]%, which does not meet the performance specifications of 40 CFR Part
75. The concentration of the 'mid' reference signal or calibration gas must be
between 50.0% and 60.0% of the span value.

The tag value of at least one High level reference signal for [key] is [percent]%,
which does not meet the performance specifications of 40 CFR Part 75. The value
of the high reference signal for a flow component must be between 50.0% and
70.0% of the span value. The test is invalid.

The tag value of at least one High level reference signal for [key] is [percent]%,
which does not meet the performance specifications of 40 CFR Part 75. The value
of the 'high' reference signal for a flow component must be between 50.0% and
70.0% of the span value.

The tag value of at least one High level reference calibration gas for [key] is
[percent]%, which does not meet the performance specifications of 40 CFR Part 75.
The concentration of the high reference calibration gas must be between 80.0% and
100.0%i of the span value. The test is invalid.

The tag value of at least one High level reference calibration gas for [key] is
[percent]%>, which does not meet the performance specifications of 40 CFR Part 75.
The concentration of the 'high' reference calibration gas must be between 80.0%>
and 100.0%i of the span value.

Severity

Critical Error Level 2

Non-Critical Error

Critical Error Level 2

Non-Critical Error

Critical Error Level 2

Non-Critical Error

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 77 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-20

Check Name:

Related Former Checks:

Calculate Zero Gas Injection or Reference Signal Results

Applicability:
Description:

CEM Check

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with a zero injection:

If (Daily Cal Span Value is null, or ZeroReferenceValue of the test is null or is less than zero, or ZeroMeasuredValue of the
test is null)

Set Daily Cal Calc Result to "INVALID", Daily Cal Zero Injection Calc Result to null, Daily Cal Zero Injection
Calc APS Indicator to null, and return result A.

Otherwise,

Calculate diff = abs(ZeroMeasuredValue - ZeroReferenceValue)

Set Daily Cal Zero Injection Calc APS Indicator to 0.

If (ComponentTypeCode of the associated component is equal to "C02" or "02")

Round diff to 1 decimal place.

Set Daily Cal Zero Injection Calc Result to diff.

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (Daily Cal Zero Injection Calc Result is greater than 1.0)

If (ZeroCalibrationError is greater than or equal to 0 and less than or equal to 1.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferencePCT".

If (the absolute value of the difference between diff and ZeroCalibrationError is less
than or equal to the Tolerance in the cross-check record)

if (Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSED".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater than

Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.

Environmental Protection Agency

Page 78 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater than
Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.

else if (Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSED".

If (ComponentTypeCode of the associated component is equal to "S02" or "NOX")

Calculate Daily Cal Zero Injection Calc Result = min(round(diff / Daily Cal Span Value * 100, 1), 9999.9)
Round diff to 1 decimal places.

If (Daily Cal Zero Injection Calc Result is greater than 5.0, AND (Daily Cal Span Value is less than or
equal to 50 AND diff is less than or equal to 5.0) OR (Daily Cal Span Value is greater than 50 AND Daily
Cal Span Value is less than or equal to 200 AND diff is less than or equal to 10.0)))

set Daily Cal Zero Injection Calc Result to diff.
set Daily Cal Zero Injection Calc APS Indicator to 1.

If {Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "PASSAPS".

Otherwise,

If (Daily Cal Zero Injection Calc Result is greater than 5 .0)

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (ZeroAPSIndicator is NOT equal to 1 and ZeroCalibrationError is greater than or
equal to 0 and less than or equal to 5.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is
equal to "7DAY" and the FieldDescription is equal to "CalibrationError".

If (the absolute value of the difference between Daily Cal Zero Injection
Calc Result and ZeroCalibrationError is less than or equal to the Tolerance
in the cross-check record)

If (Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

Environmental Protection Agency

Page 79 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.

Otherwise,

If (ZeroAPSIndicator is equal to 1 and ZeroCalibrationError is greater than or
equal to 0, and (Daily Cal Span Value is less than or equal to 50 AND
ZeroCalibrationError is less than or equal to 5.0) OR (Daily Cal Span Value
is greater than 50 AND Daily Cal Span Value is less than or equal to 200
AND ZeroCalibrationError is less than or equal to 10.0)))

Locate the Test Tolerance cross-check record where the
TestTypeCode is equal to "7DAY" and the FieldDescription is equal
to "DifferencePPM".

If (the absolute value of the difference between diff and
ZeroCalibrationError is less than or equal to the Tolerance in the
cross-check record)

If {Daily Cal Calc Result is not equal to "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to

Zerolnj ectionDate.

set Daily Cal Fail Hour to Zerolnjection
Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is

greater than Zerolnj ectionDate/ZeroInj ectionHour)
set Daily Cal Fail Date to
Zerolnj ectionDate.

set Daily Cal Fail Hour to Zerolnjection
Hour.

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater

Environmental Protection Agency

Page 80 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

than Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to Zerolnj ectionDate.
set Daily Cal Fail Hour to Zerolnj ection Hour.

Otherwise,

If (Daily Cal Calc Result is not equal to "FAILED" or "INC" or "PASSAPS" or "IGNORED")
set Daily Cal Calc Result to "PASSED".

If (ComponentTypeCode of the associated component is equal to "FLOW")

Calculate Daily Cal Zero Injection Calc Result = min(round(diff / Daily Cal Span Value * 100, 1), 9999.9).
Round diff to 2 decimal places.

If (Daily Cal Zero Injection Calc Result is greater than 6.0, the Sample AcquisitionMethodCode of the
associated component is equal to "DP", and diff is less than or equal to 0.02)

set Daily Cal Zero Injection Calc Result to diff.
set Daily Cal Zero Injection Calc APS Indicator to 1.

If (Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "PASSAPS".

Otherwise,

If (Daily Cal Zero Injection Calc Result is greater than 6.0)

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (ZeroAPSIndicator is NOT equal to 1 and ZeroCalibrationError is greater than or
equal to 0 and less than or equal to 6.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is
equal to "7DAY" and the FieldDescription is equal to "CalibrationError".

If (the absolute value of the difference between Daily Cal Zero Injection
Calc Result and ZeroCalibrationError is less than or equal to the Tolerance
in the cross-check record)

If (Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to Zerolnj ectionDate.
set Daily Cal Fail Hour to Zerolnj ection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to Zerolnj ectionDate.
set Daily Cal Fail Hour to Zerolnj ection Hour.

Environmental Protection Agency

Page 81 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

If (ZeroAPSIndicator is equal to 1, the SampleAcquisitionMethodCode of
the associated component is equal to "DP", and ZeroCalibrationError is
greater than or equal to 0 and less than or equal to 0.02)

Locate the Test Tolerance cross-check record where the
TestTypeCode is equal to "7DAY" and the FieldDescription is equal
to "DifferenceINH20".

If (the absolute value of the difference between diff and
ZeroCalibrationError is less than or equal to the Tolerance in the
cross-check record)

If (Daily Cal Calc Result is not equal to "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to

Zerolnj ectionDate.

set Daily Cal Fail Hour to Zerolnj ection
Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is

greater than Zerolnj ectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to
Zerolnj ectionDate.

set Daily Cal Fail Hour to Zerolnj ection
Hour.

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to Zerolnj ectionDate.
set Daily Cal Fail Hour to Zerolnj ection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Zerolnj ectionDate/ZeroInj ectionHour)

set Daily Cal Fail Date to Zerolnj ectionDate.
set Daily Cal Fail Hour to Zerolnj ection Hour.

Otherwise,

If (Daily Cal Calc Result is not equal to "INC" or "FAILED", or "PASSAPS" or
"IGNORED")

set Daily Cal Calc Result to "PASSED".

Environmental Protection Agency

Page 82 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The software could not evaluate the [test] calculations reported for [key], because	Informational Message

of the errors listed above.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 83 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-21

Check Name:

Related Former Checks:

Calculate Upscale Gas Injection or Reference Signal Results

Applicability:
Description:

CEM Check

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with an upscale injection:

If (Daily Cal Span Value is null, or Daily Cal Upscale Gas Level Valid is false, or UpscaleReferenceValue of the test is null
or is less than or equal to zero, or UpscaleMeasuredValue of the test is null)

Set Daily Cal Calc Result to "INVALID", Daily Cal Upscale Injection Calc Result to null, Daily Cal Upscale
Injection Calc APS Indicator to null, and return result A.

Otherwise,

Calculate diff = abs(UpscaleMeasuredValue - UpscaleReferenceValue)

Set Daily Cal Upscale Injection Calc APS Indicator to 0.

If (ComponentTypeCode of the associated component is equal to "C02" or "02")

Round diff to 1 decimal place.

Set Daily Cal Upscale Injection Calc Result to diff.

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (Daily Cal Upscale Injection Calc Result is greater than 1.0)

If (UpscaleCalibrationError is greater than or equal to 0 and less than or equal to 1.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferencePCT".

If (the absolute value of the difference between diff and UpscaleCalibrationError is
less than or equal to the Tolerance in the cross-check record)

if (Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSED".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater than

Upscalelnj ectionDate/Upscalelnj ectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

Environmental Protection Agency

Page 84 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater than
Upscalelnj ectionDate/Upscalelnj ectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

else if (Daily Cal Calc Result is not equal to "INC" or "FAILED" or "IGNORED")
set Daily Cal Calc Result to "PASSED".

If (ComponentTypeCode of the associated component is equal to "S02" or "NOX")

Calculate Daily Cal Upscale Injection Calc Result = min(round{diff / Daily Cal Span Value * 100, 1),
9999.9)

Round diff to 1 decimal places.

If (Daily Cal Upscale Injection Calc Result is greater than 5.0, AND (Daily Cal Span Value is less than or
equal to 50 AND diff is less than or equal to 5.0) OR (Daily Cal Span Value is greater than 50 AND Daily
Cal Span Value is less than or equal to 200 AND diff is less than or equal to 10.0)))

set Daily Cal Upscale Injection Calc Result to diff.
set Daily Cal Upscale Injection Calc APS Indicator to 1.

If {Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "P ASSAPS".

Otherwise,

If (Daily Cal Upscale Injection Calc Result is greater than 5.0)

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (UpscaleAPSIndicator is NOT equal to 1 and UpscaleCalibrationError is greater
than or equal to 0 and less than or equal to 5.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is
equal to "7DAY" and the FieldDescription is equal to "CalibrationError".

If (the absolute value of the difference between Daily Cal Upscale Injection
Calc Result and UpscaleCalibrationError is less than or equal to the
Tolerance in the cross-check record)

If (Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSED".

Otherwise,

Environmental Protection Agency

Page 85 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Upscalelnj ectionDate/Upscalelnj ectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

Otherwise,

If (UpscaleAPSIndicator is equal to 1 and UpscaleCalibrationError is greater
than or equal to 0, and (Daily Cal Span Value is less than or equal to 50
AND UpscaleCalibrationError is less than or equal to 5.0) OR (Daily Cal
Span Value is greater than 50 AND Daily Cal Span Value is less than or
equal to 200 AND UpscaleCalibrationError is less than or equal to 10.0)))

Locate the Test Tolerance cross-check record where the
TestTypeCode is equal to "7DAY" and the FieldDescription is equal
to "DifferencePPM".

If (the absolute value of the difference between diff and
UpscaleCalibrationError is less than or equal to the Tolerance in the
cross-check record)

If {Daily Cal Calc Result is not equal to "INC" or
"FAILED")

set Daily Cal Calc Result to "P ASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to

UpscalelnjectionDate.

set Daily Cal Fail Hour to Upscalelnjection
Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is

greater than

Upscalelnj ectionDate/Upscalelnj ectionHour)
set Daily Cal Fail Date to
UpscalelnjectionDate.

set Daily Cal Fail Hour to Upscalelnjection
Hour.

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

Environmental Protection Agency

Page 86 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Upscalelnj ectionDate/Upscalelnj ectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

Otherwise,

If (Daily Cal Calc Result is not equal to "FAILED" or "INC", or "PASSAPS" or
"IGNORED")

set Daily Cal Calc Result to "PASSED".

If (ComponentTypeCode of the associated component is equal to "FLOW")

Calculate Daily Cal Upscale Injection Calc Result = min(round(diff / Daily Cal Span Value * 100, 1),
9999.9).

Round diff to 2 decimal places.

If (Daily Cal Upscale Injection Calc Result is greater than 6.0, the SampleAcquisitionMethodCode of the
associated component is equal to "DP", and diff is less than or equal to 0.02)

set Daily Cal Upscale Injection Calc Result to diff.
set Daily Cal Upscale Injection Calc APS Indicator to 1.

If {Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "PASSAPS".

Otherwise,

If (Daily Cal Upscale Injection Calc Result is greater than 6.0)

If (Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")

If (UpscaleAPSIndicator is NOT equal to 1 and UpscaleCalibrationError is greater
than or equal to 0 and less than or equal to 6.0)

Locate the Test Tolerance cross-check record where the TestTypeCode is
equal to "7DAY" and the FieldDescription is equal to "CalibrationError".

If (the absolute value of the difference between Daily Cal Upscale Injection
Calc Result and UpscaleCalibrationError is less than or equal to the
Tolerance in the cross-check record)

If (Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

Environmental Protection Agency

Page 87 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than UpscalelnjectionDate/UpscalelnjectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

Otherwise,

If (UpscaleAPSIndicator is equal to 1, the SampleAcquisitionMethodCode of
the associated component is equal to "DP", and UpscaleCalibrationError is
greater than or equal to 0 and less than or equal to 0.02)

Locate the Test Tolerance cross-check record where the
TestTypeCode is equal to "7DAY" and the FieldDescription is equal
to "DifferenceINH20".

If (the absolute value of the difference between diff and
UpscaleCalibrationError is less than or equal to the Tolerance in the
cross-check record)

If {Daily Cal Calc Result is not equal to "INC" or
"FAILED")

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to

UpscalelnjectionDate.

set Daily Cal Fail Hour to Upscalelnjection
Hour.

else if (Daily Cal Fail Date/Daily Cal Fail Hour is

greater than

Upscalelnj ectionDate/Upscalelnj ectionHour)
set Daily Cal Fail Date to
UpscalelnjectionDate.

set Daily Cal Fail Hour to Upscalelnjection
Hour.

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Times Valid == true)

If (Daily Cal Fail Date is null)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if (Daily Cal Fail Date/Daily Cal Fail Hour is greater
than Upscalelnj ectionDate/Upscalelnj ectionHour)

set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.

Environmental Protection Agency

Page 88 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

If (Daily Cal Calc Result is not equal to "INC" or "FAILED", or "PASSAPS" or
"IGNORED")

set Daily Cal Calc Result to "PASSED".

Results:

Result	Response	Severity

A	The software could not evaluate the [test] calculations reported for [key], because	Informational Message

of the errors listed above.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 89 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-22

Check Name:

Daily Calibration Test End Time Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily calibration test with upscale and zero injections and a valid date, hour, and minute and injection times:

If Date, Hour, and Minute of the test does not equal the later of the ZeroInjectionDate, Hour, and Minute (if not null) and the
UpscalelnjectionDate, Hour, and Minute (if non-null),

return result A.

Results:

Result
A

Response

You reported a test Date, Hour, and Minute that is not the same as the Date, Hour,
and Minute of the last injection in the daily calibration test for [key].

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 90 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-23

Check Name:	Reported Zero Injection Results Consistent with Recalculated Values

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with a zero injection:

If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "FLOW", and the
SampleAcquisitionMethodCode of the associated component is not equal to "DP",
return result A.

If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "S02" or "NOX",
and the Daily Cal Span Value is greater than or equal to 200,
return result B.

If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "C02" or "02",
return result C.

Otherwise,

If Daily Cal Zero Injection Calc Result is not null,

If the ZeroAPSIndicator in the current record is not equal to 1 and the Daily Cal Zero Injection Calc APS
Indicator is equal to 1,
return result D.

If the ZeroCalibrationError is greater than or equal to 0,

If the ComponentTypeCode of the associated component is equal to "C02" or "02"

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY"
and the FieldDescription is equal to "DifferencePCT".

If the absolute value of the difference between the Daily Cal Zero Injection Calc Result
and the ZeroCalibrationError is greater than the Tolerance in the cross-check record,
return result E.

If the Daily Cal Zero Injection Calc APS Indicator is equal to 1,

If the ComponentTypeCode of the associated component is equal to "FLOW",

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferenceINH20".

If the absolute value of the difference between the Daily Cal Zero Injection Calc
Result and the ZeroCalibrationError is greater than the Tolerance in the cross-check
record,

return result E.

Environmental Protection Agency

Page 91 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferencePPM".

If the absolute value of the difference between the Daily Cal Zero Injection Calc
Result and the ZeroCalibrationError is greater than the Tolerance in the cross-check
record,

return result E.

else if ZeroAPSIndicator is equal to 0,

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY"
and the FieldDescription is equal to "CalibrationError".

If the absolute value of the difference between the Daily Cal Zero Injection Calc Result
and the ZeroCalibrationError is greater than the Tolerance in the cross-check record,
return result F.

Results:

Result
A

B

C
D

Usage:

1

Response

You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance criteria for non-differential pressure flow monitors.
You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance specification criteria for S02 and NOX components when
the instrument span is greater than or equal to 200.

You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance specification criteria for C02 and 02 components.
You did not report a value of "1" in the [level] APS Indicator for [key], although
EPA applied the alternative performance specification to determine that the
injection passed the applicable performance specification.

The absolute difference reported as the [level] Calibration Error for [key] is
inconsistent with the recalculated absolute difference for the gas injection or
reference signal.

The [level] Calibration Error reported for [key] is inconsistent with the recalculated
calibration error for the gas injection or reference signal.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 92 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-24

Check Name:

Related Former Checks:

Reported Upscale Injection Results Consistent with Recalculated Values

Applicability:
Description:

CEM Check

Validation Tables:

Test Tolerances (Cross Check Table)

Specifications:

For the daily calibration test with an upscale injection:

If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "FLOW", and
the SampleAcquisitionMethodCode of the associated component is not equal to "DP",
return result A.

If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "S02" or
"NOX", and the Daily Cal Span Value is greater than or equal to 200,
return result B.

If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "C02" or "02",
return result C.

Otherwise,

If Daily Cal Upscale Injection Calc Result is not null,

If the UpscaleAPSIndicator in the current record is not equal to 1 and the Daily Cal Upscale Injection Calc
A PS Indicator is equal to 1,
return result D.

If the UpscaleCalibrationError is greater than or equal to 0,

If the ComponentTypeCode of the associated component is equal to "C02" or "02"

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY"
and the FieldDescription is equal to "DifferencePCT".

If the absolute value of the difference between the Daily Cal Upscale Injection Calc Result
and the UpscaleCalibrationError is greater than the Tolerance in the cross-check record,
return result E.

If the Daily Cal Upscale Injection Calc APS Indicator is equal to 1,

If the ComponentTypeCode of the associated component is equal to "FLOW",

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferenceINH20".

If the absolute value of the difference between the Daily Cal Upscale Injection Calc
Result and the UpscaleCalibrationError is greater than the Tolerance in the
cross-check record,

return result E.

Environmental Protection Agency

Page 93 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferencePPM".

If the absolute value of the difference between the Daily Cal Upscale Injection Calc
Result and the UpscaleCalibrationError is greater than the Tolerance in the
cross-check record,

return result E.

else if UpscaleAPSIndicator is equal to 0,

Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY"
and the FieldDescription is equal to "CalibrationError".

If the absolute value of the difference between the Daily Cal Upscale Injection Calc Result
and the UpscaleCalibrationError is greater than the Tolerance in the cross-check record,
return result F.

Results:

Result
A

B

C
D

Response

You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance criteria for non-differential pressure flow monitors.
You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance specification criteria for S02 and NOX components when
the instrument span is greater than or equal to 200.

You reported a value of " 1" as the [level] APS Indicator for [key], but you must use
the standard performance specification criteria for C02 and 02 components.
You did not report a value of "1" in the [level] APS Indicator for [key], although
EPA applied the alternative performance specification to determine that the
injection passed the applicable performance specification.

The absolute difference reported as the [level] Calibration Error for [key] is
inconsistent with the recalculated absolute difference for the gas injection or
reference signal.

The [level] Calibration Error reported for [key] is inconsistent with the recalculated
calibration error for the gas injection or reference signal.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 94 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the daily calibration test:

If Daily Cal Calc Result is equal to "INVALID",
set Daily Cal Calc Result to null.

If TestResultCode is null,
return result A.

If TestResultCode is not equal to "PASSED", "PASSAPS", "FAILED", "INC", or "ABORTED",
return result B.

If Daily Cal Calc Result is equal to "FAILED",

If TestResultCode is equal to "PASSED" or "PASSAPS",
return result C.

If TestResultCode is equal to "INC",
return result D.

If Daily Cal Calc Result is equal to "PASSED" or "PASSAPS", and the TestResultCode is equal to "FAILED",
return result E.

DAYCAL-25

Determination of Overall Daily Calibration Test Result
CEM Check

Results:

Result	Response	Severity

A	You did not provide [fieldname], which is required, for [key].	Critical Error Level 1

B	You reported the value [value], which is not in the list of valid values for this test	Critical Error Level 1

type, in the field [fieldname] for [key].

C	The TestResultCode for [key] indicates a passing test, but the recalculated results	Critical Error Level 1

indicate a failing test.

D	The TestResultCode for [key] indicates an incomplete test, but the recalculated	Critical Error Level 1

results indicate a failing test. A test is considered to have failed if it fails to meet
the performance criteria for any injection.

E	You reported a TestResultCode of "FAILED" for [key], but the results recalculated Critical Error Level 1

or determined from the other reported values indicate that the test passed.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 95 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-26

Check Name:

Upscale Gas Type Code Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Validation Tables:

Gas Type Code (Lookup Table)

Specifications:

For the daily calibration test with an upscale injection:

UpscaleGasTypeValid = true.

Locate System Parameter lookup table record where Sys_Param_Name = 'PGVP_AETB_RULE_DATE'.
Set Daily Cal PGVP Rule Date to System Parameter Param_ Va 1 lie 1.

If UpscaleGasTypeCode is null,

If the ComponentTypeCode of the associated component is equal to "S02", "NOX", "C02", or "02", and the Date
of the test is on or after 9/26/2011,

UpscaleGasTypeValid = false,
return result A.

If the ComponentTypeCode of the associated component is equal to "FLOW",

UpscaleGasTypeValid = false
return result B.

else if the UpscaleGasTypeCode is not equal to "GMIS", "PRM", "RGM", or "SRM",

if the UpscaleGasTypeCode is not in the GasTypeCode lookup table.

UpscaleGasTypeValid = false
return result C.

else if the UpscaleGasTypeCode == "ZERO" or "ZAM"

UpscaleGasTypeValid = false
return result C

else if the UpscaleGasTypeCode == "APPVD"
return result D

else if the ComponentTypeCode == "S02", "NOX", "C02" or "02",

Locate Protocol Gas Parameter To Type Cross Reference records where ProtocolGasParameter is
equal to ComponentTypeCode in the current Daily Calibration record, and GasTypeList contains the
UpscaleGasTypeCode in the current Daily Calibration record.

If not found,

UpscaleGasTypeValid = false
return result E.

Otherwise,

Environmental Protection Agency

Page 96 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if ComponentTypeCode == "02", UpscaleGasTypeCode == "AIR", and the UpscaleGasCode is
not equal to "HIGH",

UpscaleGasTypeValid = false
return result F.

Results:

Result
A

B

C

D

E
F

Usage:

1

Response

You did not report a UpscaleGasTypeCode for [key]. This information is required
by the Protocol Gas Verification Program reporting rule.

You reported a value in the UpscaleGasTypeCode field for [key]. This value
should not be reported for a FLOW component.

You reported the value [value], which is not in the list of valid values, in the field
[fieldname] for [key].

You reported " APPVD" as the [fieldname] for [key]. This code indicates that you
received approval from EPA for a new type of Protocol Gas. If you have not
received approval from EPA, please contact ECMPS support. If you have already
received approval, you should log in to the ECMPS host, so that the ECMPS
program can obtain the necessary information to override this error.

You reported an UpscaleGasTypeCode that is not appropriate for a [comptype]
component for [key].

You reported an [fieldname] of "AIR" for [key], which indicates the use of purified
air material, but this material can only be used for a high-level calibration.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 97 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAYCAL-27

Check Name:	Cylinder ID Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If CylinderlD is null,

If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR",
return result A.

Otherwise,

If the UpscaleGasTypeCode is equal to "AIR",
return result B.

else if UpscaleGasTypeValid is true, and the UpscaleGasTypeCd is null,
return result C.

Results:

Result	Response

A	You did not provide [fieldname], which is required, for [key].

B	You indicated that you used purified air material or zero air material instead of a

cylinder gas, but you reported a Cylinderldentifier.

C	You reported a [fieldname] for [key], but you did not report an

UpscaleGasTypeCode.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Non-Critical Error

Environmental Protection Agency

Page 98 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-28

Check Name:

Vendor ID Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If VendorlD is null,

If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR", "SRM",
"NTRM", "GMIS", "RGM", or "PRM",

else if the VendorlD is not in the Protocol Gas Vendor lookup table,
return result B.

Otherwise,

If the UpscaleGasTypeCode is equal to "AIR", "SRM", "NTRM", "GMIS", "RGM", or "PRM",
return result C.

else if the DeactivationDate in the Protocol Gas Vendor record is not null and the Date of the current test is on or
after the DeactivationDate + 3 years,
return result F.

else if the VendorlD is equal to "NONPGVP", and the Date of the test is on or after the Daily Cal PGVPRule Date +
60 days + 3 years,

return result D.

else if UpscaleGasTypeValid is true, and the UpscaleGasTypeCd is null,
return result E.

return result A.

Results:

Result

A

B

Response

You did not provide [fieldname], which is required, for [key].

You reported a Vendorldentifier of [value], which is not in the list of Protocol Gas
Vendors, for [key]. Please visit the ECMPS Support Website for the list of Protocol
Gas Vendors.

You reported a [fieldname] for [key], but this value should only be reported for an
EPA Protocol Gas Type. The cylinder gas type of [gastype] indicates the use of a
non-EPA Protocol Gas Type.

You reported a Vendorldentifier of "NONPGVP" for [key], indicating the use of a
EPA Protocol Gas Type purchased from a vendor not participating in the Protocol
Gas Vendor Program (PGVP). You cannot use a gas purchased from a
non-participating vendor that was acquired more than 60 days after the PGVP
Effective Date.

You reported a [fieldname] for [key], but you did not report an
UpscaleGasTypeCode.

You have reported a Vendorldentifier for [key] of a vendor who is no longer
participating in the Protocol Gas Verification Program.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

D

Critical Error Level 2

E

Non-Critical Error

F

Critical Error Level 2

Environmental Protection Agency

Page 99 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 100 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAYCAL-29

Check Name:

Cylinder Expiration Date Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily calibration test with an upscale injection:

If ExpirationDate is null,

If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR",
return result A.

Otherwise,

If the UpscaleGasTypeCode is equal to "AIR",
return result B.

else if the ExpirationDate is prior to the Date of the test,
return result C.

else if the ExpirationDate is more than 3 years after the Date of the test,
return result D.

else if UpscaleGasTypeValid is true, and the UpscaleGasTypeCd is null,
return result E.

Results:

Result

A

B

Response

You did not provide [fieldname], which is required, for [key].

You reported a [fieldname] for [key], but this value should only be reported for an
EPA Protocol Gas Type. The cylinder gas type of [gastype] indicates the use of a
non-EPA Protocol Gas Type.

You reported an ExpirationDate for the cylinder that is prior to the date of the test
for [key].

You reported an ExpirationDate for the cylinder that is more than three years after
the date of the test for [key]. Gas cylinders generally expire in less than two years.
You reported a [fieldname] for [key], but you did not report an
UpscaleGasTypeCode.

Severity

Critical Error Level
Critical Error Level

C

Critical Error Level 2

D

Critical Error Level 2

E

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 101 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Daily Emissions Data

Environmental Protection Agency

Page 102 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAILY-1

Check Name:	Determine Need for Daily C02 Emissions Record

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Current C02 Mass Daily Record = null
Daily Op Time = null

if (Daily Op Time Accumulator Array for the location >= 0)

Daily Op Time = Daily Op Time Accumulator Array for the location

Daily Op Time Accumulator Array for the location = 0.

C02 Method Count = Active records in MonitoringMethodData for the location and date where
ParameterCode begins with "C02"

FSA Method Count = Active records in MonitoringMethodData for the location and date where
ParameterCode = "C02M" and MethodCode = "FSA"

if (FSA Method Count > 0 AND C02 Method Count >1)
return result A

else

if (FSA Method Count > 0)

Expected Summary Value for C02 Array for the location = true

C02 Mass Daily Emissions Count = count of DailyEmissionsData records with ParameterCode = "C02M" where
Current Date = DailyEmissionsData.Date

if (C02 Mass Daily Emissions Count >1)

Rpt Period C02 Mass Reported Accumulator Array fox the location = -1
Rpt Period C02 Mass Calculated Accumulator Array fox the location = -1
return result B

else if (FSA Method Count == 0 AND C02 Mass Daily Emissions Count > 0)
return result C

else if (FSA Method Count > 0 AND C02 Mass Daily Emissions Count == 0 AND Daily Op Time > 0
return result D

else if (FSA Method Count > 0 AND C02 Mass Daily Emissions Count ==1)

Current C02 Mass Daily Record = matching DailyEmissionsData record

If (Daily Op Time == 0)

return result E

Environmental Protection Agency

Page 103 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C

D

E

Response

You have reported more than one active method to determine C02 emissions in
your monitoring plan for this date.

You reported more than one Daily Emissions record for [param] for the day.
You reported a Daily Emissions record for C02M, but you did not report an active
C02M FSA method record in your monitoring plan for the day.

You did not report a Daily Emissions record for C02M for the day.

You reported a Daily Emissions record for C02M, but this is not appropriate for a
non-operating day.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 104 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAILY-2

Check Name:	Check Total Daily Emissions Value

Related Former Checks:

Applicability:

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Set Calc TDE to null.

If (Current C02 Mass Daily Record is not null)

If (Current C02 Mass Daily Record. TotalDailyEmissions >= 0 AND Rpt Period C02 Mass Reported Accumulator Array

for the location >= 0)

Rpt Period C02 Mass Reported Accumulator Array fox the location = Rpt Period C02 Mass Reported
Accumulator Array for the location + Current C02 Mass Daily 7?ecw=0)

Calc TDE = Calc TDE + Current C02 Mass Daily Record. SorbentRelatedMassEmissions

else

Set Calc TDE to null.

else if (Current C02 Mass Daily 7?ecw= 0)

Calc TDE = Current C02 Mass Daily /?etwY/.TotalDailyEmissions

If (Calc TDE is null)

Rpt Period C02 Mass Calculated Accumulator Array for the location = -1

else

If (Rpt Period C02 Mass Calculated Accumulator Array for the location >= 0)

Environmental Protection Agency

Page 105 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Rpt Period C02 Mass Calculated Accumulator Array fox the location = Rpt Period C02 Mass Calculated
Accumulator Array for the location + Calc TDE

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M DAILY" AND
UOM = "TON"

if (ABS(Current C02 Mass Daily 7?ecw Tolerance)
return result A

If (Current C02 Mass Daily /?etwY/.TotalDailyEmissions >=0)

If (Calc TDE is not null)

else

return result C

else

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
return result B

Results:

Result
A

Response

The [fieldname] reported in the Daily Emissions record for [param] is inconsistent
with the recalculated value.

The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.

The TotalDailyEmissions in the Daily Emissions record for [param] could not be
recalculated due to other errors listed in this report.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Informational Message

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 106 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAILY-3

Check Name:	Check Adjusted Daily Emissions Value

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current C02 Mass Daily Record is not null),

if (Current C02 Mass Z)ai7j./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-4

Check Name:

Check Sorbent Related Emissions

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current C02 Mass Daily Record is not null),

if (Current C02 Mass Daily Record. SorbentRelatedMassEmissions is not null AND is less than 0),

return result A

Results:

Result
A

Response

The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 108 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-5

Check Name:

Validate Presence of Adjusted Daily Emissions

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current C02 Mass Daily Record) is not null

if (Current C02 Mass Z)ai7j./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-6

Check Name:

Validate Presence of Sorbent Related Emissions

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current C02 Mass Daily Record) is not null

if (Current C02 Mass Daily Record. SorbentRelatedMassEmissions is not null),

Missing C02M Formula = null

Locate a Monitor Formula record for the location and hour where the ParameterCode is equal to 'C02M" and the
FormulaCode is equal to "G-5" or "G-6".

If not found,

Set Missing C02MFormula to "G-5 or G-6"

Locate a Monitor Formula record for the location and hour where the ParameterCode is equal to 'C02M" and the
FormulaCode is equal to "G-8".

If not found,

Append "G-8" to Missing C02MFormula.

If (Missing C02M Formula is not null)
return result A.

Results:

Result
A

Response

You reported SorbentRelatedMassEmissions in the Daily Emissions record for
C02M, but you did not report [code] formula(s) in your monitoring plan.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 110 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-7

Check Name:

Check Unadjusted Daily Emissions Value

Related Former Checks:

Applicability:

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Set Calc C02 Unadj to null.

if (Current C02 Mass Daily Record is not null)

if (Calc Total Carbon Burned is greater than 0)

Calculate Calc C02 Unadj = Calc Total Carbon Burned * 44 / 24,000, and round the result to 1 decimal place.

if (Current C02 Mass Z)ai7j./?ecw= 0)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M DAILY" AND
UOM = "TON"

if (ABS{Current C02 Mass Z)ai7j7?ecw Tolerance)
return result B

else if (Current C02 Mass Daily 7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 112 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-8

Check Name:

Check Fuel in Daily Fuel Record

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Locate UnitFuel record for the location and day

where FuelCd = Current Daily Fuel Record .\JxuiYuclC'd

If not found,

return result A

Results:

Result	Response	Severity

A	You did not report an active Unit Fuel record for FuelCode [fueled] in your	Critical Error Level 1

monitoring plan.

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 113 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-9

Check Name:

Check Daily Fuel Feed

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current Daily Fuel 7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-10

Check Name:

Check Carbon Content Used

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current Daily Fuel 7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	DAILY-11

Check Name:	Check Fuel Carbon Burned

Related Former Checks:

Applicability:

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Calc Fuel Carbon Burned = null

if (Current Daily Fuel itecorrf.DailyFuelFeed is greater than 0 and Current Daily Fuel itecorrf. CarbonContentUsed is greater than 0
and less than or equal to 100)

Calculate Calc Fuel Carbon Burned = Current Daily Fuel 7?ec Calc Fuel Carbon Burned)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "CARBON" AND
UOM = "LB"

if (ABS( Current Daily Fuel 7?ec Tolerance)
return result B.

Results:

Result	Response	Severity

A	The [fieldname] reported in the Daily Fuel record for [key] is missing or invalid.	Critical Error Level 1

The value must be greater than 0.

B	The [fieldname] in the Daily Fuel record for [key] is inconsistent with the	Critical Error Level 1

recalculated value.

Environmental Protection Agency

Page 116 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 117 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-12

Check Name:

Intialize Daily Emissions

Related Former Checks:

Applicability:

Description:

Specifications:

Set Calc Total Carbon Burned to 0.

Daily Op Time Accumulator Array for the location = 0.

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report — C02 Daily Emissions Initialization

Environmental Protection Agency

Page 118 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

DAILY-13

Check Name:

Check Total Carbon Burned

Related Former Checks:

Applicability:

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Set Calculate C02M TDE to true.

if (Current C02 Mass Daily	Total Carbon Burned is null)

if (Calc Total Carbon Burned is not equal to 0)
return result A.

else if {Current C02 Mass Z)ai7j7?ecw Calc Total
Carbon Burned)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "CARBON" AND
UOM = "LB"

if (ABSiCurrent C02 Mass Daily 7?ecw Tolerance)
return result C.

else if (Calc Total Carbon Burned == 0 )

Set Calc Total Carbon Burned to Current C02 Mass Daily /?etwY/.TotalCarbonBurncd.

else

Results:

Result
A

Response

You did not report TotalCarbonBurned in the Daily Emission record for C02M.
You must report this value if you report Daily Fuel records.

The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.

The [fieldname] reported in the Daily Emissions record for [param] is inconsistent
with the recalculated value.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 119 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Daily Test

Environmental Protection Agency

Page 120 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	EMTEST-1

Check Name:	Daily Test Date Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily emission test:

Set EM Test Date Valid to true.

If Date is null,

set EM Test Date Valid to false, and return result A.

If Date is before 01/01/1993 or after the end of the Current Reporting Period,
set EM Test Date Valid to false, and return result B.

Results:

Result

A

B

Usage:

1

Response

You did not provide [fieldname], which is required, for [key].

You reported a [Fieldname] of [Date], which is outside the range of acceptable

values for this date for [key].

Process/Category:
Process/Category:

Emissions Data Evaluation Report ¦
Emissions Data Evaluation Report ¦

Severity
Fatal

Critical Error Level 1

¦	Daily Calibration Test

¦	Miscellaneous Emission File Test

Environmental Protection Agency

Page 121 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	EMTEST-2

Check Name:	Daily Test Hour Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily emission test:

Set EM Test Hour Valid to true.

If Hour is null,

Set EM Test Hour Valid to false, and return result A.

If Hour is not between 0 and 23,

Set EM Test Hour Valid to false, and return result B.

Results:

Result

A

B

Usage:

1

Response

You did not provide [fieldname], which is required, for [key].

You reported a [Fieldname] of [Hour], which is outside the range of acceptable

values for this hour for [key].

Process/Category:
Process/Category:

Severity
Fatal

Critical Error Level 1

Emissions Data Evaluation Report	Daily Calibration Test

Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 122 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	EMTEST-3

Check Name:	Daily Test Minute Valid

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

For the daily emission test:

Set EM Test Minute Valid to true.

If Minute is null,

If (Legacy Data Evaluation == false)

set EM Test Minute Valid to false, and return result A.

Otherwise,

return result B.

If Minute is not between 0 and 59,

set EM Test Minute Valid to false, and return result C.

Results:

Result	Response	Severity

A	You did not provide [fieldname], which is required, for [key].	Fatal

B	You did not provide [fieldname] for [key]. This information will be required for	Informational Message

ECMPS submissions.

C	You reported a [Fieldname] of [Minute] for [key], which is outside the range of	Critical Error Level 1

acceptable values.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

2	Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 123 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

EMTEST-4

Check Name:

Daily Test System or Component Valid

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

For the daily test:

If both the MonitoringSystemID and ComponentID are not null,

return result A.

If TestTypeCode is equal to "INTCHK",

If ComponentID is null,
return result B.

If the ComponentTypeCode of the associated component is not equal to "FLOW",
return result C.

If TestTypeCode is equal to "PEMSCAL",

If Monitoring SystemID is null,
return result D.

If the SystemTypeCode of the associated system is not equal to "NOXP",
return result E.

Results:

Result
A

Response

You have reported both a MonitoringSystemID and a ComponentID for [key]. This
is invalid.

You did not provide [fieldname], which is required, for [key].

The ComponentTypeCode for [key] is not appropriate for this type of test.

You did not provide a MonitoringSystemID for [key], which is required for this test

type.

The SystemTypeCode of the system for [key] is not appropriate for this type of
test.

Severity

Critical Error Level 1

B
C
D

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

E

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Daily Calibration Test

2	Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 124 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

EMTEST-5

Check Name:

Daily Test Span Scale Valid

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

For the daily test:

If the SpanScaleCode is not null,
return result A.

Results:

Result	Response	Severity

A	You reported [fieldname] for [key], which is not appropriate for this test type.	Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 125 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the daily test:

Set EM Test Calc Result to null.

If TestResultCode is null,
return result A.

else if TestResultCode is not equal to "ABORTED", "PASSED", or "FAILED",
return result B.

else

Set EM Test Calc Result to TestResultCode.

if TestTypeCode is equal to "INTCHK" and EM Test Date Valid and EM Test Hour Valid and OpTime is equal to

0,

Set Ignored Daily Interference Tests to true.

Set EM Test Calc Result to "IGNORED".

EMTEST-6

Daily Test Result Code Valid
General Check

Results:

Result	Response Severity

A	You did not provide [fieldname], which is required, for [key].	Critical Error Level 1

B	You reported the value [value], which is not in the list of valid values for this test	Critical Error Level 1

type, in the field [fieldname] for [key].

Usage:

1	Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 126 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Flow-to-Load Status

Environmental Protection Agency

Page 127 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	F2LSTAT-1

Check Name:	Determine Most Recent Flow-to-Load QA Operating Quarter

Related Former Checks:

Applicability:

Description:

Specifications:

Set F2LStatusPriorTestRequiredQuarter = null.

Set F2LStatusPriorTestRequiredQuarterMissingOpData = null.

If F2LStatusSystemResultDictionary does not contain lookup value for CurrentMh vRecord Sy stem ID

For each quarter before CurrentReportingPeriod beginning with the quarter immediately before CurrentReportingPeriod
and going back to the quarter of EarliestLocationReportDate

If AnnualReportingRequirement equals true, or the quarter being checked is 2 or 3

If AnnualReportingRequirement equals true, or the quarter being checked is 3

Locate the record in OperatingSuppDataRecordsByLocation where OpTypeCode is equal to
"OPHOURS", FuelCode is null, and reporting period equals the quarter being checked

Else

Locate the record in OperatingSuppDataRecordsByLocation where OpTypeCode is equal to
"OSHOURS", FuelCode is null, and reporting period equals the quarter being checked

If OperatingSuppDataRecordsByLocation record is found

If F2LStatusPriorTestRequiredQuarter does not equal -1

If OperatingSuppDataRecordsIiyLocation Op Val lie >= 168

Locate a record in F2L CheckRecordsForOaStatus where SystemID is equal to
CurrentMh vRecord Sy stem ID. the quarter is equal to the quarter being checked, and
TestResultCode is equal to "EXC168H" or "FEW168H"

If not found

Set F2LStatusPriorTestRequiredQuarter. Year = The year value of the
quarter being checked.

Set F2LStatusPriorTestRequiredQuarter. Quarter = The quarter value of the
quarter being checked.

Exit the check.

Else

Set F2LStatusPriorTestRequiredQuarter = -1.

Append " [YEAR]Q[QTR]" to F2LStatusPriorTestRequiredQuarterMissingOpData (where [YEAR]
and [QTR are the year and number of the quarter being checked.

Environmental Protection Agency

Page 128 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 129 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

F2LSTAT-2

Check Name:

Locate Most Recent Prior Flow-to-Load Check

Related Former Checks:

Applicability:

Description:

Specifications:

If F2LStatusSystemResultDictionary contains lookup value for CurrentMh vRecord Sy stem ID

Set F2LStatusResult = F2LStatusSystemResultDictionary lookup value for CurrentMh vRecord Sy stem ID.
Set CurrentFlowToLoadStatusCheck = F2LStatusSystemC1ieckDictionary lookup value for
CurrentMh vRecord SystemlD.

Set F2LStatusMissingOpDataInfo = F2lStatusSystemMissingOpDictionary lookup value for
CurrentMh vRecord SystemlD.

Set F2LStatusResult = null.

Set CurrentFlowToLoadStatusCheck = null.

Set F2LStatusMissingOpDataInfo = null.

Locate the most recent record in F2LCheckRecordsForQaStatus where SystemlD is equal to

CurrentMh vRecord Sy stem ID. EndDate < CurrentReportingPeriodBeginDateHour, and TestResultCode is equal to

"PASSED" or "FAILED"

Locate a record in MpLocationNonLoadBasedRecords where the location is the location in CurrentMh vRecord
If found, and NonLoadBaselnd equals 1

Set F2LStatusResult = "IC-Exempt".

Locate a record in TestExtensionExemptionRecords where the SystemlD is equal to the

CurrentMh vRecord Sy stem ID. the ExtensionExemptionCode is equal to "F2LEXP", and the reporting period

is the period before the current reporting period.

Else

If not found

Else

If found

Set F2LStatusResult = "IC-Exempt".

Else

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemlD is
equal to CurrentMhvRecord. Sy stem ID. EndDate < CurrentReportingPeriodBeginDateHour, and

TestResultCode is not equal to "INVALID"

If not found

Set F2LStatusResu1t = "IC-No Prior RATA".

Environmental Protection Agency

Page 130 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else if F2LStatusPriorTestRequiredQuarter is equal to -1
Set F2LStatusResult = "Missing Op Data".

Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData.

Else if F2LStatusPriorTestRequiredQuarter is null or before the quarter of the located
RataTestRecordsByLocationForQaStatus record

Set F2LStatusResu1t = "IC".

Else if C«rre«JMftvi?ecorrf.SystemDesignationCode is equal to "RB"

Set F2LStatusResult = "Undetermined-No Prior Check reported for Redundant Backup
Monitor".

Else

Set F2LStatusResult = "OOC-No Prior Check".

Else

Set CurrentFlowToLoadStatusCheck = the located F2LCheckRecordsForOaStatus record
If the quarter of CurrentFlowToLoadStatusCheck is not the quarter before CurrentReportingPeriod
If F2LStatusPriorTestRequiredQuarter is equal to -1
Set F2LStatusResult = "Missing Op Data".

Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData.

Else if F2LStatusPriorTestRequiredQuarter is not null, and is after the quarter of
CurrentFlowToL oadStatusCh eck

if CurrentMhvRecord.SystemDesignationCode is equal to "RB"

Set F2LStatusResult = "Undetermined-No Prior Check reported for Redundant Backup
Monitor".

Else

Set F2LStatusResuh = "OOC-Prior Check Missing".

Else if CurrentFlowToLoadStatusCheck TestRssultCodQ = "PASSED"

Set F2LStatusResult = "IC".

Else

If CurrentFlowToLoadStatusCheck.TestResultCode = "PASSED"

Set F2LStatusResult = "IC".

Environmental Protection Agency

Page 131 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set F2LStatusSystemResultDictionary lookup value for CurrentMh vRecord SystemID = F2LStatusResu1t.
Set F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord.SystemID =
CurrentFlowToLoadStatusCheck.

Set F2lStatusSystemMissingOpDictionary lookup value for CurrentMhvRecord.SystemID =
F2LStatusMissingOpDataInfo.

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 132 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

F2LSTAT-3

Check Name:

Locate Intervening RATA

Related Former Checks:

Applicability:

Description:

Specifications:

Set F2LStatusInterveningRata = null.

If F2LStatusResult is null

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh v Record. SystemID, EndDateHour is after CurrentFlowToLoadStatusCheck.EndDateHour and before
CurrcntMh v Record. Begin Date/Beg in Hour, and TestResultCode is not equal to "INVALID"

If found,

Set F2LStatusResuti= "IC-Subsequent RATA Performed".

Set F2LStatusInterveningRata = The located record in RataTestRecordsByLocationForQaStatus.

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 133 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	F2LSTAT-4

Check Name:	Locate Most Recent QA Cert Event

Related Former Checks:

Applicability:

Description:

Validation Tables:

[Test Type to Required Test Code] (Cross Check Table)

Specifications:

Set F2LStatusQaCertEvent = null.

Set F2L Status Event Requires RATA = false.

Set F2L Status Event Requires Abbreviated Check = false.

If F2LStatusResult is null

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to
CurrentMh vRecord Sy stem ID. QaCertEventCode is equal to "312", QaCertEventDateHour is on or after
CurrentFlowToLoadStatusCheck.EndDcilcHour. and QaCertEventDateHour is on or before
CurrentMhvRecord.BcgmD'dlc/BcgmHour.

If found,

Set F2LStatusQaCertEvent = The located record in QACertificationEventRecords.

Locate a record in Cross-Check Table "Test Type to Required Test Code" where TestTypeCode begins with
"RATA" and RequireTestCode equals F2LStatusQaCertEvent.ReqmredTestCode.

If found,

F2L Status Event Requires RATA = true.

Locate a record in Cross-Check Table "Test Type to Required Test Code" where TestTypeCode is equal to
"AF2LCHK" and RequireTestCode equals F2LStatusQaCertEvent.ReqmredTestCode.

If found,

F2L Status Event Requires Abbreviated Check = true.

If F2 A Status Oa CertE ve/tf. La s t T c s t C o m p 1 c tc d D a t c H o ur is on or before CurrentMh vRecord Begin Date/Begin Hour

If F2L Status Event Requires Abbreviated Check is equal to true,

Set F2LStatusResult = "IC-Subsequent Abbreviated Flow-to-Load Check Passed".

If F2LStatusResult is null,

If F2LStatusQaCertEvent = null, or F2 A Status Oa CertE . C o n d i t i o n a 1D a t a B e g i n D a t e H o ur is after
CurrentMh vRecord B eginD ate/B eginHour,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is null or is equal to
CurrentMh vRecord Sy stem ID. EndDateHour is after CurrentFlowToLoadStatusCheck EndDalcHour and

Environmental Protection Agency

Page 134 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

before CurrentMhvRecord.BegmDate/BeginHour, and TestResultCode is equal to "INVALID".
If found

Set F2LStatusResu1t = "OOC-Check F ailed - Invalid RAT A Ignored".

Else

Set F2LStatusResult = "OOC-Check F ailed".

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 135 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

F2LSTAT-5

Check Name:

Locate Earliest Valid Required Test

Related Former Checks:

Applicability:

Description:

Specifications:

Set F2lStatusEarliestValidRequiredTest = null.

If F2LStatusResult is null

If F2L Status Event Requires RATA is true,

Locate earliest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh v Record SystemID, EndDateHour is after CurrentMh vRecord BcginDatc/BcginHour. and
TestResultCode is not equal to "INVALID".

If found,

Set F2LStatusEarliestValidRequiredTest = The located record in
Rata TestRecordsByL ocationForQaStatus .

If F2LStatusEarliestValidRequiredTest .TestResultCode is equal to "FAILED1

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh vRecord Sy stem ID. EndDateHour is after
F2LStatusOaCertEvent.Q'dCcrlEvcnlD'dlcHour and before

F2LStatusEarliestValidRequiredTest EndDatcHour. and TestResultCode is equal to "INVALID".

If found

Set F2LStatusResult = "OOC-Recertification RATA Failed - Invalid RATA Ignored".

Else

Set F2LStatusResult = "OOC-Recertification RATA Failed".

Else if F2L Status Event Requires Abbreviated Check is false,

Set F2LStatusResult = "OOC-Invalid Cert Event".

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 136 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

F2LSTAT-6

Check Name:

Determine Event Conditional Status and Final Status

Related Former Checks:

Applicability:

Description:

Specifications:

If F2LStatusResult is null

Set F2L Status Missing Op Data Info = null.
If F2L Status Event Requires RATA is true,

Set OperatingHourLimit = 168

If (the quarter of the F2LSfaftisgaC,«,£Z?v«i£ConditionalBeginDate is equal to the quarter of the
CurrentMhvRecord.Dale/Hour)

Count the number of HourlyOpData records for the location where OpTime is greater than 0 and Date/Hour is ON
OR AFTER the F2Z,5# OperatingHourLimit,

Set F2LStatusResult = "OOC-Conditional Period Expired".

else

Set F2LStatusResult = "IC-Conditional".

if (F2LStatusQaCertEventMmOpH.owisPnorQnaxter is null)

Set F2LStatusO(tCertE vent.MmOpHoursPnorQuarlcr = 0
Set F2LStatusOdCertEvent.M'
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Locate the record in OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OPHOURS", FuelCode is null, and the reporting period is
equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Set F2I0)

Set F2LStatusOaCertEvent M i nOp HoursPri orQuartcr =
OperatingSuppDataRecordsbyLocation.OpValue MINUS the
number of calendar hours in the quarter being checked that are
PRIOR to the F2 /, Status (2a CertE ve« f. C o n d i t i o n a 1B e g i n D a t e/ H o ur

If (OperatingSuppDataRecordsbyLocation.OpValue is less than the number
of calendar hours in the quarter begin checked that are ON OR AFTER the
F2LStatusQaCertEvent.ConditionalBeginDate/Hour)

Set F2LStatusOaCertEvent.M'dxOpHoursPnorQu'cirlcr =
OperatingSuppDataRecordsbyL ocation. Op Value.

else

Set F2LStatus(2aCertEventMi\\0,pY{oursPnorQiii\r{cr = the number
of calendar hours in the quarter being checked that are ON OR
AFTER the F2 /. Status (2a CertE ve« f. C o n d i t i o n a 1B e g i n D a t e/ H o ur.

Set F2LStatus(2aCertEveiitM\x\O^Y[ouxsPnorQii'<\r{cr =
F2LStatusQaCertEvent. MinOpHoursPriorQuarter +
OperatingSuppDataRecordsbyLocation. Op Value.

Set F2LStatusOaCertEvent M a\Op Hours PriorQuarter =
F2LStatusQaCertEvent. MaxOpHoursPriorQuarter +
OperatingSuppDataRecordsbyLocation. Op Value.

Environmental Protection Agency

Page 138 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (F2LSt(itusO(iCertEveiit.MmOpHoursPr\orQu'cirlcr == -1)

set F2LStatusResult to "Missing Op Data"

Else if (F2 LStatusOaCertEvent.MmOpHoursPnorQ\mrlcr > OperatingHourLimit)

If F2L Status Event Requires RATA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh vRecord SystemID, EndDateHour is on or after

F^LSfatasgaCgriEve/tf.ConditionalDataBeginDate/ConditionalDataBeginHour and on or before
CurrentMhvRecordBQgmDsiQlBQgmRoux, and TestResultCode is equal to "INVALID".

If found,

Set F2LStatusResult= "OOC-Conditional Period Expired-Invalid RATA Ignored".

Else

Set F2LStatusResult= "OOC-Conditional Period Expired".

Else

Set F2LStatusResult= "OOC-Conditional Period Expired".

Else if (Rpt Period Op Hours Accumulator Array for the location == -1)

Set F2LStatusResuh = "Invalid Op Data".

Else if (F2 LStatusOaCertEvent.MmOpHoursPnorQ\mrlcr + Rpt Period Op Hours Accumulator Array for the

Location > OperatingHourLimit)

If F2L Status Event Requires RATA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh vRecord SystemID, EndDateHour is on or after

F^LStorfMsgaCeriEvg/tf.ConditionalDataBeginDate/ConditionalDataBeginHour and on or before
CurrentMh vRecord Begin Date/Begin Hour, and TestResultCode is equal to "INVALID".

If found,

Set F2LStatusResult = "OOC-Conditional Period Expired-Invalid RATA Ignored".

Else

Set F2LStatusResult = "OOC-Conditional Period Expired".

Else

Set F2LStatusResult = "OOC-Conditional Period Expired".

Environmental Protection Agency

Page 139 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else if (F2LStatusOaCertEvent Ma\OpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array for the

Location > OperatingHourLimit)

Set F2LStatusResult = "Undetermined-Conditional Data".

Else

Set F2LStatusResult = "IC-Conditional".

If (FlowToLoadStatusResult does not begin with "IC")

Return result F2LStatusResult.

Results:

Result

Invalid Op Data

Missing Op Data

OOC-Check
Failed - Invalid
RATA Ignored
OOC-Conditiona
1 Period Expired
OOC-Conditiona
1 Period

Expired-Invalid
RATA Ignored
OOC-Invalid
Cert Event
OOC-Prior Check
Missing

OOC-Recertificat
ion RATA Failed
OOC-Recertificat
ion RATA Failed
- Invalid RAT A
Ignored

Undetermined-C
onditional Data

Undetermined-N
o Prior Check
reported for
Redundant
Backup Monitor

Response

The Flow-to-Load status for [SYSID] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or
invalid.

The Flow-to-Load status for [SYSID] could not be determined, because the Op
Supp Data record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

The prior Flow-to-Load Check for SystemID [SYSID] has failed, a subsequent
invalid RATA with was ignored.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [SYSID] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired. An invalid RATA was
ignored.

You reported an invalid QA Certification Event record for QACertEventCode

[code] QACertEventDate [eventdate] for [SYSID],

One or more Flow-to-Load Checks is missing for prior quarters.

The subsequent recertification RATA for SystemID [SYSID] with TestNumber
[subtestnum] failed.

The subsequent recertification RATA for SystemID [SYSID] with TestNumber
[subtestnum] failed. An invalid RATA was ignored.

The software could not determine if the current hour was within the conditional
data period for QACertEventCode [code] QACertEventDate [eventdate] for
SystemID [eventkey].

The software could not determine if a Flow-to-Load check is required for the
Redundant Backup Flow Monitor.

Severity

Non-Critical Error

Non-Critical Error

Non-Critical Error

Non-Critical Error
Non-Critical Error

Non-Critical Error
Non-Critical Error
Non-Critical Error
Non-Critical Error

Informational Message
Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 140 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Aggregation

Environmental Protection Agency

Page 141 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-1

Check Name:	Determine Start Quarter

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Set Start Quarter to null.

Set SO2 Start Quarter to null.

Set NOXR Start Quarter to null.

Set C02 Start Quarter to null.

Set Heat Input Start Quarter to null.

Set NOX Start Quarter to null.

Set Emissions Tolerance Deviators to null.

If (Quarter of the Current Reporting Period is greater than 1)

Locate the earliest Monitor Method for location where BeginDate is on or before the last day of the Current Reporting
Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.

If found,

If BeginDate is in a year prior to the current reporting period,

If (.Annual Reporting Requirement == true)

Set Start Quarter to 1.

else

Set Start Quarter to 2.

else

Set Start Quarter to the quarter of the BeginDate.

Locate the earliest Monitor Method for location where ParameterCode = "S02" or "S02M", BeginDate is on or before the
last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting
Period.

If found,

If BeginDate is in a year prior to the current reporting period,

Set SO2 Start Quarter to 1.

else

Set SO2 Start Quarter to the quarter of the BeginDate.

If (LMEAnnual == true)

Locate the earliest Monitor Method for location where ParameterCode = "NOXM", BeginDate is on or before the
last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current
Reporting Period.

else

if (Current Monitor Plan Location 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Current Reporting Period.

else

Locate the earliest Monitor Method for ALL locations in the monitor plan where ParameterCode = "NOXR",
BeginDate is on or before the last day of the Current Reporting Period, and EndDate is null or is on or after
Jan 1 of the year of the Current Reporting Period.

If the NOXR or NOXM method record was found,

Locate the earliest Location Program Record for location where ProgramCode is equal to "ARP", the Class is not
equal to "NA", and UnitMonitorCertBeginDate is on or before the last day of the Current Reporting Period, and the
EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.

If found,

If the EmissionsRecordingBeginDate is null,

If the later of the method BeginDate and the UnitMonitorCertBeginDate is in a year prior to the
current reporting period,

Set NOXR Start Quarter to 1.

else

Set NOXR Start Quarter to the quarter of the later of the method BeginDate and
UnitMonitorCertBeginDate .

Otherwise,

If the later of the method BeginDate and the EmissionsRecordingBeginDate is in a year prior to the
current reporting period,

Set NOXR Start Quarter to 1.

else

Set NOXR Start Quarter to the quarter of the later of the method BeginDate and
EmissionsRecordingBeginDate .

Locate the earliest Monitor Method for location where ParameterCode = "C02" or "C02M", BeginDate is on or before the
last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting
Period.

If found,

If BeginDate is in a year prior to the current reporting period,
Set CO2 Start Quarter to 1.

else

Set CO2 Start Quarter to the quarter of the BeginDate.

If (the Quarter of the Current Reporting Period is greater than 2 OR (Annual Reporting Requirement == true AND the Quarter of
the Current Reporting Period is equal to 2))

Locate the earliest Monitor Method for location where ParameterCode = "HI" or "HIT", MethodCode is not equal to "EXP",
BeginDate is on or before the last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the
year of the Current Reporting Period.

If found,

If BeginDate is in a year prior to the Current Reporting Period,
If Annual Reporting Requirement == true
Set Heat Input Start Quarter to 1

Environmental Protection Agency

Page 143 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Set Heat Input Start Quarter to 2

else if BeginDate is in Quarter 1 of the year of the Current Reporting Period AND Annual Reporting Requirement

== false,

Set Heat Input Start Quarter to to 2

Locate the earliest Monitor Method for location where ParameterCode is equal to "NOX" or "NOXM", BeginDate is on or
before the last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current
Reporting Period.

else if BeginDate is in Quarter 1 of the year of the Current Reporting Period AND Annual Reporting Requirement

== false,

Set NOX Start Quarter to to 2

else

Set Heat Input Start Quarter to the quarter of the BeginDate.

If found,

If BeginDate is in a year prior to the Current Reporting Period,
If Annual Reporting Requirement == true
Set NOX Start Quarter to 1

else

Set NOX Start Quarter to 2

else

Set NOX Start Quarter to the quarter of the BeginDate.

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 144 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-2

Check Name:	Compare S02 Mass Accumulator Values
Related Former Checks: HOURCV-22

Applicability:	General Check
Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

S02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "S02M" AND
UOM = "TON"

Current S02 Summary Value Record = Summary Value record at this location where

Parameter = "S02M" AND
Reporting Period ID = Current Reporting Period

if (Rpt Period S02 Mass Calculated Accumulator Array for this location == -1 OR Expected Summary Value S02 Array for this
location == false)

Rpt Period S02 Mass Calculated Value = null

else

Rpt Period S02 Mass Calculated Value = (Rpt Period S02 Mass Calculated Accumulator Array for this location / 2000,
and rounded to one decimal place).

if (Rpt Period S02 Mass Reported Accumulator Array for this location >= 0)

Rpt Period S02 Mass Reported Accumulator Array for this location = (Rpt Period S02 Mass Reported Accumulator
Array for this location/ 2000, and rounded to one decimal place).

if (Current S02 Summary Value Record is null OR Current S02 Summary Value Record. Current Reporting Period Total is null)
if (Expected Summary Value S02 Array fox this location == true)
return result C

else

if (Expected Summary Value S02 Array fox this location == false)

if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current S02 Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D

else

S02 Mass Quarterly Reported Value = Current S02 Summary ValueRecord.Cxxxxexit Reporting Period Total

if (S02 Mass Quarterly Reported Value < 0)
return result F

else if (S02 Mass Quarterly Reported Value is not rounded to one decimal place)
return result G

else if (Rpt Period S02 Mass Calculated Value is not null)

If (Rpt Period S02 Mass Calculated Value o S02 Mass Quarterly Reported Value)

if (ABS(Rpt PeriodS02 Mass Calculated Value - S02 Mass Quarterly Reported Value) > S02

Environmental Protection Agency

Page 145 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Mass Quarterly Tolerance)
return Result A

else

append "S02M" to Emissions Tolerance Deviators.

else

return result E

// if no result

if (Rpt Period S02 Mass Reported Accumulator Array for this location >= 0 AND ABS(Rpt Period S02 Mass
Reported Accumulator Array for this location - S02 Mass Quarterly Reported Value) > S02 Mass Quarterly
Tolerance)

Reported Emissions Value = Rpt Period S02 Mass Reported Accumulator Array for this location
return result B

Results:

Result
A

B

C
D

E
F
G

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for S02M for the reporting period is inconsistent with the recalculated value
of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for S02M is inconsistent with [sum], the sum of the hourly values reported
in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for S02M is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary Value
record for S02M, but there were no Hourly Operating Data records or appropriate
S02 Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 146 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-3

Check Name:	Compare C02 Mass Accumulator Values

Related Former Checks:	HOURCV-23

Applicability:	General Check
Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

If Current Reporting Period Year is greater than or equal to 2012

C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"

else

C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M-OLD" AND
UOM = "TON"

Current C02 Summary Value Record = Summary Value record at this location where

Parameter = "C02M" AND
Reporting Period ID = Current Reporting Period

if {Rpt Period C02 Mass Calculated Accumulator Array fox this location < 0 OR Expected Summary Value C02 Array for this
location == false)

Rpt Period C02 Mass Calculated Value = null

else

Rpt Period C02 Mass Calculated Value = Rpt Period C02 Mass Calculated Accumulator Array for this location,
rounded to one decimal place.

if (Rpt Period C02 Mass Reported Accumulator Array for this location >= 0)

Rpt Period C02 Mass Reported Accumulator Array fox this location = (Rpt Period C02 Mass Reported Accumulator
Array fox this location, rounded to one decimal place).

if (Current C02 Summary Value Record is null OR Current C02 Summary Value Record. Current Reporting Period Total is null)
if (Expected Summary Value C02 Array for this location == true)
return result C

else

if (Expected Summary Value C02 Array fox this location == false)

if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current C02 Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D

else

C02 Mass Quarterly Reported Value = Current CO2 Summary Value Record. Current Reporting Period Total

if (C02 Mass Quarterly Reported Value < 0)
return result F

else if (C02 Mass Quarterly Reported Value is not rounded to one decimal place)
return result G

else if (Rpt Period C02 Mass Calculated Value is not null)

Environmental Protection Agency

Page 147 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if {Rpt Period C02 Mass Calculated Value <> C02 Mass Quarterly Reported Value)

if (ABS{Rpt Period C02 Mass Calculated Value - C02 Mass Quarterly Reported Value) > C02
Mass Quarterly Tolerance)
return Result A

else

append "C02M" to Emissions Tolerance Deviators.

else

if {Rpt Period C02 Mass Calculated Accumulator Array fox this location == -1)
return result E

// if no result

if {Rpt Period C02 Mass Reported Accumulator Array for this location >= 0 AND AB S{Rpt Period C02 Mass
Reported Accumulator Array for this location - C02 Mass Quarterly Reported Value) > C02 Mass Quarterly
Tolerance)

Reported Emissions Value = Rpt Period C02 Mass Reported Accumulator Array for this location
return Result B

Results:

Result
A

B

C
D

E
F
G

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for C02M for the reporting period is inconsistent with the recalculated value
of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for C02M is inconsistent with [sum], the sum of the hourly values reported
in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for C02M is
missing or the record is missing.

You reported a value for the CurrentReportingPeriodTotal in the Summary Value
record for [param], but there was no emissions data in your file or an appropriate
C02 Method defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 148 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-4

Check Name:	Compare HI Accumulator Values

Related Former Checks:	HOURCV-24

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

HI Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"

Current HI Summary Value Record = Summary Value record at this location where

Parameter = "HIT" AND
Reporting Period ID = Current Reporting Period

if (Rpt Period HI Calculated Accumulator Array for this location == -1 OR Expected Summary Value HI Array for this location
== false)

Rpt Period HI Calculated Value = null

else

Rpt Period HI Calculated Value = Rpt Period HI Calculated Accumulator Array for this location, rounded to zero decimal
places.

if (Rpt Period HI Reported Accumulator Array for this location >= 0)

Rpt Period HI Reported Accumulator Array for this location = (Rpt Period HI Reported Accumulator Array for this
location, rounded to zero decimal places).

if (Current HI Summary Value Record is null OR Current HI Summary Value Record. Current Reporting Period Total is null)
if (Expected Summary Value HI Array for this location == true)
return result C

else

if (Expected Summary Value HI Array for this location == false)

if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current HI Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D

else

HI Quarterly Reported Value = Current HI Summary Value Record. Current Reporting Period Total

if (HI Quarterly Reported Value < 0)
return result F

else if (HI Quarterly Reported Value is not rounded to zero decimal places)
return result G

else if (Rpt Period HI Calculated Value is not null)

if (Rpt Period HI Calculated Value <> HI Quarterly Reported Value)

if (ABS(Rpt Period HI Calculated Value - HI Quarterly Reported Value) > HI Quarterly Tolerance)
return result A

else

append "HIT" to Emissions Tolerance Deviators.

Environmental Protection Agency

Page 149 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result E
// if no result

if {Rpt Period HI Reported Accumulator Array for this location >= 0 AND AB S{Rpt Period HI Reported
Accumulator Array for this location (rounded to zero decimal places) - HI Quarterly Reported Value) > HI Quarterly
Tolerance)

Reported Emissions Value = Rpt Period HI Reported Accumulator Array for this location
return Result B

Results:

Result
A

B

C
D

E
F
G

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for HIT for the reporting period is inconsistent with the recalculated value of
[calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for HIT is inconsistent with [sum], the sum of the hourly values reported in
the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for HIT is missing
or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary Value
record for HIT, but there were no Hourly Operating Data records or appropriate HI
Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 150 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-5

Check Name:	Compare Op Hours Values

Related Former Checks:	HOURCV-25

Applicability:	General Check
Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Op Hours Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPHOURS" AND
UOM = "HR"

Current Op Hours Summary Value Record = Summary Value record at this location where

Parameter = "OPHOURS" AND
Reporting Period ID = Current Reporting Period

if (Rpt Period Op Hours Accumulator Array for this location == -1 OR (LME HI Method is not null and location is a common pipe))
Rpt Period Op Hours Calculated Value = null
Rpt Period Op Days Calculated Value = null

else

Rpt Period Op Hours Calculated Value = Rpt Period Op Hours Accumulator Array for this location
Rpt Period Op Days Calculated Value = Rpt Period Op Days Accumulator Array for this location

if (Current Op Hours Summary Value Record is null OR Current Op Hours Summary Value Record. Current Reporting Period Total
is null)

If (LME HI Method is null or location is not a common pipe)
return result B

else

Op Hours Quarterly Reported Value = Current Op Hours Summary Value Record. Current Reporting Period Total

if (Op Hours Quarterly Reported Value < 0)
return result D

else if (Op Hours Quarterly Reported Value is not rounded to zero decimal places)
return result E

else if {Rpt Period Op Hours Calculated Value is not null)

if (Rpt Period Op Hours Calculated Value <> Op Hours Quarterly Reported Value)

if (ABS(Rpt Period Op Hours Calculated Value - Op Hours Quarterly Reported Value) > Op Hours
Quarterly Tolerance)

return Result A

else

append "OPHOURS" to Emissions Tolerance Deviators.

else

return result C

Environmental Protection Agency

Page 151 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C
D

E

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for OPHOURS is inconsistent with [calcval], the number of operating hours
reported in the Hourly Operating Data records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for OPHOURS is
missing or the record is missing.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 152 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-6

Check Name:	Compare Op Time Values

Related Former Checks:	HOURCV-26

Applicability:	General Check
Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Op Time Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPTIME" AND
UOM = "HR"

Current Op Time Summary Value Record = Summary Value record at this location where

Parameter = "OPTIME" AND
Reporting Period ID = Current Reporting Period

if {Rpt Period Op Time Accumulator Array for this location == -1 OR (LME HI Method is not null and location is a common pipe))
Rpt Period Op Time Calculated Value = null

else

Rpt Period Op Time Calculated Value = Rpt Period Op Time Accumulator Array for this location

if (Current Op Time Summary Value Record is null OR Current Op Time Summary Value Record. Current Reporting Period Total is
null)

If (LME HI Method is null or location is not a common pipe)
if (Legacy Data Evaluation == true)
return result B

else

return result E

else

Op Time Quarterly Reported Value = Current Op Time Summary Value Record. Current Reporting Period Total
if (Op Time Quarterly Reported Value >= 0)

if (Op Time Quarterly Reported Value is not rounded to two decimal places)
return result F

else

if (Rpt Period Op Time Calculated Value is not null)

if (Rpt Period Op Time Calculated Value <> Op Time Quarterly Reported Value)

if (ABS(Rpt Period Op Time Calculated Value - Op Time Quarterly Reported Value) > Op
Time Quarterly Tolerance)
return A

else

append "OPTIME" to Emissions Tolerance Deviators.

else

return result D

else

return result C

Environmental Protection Agency

Page 153 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D
E
F

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value

record for OPTIME is inconsistent with [calcval], the sum of the hourly values

reported in the Hourly Operating Data records for the reporting period.

You did not report a Summary Value record for OPTIME for the reporting period.

While this information was not required for legacy EDR data, it is required for

ECMPS.

The CurrentReportingPeriodTotal reported in the Summary Value record for
OPTIME is invalid. The value must be greater than or equal to 0.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal in the Summary Value record for OPTIME is
missing or the record is missing.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 154 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAGG-7

Check Name:

Compare NOx Rate Accumulator Values

Related Former Checks: HOURCV-27

Applicability:

General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

If {Expected Summary Value NOx Rate Array for this location == true)
if (LMEAnnual == true)

if (Rpt Period HI Calculated Value is not null and Rpt Period NOx Mass Calculated Value is not null)
If (Rpt Period NOx Mass Calculated Accumulator Array for this location = 0)

Rpt Period NOx Rate Calculated Value = 0

else

Rpt Period NOx Rate Calculated Value = Rpt Period NOx Mass Calculated Accumulator Array
for this location / Rpt Period HI Calculated Value, and round the result to three decimal places

if (Rpt Period NOx Rate Hours Accumulator Array for this location > 0 AND Rpt Period NOx Rate Calculated
Accumulator Array for this location >= 0)

Rpt Period NOx Rate Calculated Value = Rpt Period NOx Rate Calculated Accumulator Array for this
location / Rpt Period NOx Rate Hours Accumulator Array for the location, and round the result to three
decimal places

Rpt Period NOx Rate Sum = Rpt Period NOx Rate Calculated Accumulator Array for this location
Rpt Period NOx Rate Hours = Rpt Period NOx Rate Hours Accumulator Array for this location

else if (Rpt Period NOx Rate Hours Accumulator Array for this location == 0 AND Rpt Period NOx Rate
Calculated Accumulator Array for this location == 0)

Rpt Period NOx Rate Calculated Value = 0
Rpt Period NOx Rate Sum = 0
Rpt Period NOx Rate Hours = 0

else

Rpt Period NOx Rate Calculated Value = null
Rpt Period NOx Rate Sum = null
Rpt Period NOx Rate Hours = null

if (Rpt Period NOx Rate Hours Accumulator Array for this location > 0 AND Rpt Period NOx Rate Reported
Accumulator Array for this location >= 0)

Rpt Period NOx Rate Reported Accumulator Array for this location = Rpt Period NOx Rate Reported
Accumulator Array for this location / Rpt Period NOx Rate Hours Accumulator Array for this location,
and round the result to three decimal places

else

Rpt Period NOx Rate Reported Accumulator Array for this location = -1

else

Rpt Period NOx Rate Calculated Value = null

NOx Rate Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

else

Rpt Period NOx Rate Calculated Value = null

else

Environmental Protection Agency

Page 155 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Current NOx Rate Summary Value Record = Summary Value record at this location where

Parameter = "NOXR" AND
Reporting Period ID = Current Reporting Period

if (Current NOx Rate Summary Value Record is null OR Current NOx Rate Summary Value Record. Current Reporting Period
Total is null)

if (Expected Summary Value NOx Rate Array for this location == true)
return result C

else

if (Expected Summary Value NOx Rate Array for this location == false)

if {Rpt Period NOx Rate Hours Accumulator Array for this Location is not equal to 0 OR Current NOx Rate
Summary Value Record Cunent Reporting Period Total is not null)
return result D

else

NOx Rate Quarterly Reported Value = Current NOx Rate Summary Value Record. Current Reporting Period Total

If (NOx Rate Quarterly Reported Value < 0)
return result F

else if (Rpt Period NOx Rate Calculated Value is not null)

if ( A B S (Rpt Period N()x Rate Calculated Value - NOx Rate Quarterly Reported Value) > NOx Rate
Quarterly Tolerance)
return result A

else

return result E

//if no result

if (LMEAnnual == false)

if (Current Monitor Plan Location 7?ecw= 0 AND A B S (Rpt Period
NOx Rate Reported Accumulator Array for this location - NOx Rate Quarterly Reported Value) >
NOx Rate Quarterly Tolerance)

Reported Emissions Value = Rpt Period NOx Rate Reported Accumulator Array for this

location

return Result B

Environmental Protection Agency

Page 156 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E
F

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for NOXR for the reporting period is inconsistent with the recalculated value
of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for NOXR is inconsistent with [average], the average of the hourly values
reported in the DHV records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for NOXR is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary Value
record for NOXR, but this is not appropriate, either because there were no Hourly
Operating Data records in your emissions file, or because this value is not
consistent with the unit program records and monitoring methodologies in your
monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 157 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-8

Check Name:	Compare NOx Mass Accumulator Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

NOx Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXM" AND
UOM = "TON"

Current NOx Mass Summary Value Record = Summary Value record at this location where

Parameter = "NOXM" AND
Reporting Period ID = Current Reporting Period

if (Rpt Period NOx Mass Calculated Accumulator Array for this location == -1 OR Expected Summary Value NOx Mass Array for
this location == false)

Rpt Period NOx Mass Calculated Value = null

else

Rpt Period NOx Mass Calculated Value = Rpt Period NOx Mass Calculated Accumulator Array for this location / 2000,
and rounded to one decimal place).

if (Rpt Period NOx Mass Reported Accumulator Array for this location >= 0)

Rpt Period NOx Mass Reported Accumulator Array for this location = Rpt Period NOx Mass Reported Accumulator
Array for this location/ 2000, and rounded to one decimal place).

if (Current NOx Mass Summary Value Record is null OR Current NOx Mass Summary Value Record. Current Reporting Period
Total is null)

if (Expected Summary Value NOxMass Array for this location == true)
return result C

else

if (Expected Summary Value NOX Array for this location == false)

if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current NOx Mass Summary
Value Record. Current Reporting Period Total is not equal to 0)
return result D

else

NOx Mass Quarterly Reported Value = Current NOx Mass Summary Value Record. Current Reporting Period Total

If (NOx Mass Quarterly Reported Value < 0)
return result F

else if (NOx Mass Quarterly Reported Value is not rounded to one decimal place)
return result G

else if (Rpt Period NOx Mass Calculated Value is not null)

if (Rpt Period NOx Mass Calculated Value <> NOx Mass Quarterly Reported Value)

if ( AB SiRpt Period NOx Mass Calculated Value - NOx Mass Quarterly Reported Value) > NOx
Mass Quarterly Tolerance)

Environmental Protection Agency

Page 158 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return Result A

else

append "NOXM" to Emissions Tolerance Deviators.

else

return result E
// if no result

If (Rpt Period NOx Mass Reported Accumulator Array for this location >= 0 AND ABSiRpt Period NOx Mass
Reported Accumulator Array for this location - NOx Mass Quarterly Reported Value) > NOx Mass Quarterly
Tolerance)

Reported Emissions Value = Rpt Period NOx Mass Reported Accumulator Array for this location
return Result B

Results:

Result
A

B

C
D

E
F
G

Response

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for NOXM for the reporting period is inconsistent with the recalculated
value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value
record for NOXM is inconsistent with [sum], the sum of the hourly values reported
in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for NOXM is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary Value
record for NOXM, but there were no Hourly Operating Data records or appropriate
NOX Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param] could
not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 159 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAGG-10

Check Name:

Compare C02 Mass YTD Values

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Annual C02M Calculated Value = null

if (Rpt Period C02 Mass Calculated Value is not null OR Expected Summary Value C02 Array for this location == false)
if (Expected Summary Value C02 Array for this location == true)

If (Emissions Tolerance Deviators contains "C02M")

Annual C02M Calculated Value = Current C02 Summary Value Record. Current Reporting Period Total

Annual C02M Calculated Value = 0

If (Quarter of the Current Reporting Period is greater than 1)

If {CO2 Start Quarter is not null)

For each quarter in the current year from the CO2 Start Quarter to the quarter prior to the quarter of the
Current Reporting Period:

Locate an Op Supp Data record for the location and quarter where ParameterCode = "C02M".

If not found,

if (Expected Summary Value C02 Array for this location == true)
set Annual C02M Calculated Value to null
return result A

Otherwise,

add OpValue to Annual C02M Calculated Value.

else

set Annual C02M Calculated Value to null

if (Current C02 Summary Value Record is not null)

If (.Annual C02M Calculated Value == 0 AND Expected Summary Value C02 Array for this location == false)
set Annual C02M Calculated Value to null,
return result G

else if (Current C02 Summary Value 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (.Annual C02M Calculated Value is not null)

if (Annual C02M Calculated Value <> Current C02 Summary Value Record. YearToDateTotal)
return result C

// If no result

If (Current C02 Summary Value /?etwY/.OzoncScasonToDatcTotal is not null)
return result E

else

If {Annual C02M Calculated Value == 0 AND Expected Summary Value C02 Array for this location == false)
set Annual C02M Calculated Value to null.

If {Expected Summary Value C02 Array for this location == false AND Annual C02M Calculated Value >0)
return result F

Results:

Result
A

B
C

D

E

F
G

Usage:

1

Response

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for this parameter.

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 161 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAGG-11

Check Name:

Compare S02 Mass YTD Values

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Annual S02M Calculated Value = null

if {Rpt Period S02 Mass Calculated Value is not null OR Expected Summary Value S02 Array for this location == false)
if (Expected Summary Value S02 Array for this location == true)

If (Emissions Tolerance Deviators contains "S02M")

Annual S02M Calculated Value = Current S02 Summary Value Record. Current Reporting Period Total

Annual S02M Calculated Value = 0

If (Quarter of the Current Reporting Period is greater than 1)

If {SO2 Start Quarter is not null)

For each quarter from the SO2 Start Quarter to the quarter prior to the quarter of the Current Reporting
Period'.

Locate an Op Supp Data record for the location and quarter where ParameterCode = "S02M".
If not found,

if {Expected Summary Value S02 Array for this location == true)
set Annual S02M Calculated Value to null
return result A

Otherwise,

add Op Value to Annual S02M Calculated Value.

else

set Annual S02M Calculated Value to null

if (Current S02 Summary Value Record is not null)

if {Annual S02M Calculated Value == 0 AND Expected Summary Value S02 Array for this location == false)
set Annual S02M Calculated Value to null,
return result H

else if {Current S02 Summary Value 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Annual S02M Calculated Value is not null)

if (Annual S02M Calculated Value o Current S02 Summary Value 7?ecw 0)

return result G

Results:

Result
A

Response

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

The [paramname] emissions from this unit exceed the applicable number of tons
necessary to qualify as an LME unit. According to Part 75.19(b), you must install
the appropriate monitoring systems to measure [paramname] by December 31 of the
year following this reporting period.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for this parameter.

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.

Severity

Critical Error Level 1

B
C

Critical Error Level 1
Critical Error Level 1

D

Critical Error Level 1

E

Informational Message

F

Critical Error Level 1

G
H

Critical Error Level 1
Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 163 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAGG-12

Check Name:

Compare NOx Mass YTD and OS Values

Related Former Checks:
Applicability:

General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Annual NOXM Calculated Value = null
OS NOXM Calculated Value = null
NOXM Summary Invalid Fields = null
Imprecise Fields = null

if (Rpt Period NOx Mass Calculated Value is not null OR Expected Summary Value NOx Mass Array for this location == false)
if (Expected Summary Value NOx Mass Array for this location == true)

If (Annual Reporting Requirement == true)

If (Emissions Tolerance Deviators contains "NOXM")

Annual NOXM Calculated Value = Current NOX Mass Summary Value Record. Current Reporting
Period Total

else

Annual NOXM Calculated Value = Rpt Period NOx Mass Calculated Value

If (OS Reporting Requirement == true)

if (Quarter of the Current Reporting Period is equal to 2 or 3)

If (Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is

equal to 2)

OS NOXM Calculated Value = (Rpt Period NOx Mass Calculated Accumulator Array for
this location - April NOx Mass Calculated Accumulator Array for this location) / 2000,
rounded to one decimal place.

else

If (Emissions Tolerance Deviators contains "NOXM")

OS NOXM Calculated Value = Current NOX Mass Summary Value
Record. Current Reporting Period Total

else

OS NOXM Calculated Value = Rpt Period NOx Mass Calculated Value

else if (Quarter of the Current Reporting Period is equal to 4)

OS NOXM Calculated Value = 0

If (Annual Reporting Requirement == true)

Annual NOXM Calculated Value = 0

If (OS Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 1)
OS NOXM Calculated Value = 0

If (the Quarter of the Current Reporting Period is greater than 2 OR (Annual Reporting Requirement == true AND the

else

Environmental Protection Agency

Page 164 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Quarter of the Current Reporting Period is equal to 2))

If (NOX Start Quarter is not null)

For each quarter in the current year from the NOX Start Quarter to the quarter prior to the quarter of the
Current Reporting Period:

If this quarter is equal to 2 AND OS Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXMOS".

If not found,

if {Expected Summary Value NOx Mass Array for this location == true)
set AnnualNOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result A

otherwise,

Locate an Op Supp Data record for the location and quarter where
ParameterCode = "NOXM".

If found,

set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result A

Otherwise,

add OpValue to OS NOXM Calculated Value.

If this quarter is not equal to 2 OR Annual Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXM".

If not found,

if {Expected Summary Value NOx Mass Array for this location == true)
set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result B

Otherwise,

if Annual Reporting Requirement == true

add OpValue to Annual NOXM Calculated Value.

if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS NOXM Calculated Value.

Otherwise,

set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null.

if {Current NOX Mass Summary Value Record is not null)

Environmental Protection Agency

Page 165 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If ((OS NOXM Calculated Value + Annual NOXM Calculated Value == 0) AND Expected Summary Value NOx
Mass Array for this location == false)

set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null,
return result K

Otherwise,

If (Current NOX Mass Summary Value Record. YearToDateTotal is null and Annual Reporting
Requirement == true) OR (Current NOX Mass Summary Value Record. Y carToDatcT otal is less than 0,
append "YearToDateTotal" to NOXM Summary Invalid Fields

If (Current NOX Mass Summary Value	OzoneSeasonT oDateT otal is null and OS Reporting

Requirement == true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current
NOX Mass Summary Value	OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to NOXM Summary Invalid Fields

If (Current NOX Mass Summary Value Record. YearT oDateTotal is not rounded to one decimal place)
append "YearToDateTotal" to Imprecise Fields

If (Current NOX Mass Summary Value /?ecwY/.OzoncScasonToDatcT otal is not rounded to one decimal
place)

append "OzoneSeasonToDateTotal" to Imprecise Fields

If (NOXM Summary Invalid Fields is not null)
return result C

else if (Imprecise Fields is not null)

Set NOXM Summary Invalid Fields to Imprecise Fields
return result E

else if (Annual NOXM Calculated Value is not null OR OS NOXM Calculated Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXM" AND
UOM = "TON"

if (Annual NOXM Calculated Value is not null AND Annual NOXM Calculated Value o Current
NOX Mass Summary Value Record. YearT oDateTotal)

append "YearToDateTotal" to NOXM Summary Invalid Fields

if (OS NOXM Calculated Value is not null AND OS NOXM Calculated Value <> Current NOX
Mass Summary Value Record. OzoneSeasonT oDateT otal)

if (ABS(/AV NOXM Calculated Value - Current NOXM Summary Value

Record. OzoneSeasonT oDateTotal) > Tolerance OR quarter of the Current Reporting Period

is greater than 2)

append "OzoneSeasonToDateTotal" to NOXM Summary Invalid Fields

If NOXM Summary Invalid Fields is not null,

If (NOXM Summary Invalid Fields contains "Year")

If (NOXM Summary Invalid Fields contains "Ozone")

Environmental Protection Agency

Page 166 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result D

else

return result H

else

return result I

// if no result

if (OS Reporting Requirement == false and Current NOXM Summary Value
7?ecw 0 OR
Annual NOXM Calculated Value >0))

return result J

Environmental Protection Agency

Page 167 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E
F

H

I

J
K

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the
OzoneSeasonToDateTotalof [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

The [paramname] emissions from this unit exceed the applicable number of tons
necessary to qualify as an LME unit. According to Part 75.19(b), you must install
the appropriate monitoring systems to measure [paramname] by December 31 of the
year following this reporting period.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for locations that are not associated with an ozone-season
program.

The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param]
is inconsistent with the recalculated value of [oscalc].

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.

You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 168 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-13

Check Name:	Compare NOx Rate YTD Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Annual NOXR Calculated Value = null
If (LMEAnnual == true)

Set Total NOx Mass to null.

if {Expected Summary Value NOx Rate Array for this location == true)

if (Rpt Period NOx Mass Calculated Accumulator Array for this location is greater than or equal to 0 AND Rpt
Period HI Calculated Value is not null)

Set Total NOx Mass to Rpt Period NOx Mass Calculated Accumulator Array for this location.

Set Total HI to Rpt Period HI Calculated Value.

else

Set Total NOx Mass to 0.

Set Total HI to 0.

If (Quarter of the Current Reporting Period is greater than 1 AND Total NOx Mass is not null)

if (NOXR Start Quarter is not null)

For each quarter in the current year from the NOXR Start Quarter to the quarter prior to the quarter of the
Current Reporting Period:

Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXR".

If not found,

if (Expected Summary Value NOx Rate Array for this location == true)
set Total NOx Mass to null,
return result A

Otherwise,

set NOX Value to OpValue.

Locate an Op Supp Data record for the location and quarter where ParameterCode = "HIT".

If not found,

if (Expected Summary Value NOx Rate Array for this location == true)
set Total HI to null,
return result E

Environmental Protection Agency

Page 169 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

Add OpValue to Total HI.

Calculate NOX Value = NOX Value * OpValue, and round the result to 1 decimal place.
Add NOX Value to Total NOx Mass.

If (Total NOx Mass is not null AND Total HI is not null)

If (Total NOx Mass == 0)

Set AnnualNOXR Calculated Value to 0.

else

Calculate Annual NOXR Calculated Value = Total NOx Mass / TotalHI, and round the result to 3 decimal
places.

Set TotalOpHours to null.

if {Expected Summary Value NOx Rate Array for this location == true)
if {Rpt Period NOx Rate Calculated Value is not null)

Annual NOXR Calculated Value = Rpt Period NOx Rate Sum

Set TotalOpHours to Rpt Period NOx Rate Hours.

else

Set TotalOpHours to 0.

If (Quarter of the Current Reporting Period is greater than 1 AND TotalOpHours is not null)

if {NOXR Start Quarter is not null)

For each quarter from the NOXR Start Quarter to the quarter prior to the quarter of the Current Reporting
Period'.

Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXRSUM".
If found,

Add OpValue to Annual NOXR Calculated Value.

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXRHRS".

If found,

Add OpValue to TotalOpHours.

If not found,

set Annual NOXR Calculated Value to null
return result A

Otherwise,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXR".

Environmental Protection Agency

Page 170 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If not found,

if (Expected Summary Value NOx Rate Array for this location == true)
set Annual NOXR Calculated Value to null
return result A

Otherwise,

set NOXVal to OpValue

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"OPHOURS" and FuelCode is null.

If not found,

if (Expected Summary Value NOx Rate Array for this location == true)
set Annual NOXR Calculated Value to null
return result B

Otherwise,

Add OpValue to TotalOpHours.

Add OpValue * NOXVal to Annual NOXR Calculated Value

Otherwise,

set Annual NOXR Calculated Value to null.

If (Annual NOXR Calculated Value is not null)

If (TotalOpHours == 0)

Set Annual NOXR Calculated Value to 0.

else if (Annual NOXR Calculated Value >0)

Calculate Annual NOXR Calculated Value = Annual NOXR Calculated Value / TotalOpHours, and round
the result to 3 decimal places.

if (Current NOXR Summary Value Record is not null)

If (Annual NOXR Calculated Value == 0 AND Expected Summary Value NOx Rate Array for this location == false)
set Annual NOXR Calculated Value to null,
return result H

else if (Current NOXR Summary Value Record. Ye arToD ate Total is null or is less than 0)
return result C

else if (Annual NOXR Calculated Value is not null)

if (Annual NOXR Calculated Value o Current NOXR Summary Value	YcarToDatcTotal )

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

if (ABS( Annual NOXR Calculated Value - Current NOXR Summary Value Record. YearToDateTotal) >
Tolerance)

return result D

// if no result

Environmental Protection Agency

Page 171 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (Current NOXR Summary Value 7?ecw 0)

return result G

Results:

Result
A

B

C
D

G
H

Response

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for OPHOURS is missing for one or more previous reporting periods. If
you have submitted emissions data for prior quarters, you should be able to
retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

The program could not determine year-to-date for [param], because the Op Supp
Data record for HIT is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for this parameter.

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for NOXR, but this is not appropriate,
because this record is not consistent with the unit program records and monitoring
methodologies in your monitoring plan. You only report a NOXR Summary Value if
the unit belongs to the Acid Rain program.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 172 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-14

Check Name:	Compare Total Heat Input YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Annual HIT Calculated Value = null
OS HIT Calculated Value = null
HI Summary Invalid Fields = null
Imprecise Fields = null

if (Rpt Period HI Calculated Value is not null OR Expected Summary Value HI Array for this location == false)

if (Expected Summary Value HI Array for this location == true)

If (Annual Reporting Requirement == true)

If (Emissions Tolerance Deviators contains "HIT")

Annual HI Calculated Value = Current HI Summary Value Record. Current Reporting Period Total

else

Annual HI Calculated Value = Rpt Period HI Calculated Value

If (OS Reporting Requirement == true)

if (the Quarter of the Current Reporting Period is equal to 2 or 3)

If (Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is

equal to 2)

OS HIT Calculated Value = Rpt Period HI Calculated Accumulator Array for this location
- April HI Calculated Accumulator Array fox this location, and round the result to zero
decimal places.

else

If (Emissions Tolerance Deviators contains "HIT")

OS HIT Calculated Value = Current HI Summary Value Record. Current Reporting
Period Total

else

OS HIT Calculated Value = Rpt Period HI Calculated Value

else if (Quarter of the Current Reporting Period is equal to 4)

OS HIT Calculated Value = 0

else

If (Annual Reporting Requirement == true)

Annual HI Calculated Value = 0

If (OS Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 1)

OS HIT Calculated Value = 0

If (the Quarter of the Current Reporting Period is greater than 2 OR (Annual Reporting Requirement == true AND the
Quarter of the Current Reporting Period is equal to 2))

Environmental Protection Agency

Page 173 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Heat Input Start Quarter is not null)

For each quarter in the current year from the Heat Input Start Quarter to the quarter prior to the quarter of
the Current Reporting Period:

If this quarter is equal to 2 AND OS Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"HITOS".

If not found,

if (Expected Summary Value HI Array for this location == true)
set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result A

otherwise,

Locate an Op Supp Data record for the location and quarter where
ParameterCode = "HIT".

If found,

set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result A

Otherwise,

add OpValue to OS HIT Calculated Value.

If this quarter is not equal to 2 OR Annual Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode = "HIT".

If not found,

if {Expected Summary Value HI Array for this location == true)
set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result B

Otherwise,

if Annual Reporting Requirement == true

add OpValue to Annual HIT Calculated Value.

if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS HIT Calculated Value.

Otherwise,

set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null.

if (Current HI Summary Value Record is not null)

If ((OS HIT Calculated Value + Annual HIT Calculated Value == 0) AND Expected Summary Value HI Array
for this location == false)

set Annual HIT Calculated Value to null.

Environmental Protection Agency

Page 174 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set OS HIT Calculated Value to null
return result K

Otherwise,

If {Current HI Summary Value	YearToDateTotal is null and Annual Reporting Requirement ==

true) OR (Current HI Summary Value Record. Ye arToD ate Total is less than 0,
append " YearToDateTotal" to HIT Summary Invalid Fields

If (Current HI Summary Value	OzoneSeasonToDateTotal is null and OS Reporting Requirement

== true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current HI Summary

Value	OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

If i Current HI Summary Value Record. YearToDateTotal is not rounded to zero decimal places)
append "YearToDateTotal" to Imprecise Fields

If i Current HI Summary Value /?ecwY/.OzoncScasonToDatcTotal is not rounded to zero decimal places)
If (Legacy Data Evaluation == false OR Current HI Summary Value
Record. OzoneSeasonToDateTotal is not rounded to one decimal place)
append "OzoneSeasonToDateTotal" to Imprecise Fields

If (HIT Summary Invalid Fields is not null)
return result C

else if (Imprecise Fields is not null)

set HIT Summary Invalid Fields to Imprecise Fields
return result E

else if (Annual HIT Calculated Value is not null OR OS HIT Calculated Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"

if (Annual HIT Calculated Value is not null AND Annual HIT Calculated Value <> Current HI
Summary Value Record. YearToDateTotal)

append "YearToDateTotal" to HIT Summary Invalid Fields

if (OS HIT Calculated Value is not null AND OS HIT Calculated Value <> Current HI Summary
Value Record. OzoneSeasonT oDateT otal)

If (Legacy Data Evaluation == false)

if (ABSfCAS' HIT Calculated Value - Current HI Summary Value
Record.OzoneSeasonToDateTotal) > Tolerance OR the quarter of the Current
Reporting Period is greater than 2)

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

else

if (ABSfCAS' HIT Calculated Value - Current HI Summary Value

Environmental Protection Agency

Page 175 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

7?ecw Tolerance OR
the quarter of the Current Reporting Period is greater than 2)

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

If (HIT Summary Invalid Fields is not null)

If (HIT Summary Invalid Fields contains "Year")

If (HIT Summary Invalid Fields contains "Ozone")
return result D

else

return result H

else

If (Legacy Data Evaluation == true)
return result F

else

return result I

// if no result

if (OS Reporting Requirement == false and Current HI Summary Value /?t;twY/.OzoncScasonToDateTotal
is not null)

return result G

else if (Annual Reporting Requirement == false and Current HI Summary Value Record. YcarToDatcTotal
is not null)

return result L

else

If (Annual HIT Calculated Value == 0 AND Expected Summary Value HI Array for this location == false)
set Annual HIT Calculated Value to null.

If (OS HIT Calculated Value == 0 AND Expected Summary Value HI Array for this location == false)
set OS HIT Calculated Value to null

If (Expected Summary Value HI Array for this location == false AND (Annual HIT Calculated Value > 0 OR OS
HIT Calculated Value > 0))

return result J

Environmental Protection Agency

Page 176 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E
F
G

H

I

J
K

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the
OzoneSeasonToDateTotalof [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param]
is inconsistent with the recalculated value of [oscalc].

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for locations that are not associated with an ozone-season
program.

The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param]
is inconsistent with the recalculated value of [oscalc].

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.

You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Informational Message
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 177 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-15

Check Name:	Compare Operating Time YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Annual OPTIME Calculated Value = null
OS OPTIME Calculated Value = null
OPTIME Summary Invalid Fields = null
Imprecise Fields = null

if (Rpt Period Op Time Calculated Value is not null)

If Annual Reporting Requirement == true

If (Emissions Tolerance Deviators contains "OPTIME")

Annual OPTIME Calculated Value = Current Op Time Summary Value Record. Current Reporting Period
Total

else

Annual OPTIME Calculated Value = Rpt Period Op Time Calculated Value

If OS Reporting Requirement == true)

if (the Quarter of the Current Reporting Period is equal to 2 or 3)

If Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal to 2,
OS OPTIME Calculated Value = Rpt Period Op Time Accumulator Array for this location - April
Op Time Accumulator Array for this location.

else

If (Emissions Tolerance Deviators contains "OPTIME")

OS OPTIME Calculated Value = Current Op Time Summary Value Record. Current
Reporting Period Total

else

OS OPTIME Calculated Value = Rpt Period Op Time Calculated Value

else if (Quarter of the Current Reporting Period is equal to 4)

OS OPTIME Calculated Value = 0

If (the Quarter of the Current Reporting Period is greater than 2 OR (Annual Reporting Requirement == true AND the
Quarter of the Current Reporting Period is equal to 2))

If (Start Quarter is not null)

For each quarter in the current year from the Start Quarter to the quarter prior to the quarter of the Current
Reporting Period:

If this quarter is equal to 2 AND OS Reporting Requirement == true

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"OSTIME".

Environmental Protection Agency

Page 178 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

If not found,

set Annual OPTIME Calculated Value to null,
set OS OPTIME Calculated Value to null

Locate the Facility record for the location.

If the First ECMPS Reporting Period in the retrieved record is not null AND is on or
before the 2nd quarter of the current year,
return result A.

exit for.

Otherwise,

add OpValue to OS OPTIME Calculated Value.

If this quarter is not equal to 2 OR Annual Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"OPTIME".

If not found,

if Annual Reporting Requirement == true

set Annual OPTIME Calculated Value to null.

if OS Reporting Requirement == true

set OS OPTIME Calculated Value to null.

Locate the Facility record for the location.

If the First ECMPS Reporting Period in the retrieved record is not null AND is on or
before the Start Quarter of the current year,
return result B.

exit for.

Otherwise,

if Annual Reporting Requirement == true

add OpValue to Annual OPTIME Calculated Value

if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS OPTIME Calculated Value.

Otherwise,

set Annual OPTIME Calculated Value to null,
set OS OPTIME Calculated Value to null.

if (Current Op Time Summary Value Record is not null)

If (Current Op Time Summary Value	YearToDateTotal is null and Annual Reporting Requirement == true)

OR

(Current Op Time Summary Value Record. YearToDateTotal is less than 0,
append "YearToDateTotal" to OPTIME Summary Invalid Fields

If (Current Op Time Summary Value .Recon/.OzoneSeasonToDateTotal is null and OS Reporting Requirement ==
true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current Op Time Summary Value

Environmental Protection Agency

Page 179 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to OPTIME Summary Invalid Fields

If (Current Op Time Summary Value Record. Ye arToD ate Total is not rounded to two decimal places)
append " YearToDateTotal" to Imprecise Fields

If (Current Op Time Summary Value Record. OzoneSeasonToDateTotal is not rounded to two decimal places)
append "OzoneSeasonToDateTotal" to Imprecise Fields

If (OPTIME Summary Invalid Fields is not null)
return result C

else if (.Imprecise Fields is not null)

Set OPTIME Summary Invalid Fields to Imprecise Fields
return result E

else if (.Annual OPTIME Calculated Value is not null OR OS OPTIME Calculated Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPTIME" AND
UOM = "HR"

if (Annual OPTIME Calculated Value is not null AND Annual OPTIME Calculated Value <> Current Op
Time Summary Value Record. YearToDateTotal)

append "YearToDateTotal" to OPTIME Summary Invalid Fields

if (OS OPTIME Calculated Value is not null AND OS OPTIME Calculated Value <> Current Op Time
Summary Value Record.OzoneSeasonToDateTotal)

if (ABSCOiS1 OPTIME Calculated Value - Current Op Time Summary Value

Record. OzoneSeasonToDateTotal) > Tolerance OR quarter of the Current Reporting Period is

greater than 2)

append "OzoneSeasonToDateTotal" to OPTIME Summary Invalid Fields

If OPTIME Summary Invalid Fields is not null,

If (OPTIME Summary Invalid Fields contains "Year")

If (OPTIME Summary Invalid Fields contains "Ozone")
return result D

else

return result G

else

return result H

// if no result

if (OS Reporting Requirement == false and Current Op Time Summary Value Record.OzoneSeasonToDateTotal is
not null)

return result F

else if (Annual Reporting Requirement == false and Current Op Time Summary Value Record. Y earT oDateT otal is
not null)

return result I

Environmental Protection Agency

Page 180 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E
F

G
H
I

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the
OzoneSeasonToDateTotalof [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for locations that are not associated with an ozone-season
program.

The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param]
is inconsistent with the recalculated value of [oscalc].

You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 181 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-16

Check Name:	Compare Operating Hours YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Annual OPHOURS Calculated Value = null
OS OPHOURS Calculated Value = null
OPHOURS Summary Invalid Fields = null
Imprecise Fields = null

if (Rpt Period Op Hours Calculated Value is not null)

If Annual Reporting Requirement == true

If (Emissions Tolerance Deviators contains "OPHOURS")

Annual OPHOURS Calculated Value = Current Op Hours Summary Value Record. Current Reporting
Period Total

else

Annual OPHOURS Calculated Value = Rpt Period Op Hours Calculated Value

If OS Reporting Requirement == true)

if (the Quarter of the Current Reporting Period is equal to 2 or 3)

If Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal to 2,
OS OPHOURS Calculated Value = Rpt Period Op Hours Accumulator Array for this location -
April Op Hours Accumulator Array for this location.

else

If (Emissions Tolerance Deviators contains "OPHOURS")

OS OPHOURS Calculated Value = Current Op Hours Summary Value Record. Current
Reporting Period Total

else

OS OPHOURS Calculated Value = Rpt Period Op Hours Calculated Value

else if (Quarter of the Current Reporting Period is equal to 4)

OS OPHOURS Calculated Value = 0

If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the
Quarter of the Current Reporting Period is equal to 2))

If i Start Quarter is not null)

For each quarter in the current year from the Start Quarter to the quarter prior to the quarter of the Current
Reporting Period:

If this quarter is equal to 2 AND OS Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =
"OSHOURS" and FuelCd is null.

If not found,

Environmental Protection Agency

Page 182 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Annual OPHOURS Calculated Value to null,
set OS OPHOURS Calculated Value to null
return result A

Otherwise,

add OpValue to OS OPHOURS Calculated Value.

If this quarter is not equal to 2 OR Annual Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode =

"OPHOURS" and FuelCd is null.

If not found,

set Annual OPHOURS Calculated Value to null,
set OS OPHOURS Calculated Value to null
return result B

Otherwise,

if Annual Reporting Requirement == true

add OpValue to Annual OPHOURS Calculated Value.

if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS OPHOURS Calculated Value.

Otherwise,

set Annual OPHOURS Calculated Value to null,
set OS OPHOURS Calculated Value to null.

if (Current Op Hours Summary Value Record is not null)

If (Current Op Hours Summary Value Record. YearToDateTotal is null and Annual Reporting Requirement ==

true) OR

(iCurrent Op Hours Summary Value Record. YearToDateTotal is less than 0,
append "YearToDateTotal" to OPHOURS Summary Invalid Fields

If (Current Op Hours Summary Value /?t;twY/.OzoncScasonToDatcTotal is null and OS Reporting Requirement ==

true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current Op Hours Summary Value

Record. OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to OPHOURS Summary Invalid Fields

If (Current Op Hours Summary Value Record. YearT oDateTotal is not rounded to zero decimal places)
append "YearToDateTotal" to Imprecise Fields

If (Current Op Hours Summary Value Record. OzoneSeasonT oDateTotal is not rounded to zero decimal places)
append "OzoneSeasonToDateTotal" to Imprecise Fields

If (OPHOURS Summary Invalid Fields is not null)
return result C

else if (Imprecise Fields is not null)

set OPHOURS Summary Invalid Fields to Imprecise Fields
return result E

Environmental Protection Agency

Page 183 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Annual OPHOURS Calculated Value is not null OR OS OPHOURS Calculated Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPHOURS" AND
UOM = "HR"

if (.Annual OPHOURS Calculated Value is not null AND Annual OPHOURS Calculated Value <> Current
Op Hours Summary Value Record. YearToDateTotal)

append "YearToDateTotal" to OPTIME Summary Invalid Fields

if (OS OPHOURS Calculated Value is not null AND OS OPHOURS Calculated Value <> Current Op
Hours Summary Value Record. OzoneSeasonToDateTotal)

if (ABSCOiS1 OPHOURS Calculated Value - Current Op Hours Summary Value

Record.OzoneSeasonToDateTotal) > Tolerance OR quarter of the Current Reporting Period is

greater than 2)

append "OzoneSeasonToDateTotal" to OPHOURS Summary Invalid Fields

If OPHOURS Summary Invalid Fields is not null,

If (OPHOURS Summary Invalid Fields contains "Year")

If (OPHOURS Summary Invalid Fields contains "Ozone")
return result D

else

return result G

else

return result H

// if no result

if (OS Reporting Requirement == false and Current Op Hours Summary Value Record. OzoneSeasonT oDateTotal
is not null)

return result F

else if (Annual Reporting Requirement == false and Current Op Hours Summary Value Record. YearToDateTotal
is not null)

return result I

Environmental Protection Agency

Page 184 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E
F

G
H
I

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the
OzoneSeasonToDateTotalof [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for locations that are not associated with an ozone-season
program.

The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param]
is inconsistent with the recalculated value of [oscalc].

You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 185 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-17

Check Name:	Check BC02 Summary Value

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Current BC02 Summary Value Record = Summary Value record at this location where
Parameter = "BC02" AND
Reporting Period ID = Current Reporting Period

Set RGGI Begin Date, RGGI Start Quarter, AND BC02 Quarterly Reported Value to null.

if (Current BC02 Summary Value Record is not null)

if (CurrentMonitorPlanLocationRecord. StackPipelD is not null)
return result A

Locate a Program record for the unit where the ProgramCode == "RGGI", the UnitMonitorCertBeginDate is on or
prior to the last day of the reporting period, and the EndDate is null or is on or after the first day of reporting period.

If not found,

return result B

else

Set RGGI Begin Date to the later of the UnitMonitorCertBeginDate and the EmissionsRecordingBeginDate
(if not null) in the retrieved record.

If RGGI Begin Date is in a year prior to the current reporting period,

Set RGGI Start Quarter to 1

else

Set RGGI Start Quarter to the quarter of the RGGI Begin Date.

if {Current BC02 Summary Value Record.Current Reporting Period Total <0)
return result C

else if {Current BC02 Summary Value Record. Current Reporting Period Total is not rounded to one
decimal place)

return result D

else

BC02 Quarterly Reported Value = Current BC02 Summary Value Record. Current Reporting
Period Total

Environmental Protection Agency

Page 186 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E

Response

You reported a Summary Value record for [param], but this value should only be
reported at the unit, not at a stack or pipe.

You reported a Summary Value record for BC02, but this location does not belong
to the RGGI program during this reporting period.

The CurrentReportingPeriodTotal reported in the Summary Value record for [param]
is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

This check result is obsolete.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 187 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAGG-18

Check Name:	Compare BC02 Mass YTD Values

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

Set Annual BC02 Calculated Value to null.

If (BC02 Quarterly Reported Value is not null)

Annual BC02M Calculated Value = BC02 Quarterly Reported Value

else

Annual BC02M Calculated Value = -1

If (RGGI Start Quarter is not null AND Quarter of the Current Reporting Period is greater than 1)

For each quarter in the current year from the RGGI Start Quarter to the quarter prior to the quarter of the Current Reporting
Period'.

Locate an Op Supp Data record for the location and quarter where ParameterCode = "BC02".

If not found,

If (BC02 Quarterly Reported Value is not null)

set Annual BC02 Calculated Value to null
return result A

Otherwise,

If {Annual BC02M Calculated Value == -1)

Set Annual BC02M Calculated Value to Op Value

else

add Op Value to Annual BC02 Calculated Value.

If (Current BC02 Summary Value Record is not null)

If (Annual BC02M Calculated Value = -1)

set Annual BC02 Calculated Value to null
return result G

else if (Current BC02 Summary Value 7?ecw Current BC02 Summary Value 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Parameter = "C02M" AND
UOM = "TON"

if (ABS( Annual BC()2 Calculated Value - Current BC02 Summary Value	Ye arToD ate Total) >

Tolerance)

return result D

// If no result

If {Current BC02 Summary Value Record. OzoneSeasonToDateTotal is not null)
return result E.

else

If (Annual BC02 Calculated Value == -1)

set Annual BC02 Calculated Value to null

If (Annual BC02 Calculated Value >0)

return result F

Results:

Result
A

B
C

D

E

F
G

Response

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The [fieldname] in the Summary Value record for [param] is missing or invalid.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].

You reported OzoneSeasonToDate in the Summary Value record for [param], but
this is not valid for this parameter.

You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 189 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Appendix D

Environmental Protection Agency

Page 190 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-1

Check Name:

Initialize Accumulators for Appendix D Calculations

Related Former Checks:

Applicability:

Appendix D Check

Description:

Specifications:

HI App D Accumulator = 0
S02 App D Accumulator = 0
CO 2 App D Accumulator = 0
NOXR App E Accumulator = 0
Current Fuel Flow Record = null
Current Fuel Group = null
Fuels Used List = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Appendix D/E Unit-Level Initialization

Environmental Protection Agency

Page 191 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-3

Check Name:

Initialize Fuel Flow Record

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Current Fuel Group = Current Fuel Flow Record. Fuel_Group_Cd

if (Current Fuel Flow Record UnitFlie 1Cd in set {OGS, PRG,OOL})
Special Fuel Burned = true

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 192 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-4

Check Name:

Check Fuel Usage Time

Related Former Checks:

Applicability:

Appendix D Check

Description:

Specifications:

HFF Usage Time Status = true

If (Current Fuel Flow 7?ecw 1)

HFF Usage Time Status = false
return result A

else if {Current Hourly Op Record. OperatingTime > 0 AND Current Hourly Op ,/?ecw Current Hourly Op Record. OperatingTime)

HFF Usage Time Status = false
return result B

else if (Hourly Fuel Flow Count For Gas + Hourly Fuel Flow Count For Oil == 1 AND (MP Pipe Config for Hourly
Checks is null OR Current Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

HFF SODC Status = true
If (Current Fuel Flow 7?ecw "E")
HFF SODC Status == false
return result E

else if {Current Fuel Flow Record. SourceOfDataVolumetricCode in set {5, 6} AND HFF Fuel Indicator Code o

"I")

HFF SODC Status == false
return result F

Results:

Result	Response

A	You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you

reported a [ratefieldname],

B	You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not

report a [ratefieldname].

C	The SourceOfDataVolumetricCode reported in the HFF record for FuelCode

[fueled] is invalid.

D	You reported a [fieldname] of 3 in the HFF record for FuelCode [fueled], but,

according to the qualification record in your monitoring plan, this is not a peaking
unit.

E	You reported a [fieldname] of 4 in the HFF record for FuelCode [fueled], which

indicates that the fuel is an emergency fuel, but according to the Unit Fuel record in
your monitoring plan, this fuel is not an emergency fuel.

F	You reported a [fieldname] of [sodc] in the HFF record for FuelCode [fueled], which

indicates that the fuel is an igniter fuel, but according to the Unit Fuel record in
your monitoring plan, this fuel is not an igniter fuel.

HOURAD-5

Check Volumetric SODC Code
Appendix D Check

Seventy

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 194 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 195 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-6

Check Name:

Check Oil Mass SODC Code

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

HFF Mass SODC Status == true

If (Current Fuel Flow	SourceOfDataMassCode is null)

If (Current Fuel Flow 7?ecw "2")

HFF Mass SODC Status == false
return result C

else if (Current Fuel Flow Record. VolumetricFlowRate is null AND Current Fuel Flow Record. SourceOfDataMassCode
== "2")

HFF Mass SODC Status == false
return result D

else if (Current Fuel Flow Record. SourceOfDataMassCode = "3" AND Current Unit Is Peaking == false)

HFF Mass SODC Status == false
return result E
else if (HFF Fuel Indicator Code is not null)

if (Current Fuel Flow Record. SourceOfDataMassCode == "4" AND HFF Fuel Indicator Code<> "E")
HFF Mass SODC Status == false
return result F

else if (Current Fuel Flow Record. SourceOfDataMassCode in set {5, 6} AND HFF Fuel Indicator CodeO "I")
HFF Mass SODC Status == false
return result G

else

Environmental Protection Agency

Page 196 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

Response

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you
reported a [ratefieldname].

You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not
report a [ratefieldname].

You reported a SourceOfDataMassCode of [sodc] in the HFF record for FuelCode
[fueled], but you also reported a VolumetricFlowRate. The
SourceOfDataMassCode must be 2 when mass oil flow is calculated from
volumetric oil flow.

You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode
[fueled], but you did not report a VolumetricFlowRate. The
SourceOfDataMassCode should be 2 only when the mass oil rate is calculated from
volumetric oil flow.

You reported a [fieldname] of 3 in the HFF record for FuelCode [fueled], but,
according to the qualification record in your monitoring plan, this is not a peaking
unit.

You reported a [fieldname] of 4 in the HFF record for FuelCode [fueled], which
indicates that the fuel is an emergency fuel, but according to the Unit Fuel record in
your monitoring plan, this fuel is not an emergency fuel.

You reported a [fieldname] of [sodc] in the HFF record for FuelCode [fueled], which
indicates that the fuel is an igniter fuel, but according to the Unit Fuel record in
your monitoring plan, this fuel is not an igniter fuel.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 197 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-7

Check Name:	Check Fuel Flow Monitoring System

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

HFF System Type = null
FuelFlowComponentRecords = null
CurrentAppendixDStatus = null

Jf {Current Fuel Flow 7?ecw "GAS")
return result E

else if {Current Fuel Group == "OIL" AND Current Mon Sys Record. SystemTypeCode not in set {OILV, OILM})
return result F

else if {Current Fuel Group == "OIL" AND Current Oil Fuel Flow Record. SourceOfDataMassCode == "2" AND

Current Mon Sys Record. SystemTypeCode <> "OILV")
return result G

else

HFF System Type = Current Mon Sys Record. SystemTypeCode

if Current Mon Sys Record. FuelCode is not null and is not equal to Current Fuel Flow Record .V vic\QoAc
HFF System Fuel = Current Mon Sys Record.FuelCode
return result H

else if {Current Fuel Flow 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (Current Fuel Group = "OIL")

Locate MonitorSystemComponentRecordsByHourLocation where the SystemID is equal to
CurrentFuelFlowRecord Sy stem ID and the ComponentTypeCd = "OFFM" or "BOFF"

For each retrieved record found:

If (MonitorSystemComponentRecordsByHourLocation. ComponentTypeCd ==
"OFFM")

Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords.

If none were found,

return result I.

else if {Current Fuel Group = "GAS")

Locate MonitorSystemComponentRecordsByHourLocation where the SystemID is equal to
CurrentFuelFlowRecord.SystemID and the ComponentTypeCd = "GFFM" or "BGFF"

For each retrieved record found:

If (MonitorSystemComponentRecordsByHourLocation. ComponentTypeCd ==
"GFFM")

Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords.

If none were found,

return result I.

Environmental Protection Agency

Page 199 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

E
F
G

H

Response

You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the
HFF record for FuelCode [fueled], indicating the use of a fuel flowmeter system, but
you did not report its MonitoringSystemlD.

You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the
HFF record for FuelCode [fueled] that indicates the use of substitute data, but you
did not report a MonitoringSystemlD. This was not required for legacy EDR data,
but for ECMPS, you should report the primary MonitoringSystemlD of the fuel
flowmeter system that normally records the flow for this fuel.

You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the
HFF record for FuelCode [fueled] that indicates the use of an emergency or igniter
fuel, so you should not have reported a MonitoringSystemlD in this record.
You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled],
but there is no MonitorSystem record for this system in your monitoring plan that
was active during the hour.

You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled],
but this system is not a GAS monitoring system.

You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled],

but this system is not an OILM or OIL V monitoring system.

You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode

[fueled], indicating that you are calculating mass oil rate from volumetric oil flow,

but MonitoringSystemlD [ID] is not an OIL V monitoring system.

Your reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled],

but the FuelCode for this system in the MonitorSystem record is [sysfuel]. The

FuelCode in the Monitor System record should be the same as the FuelCode in the

HFF record.

You did not report any active fuel flowmeter components in your monitoring plan
for MonitoringSystemlD [ID], The QA status for Appendix D testing for this
system will not be evaluated.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 200 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-8

Check Name:

Check Volumetric Units of Measure

Related Former Checks:

Applicability:

Appendix D Check

Description:

Specifications:

HFF UOM Status = true

If (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode is null)
If (Current Fuel Flow Record. VolumetricFlowRate is not null)
HFF UOM Status = false
return result A

If (Current Fuel Flow Record. VolumetricFlowRate is null)

HFF UOM Status = false
return result B

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record. VolumetricUnitsOfMeasureCode is not in set

{"GALHR", "BBLHR", "M3HR", "SCFH"})

HFF UOM Status = false
return result C

else if {Current Fuel Group == "GAS" AND Current Fuel Flow Record. VolumetricUnitsOfMeasureCode <> "HSCF")
HFF UOM Status = false
return result C

else

Results:

Result
A

Response

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you
reported a [ratefieldname].

You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not
report a [ratefieldname].

The VolumetricUnitsOfMeasureCode reported in the HFF record for FuelCode
[fueled] is invalid.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 201 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-9

Check Name:

Check Fuel in HFF Record

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

HFF Fuel Indicator Code = null

Locate active UnitFuel record for the location

where FuelCd = Current Fuel Flow Record UnitFlie 1Cd

If found,

HFF Fuel Indicator Code = Current Fuel Flow	IndicatorCd

else

return result A

Results:

Result
A

Response

You did not report an active Unit Fuel record for FuelCode [fueled] in your
monitoring plan.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 202 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-10

Check Name:	Check Volumetric Flow in HFF Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

HFF Calc Volumetric Rate = null
HFF Max Heat Input for Volume = null

If (HFF System Type is not null AND HFF SOD Status == true AND HFF Mass SODC Status == true AND HFF UOM Status ==

true)

If (Current Fuel Flow Record. VolumetricFlowRate is null)

If (HFF System TypeO "OILM")
return result A

else

If (HFFSystem Type== "OILM")
return result B

else if (Current Fuel Flow Record. SourceOfDataVolumetricCode == "4")

If (Current Entity Type is equal to "Unit")

Locate a Unit Capacity record for the location and hour.

If exactly one record is found, and the MaximumHourlyHeatlnputCapacity in the retrieved record is
greater than 0,

HFF Max Heat Input for Volume =

UnitCapacityByHourLocation. MaximumHourlyHeatlnputCapacity
If (HFFGCV is not null)

If (Current Fuel Flow 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

HFF Volumetric Default Parameter = "MNOF"

Count active Default Record for the location where

ParameterCode == HFF Volumetric Default Parameter
FuelCode == Current Fuel Flow Record .V ac\Qo&c

if (Count <> 1)

return result C
else if (DefaultRecordI)Qfm\Vfa[vLQ <= 0)
return result D

else if (De/aM//i?ecor(i.DefaultUnitsOfMeasureCode == Current Fuel Flow
itecorrf. VolumetricUnitsOfMeasureCode)

HFF Calc Volumetric Rate = Default Record .Default Value
If (Current Fuel Flow Record. VolumetricFlowRate <=0)
return result E

else if (Current Fuel Flow Record. VolumetricFlowRate <> HFF Calc Volumetric Rate)

return result F

else

If (Current Fuel Flow Record. VolumetricFlowRate <= 0)
return result E

else

return result G

else if Current Fuel Flow 7?ecw 3)

HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate

Count active System Fuel Flow Record for the system.

If (Count o 1)

return result H

else if (System Fuel Flow Record.MaximumFuelFlowRate <= 0)
return result I

else if (System Fuel Flow Record. SystemFuelFlowUOMCode == Current Fuel Flow
itecorrf. VolumetricUnitsOfMeasureCode)

If {Current Fuel Flow /?et'w HFF Calc Volumetric Rate)
return result J

else

If (HFF Calc Volumetric Rate > System Fuel Flow Record.MaximumFuelFlowRate
return result K

else

return result L

else

If (Current Fuel Flow Record. VolumetricFlowRate <= 0)
return result E

else

HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate

Environmental Protection Agency

Page 204 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F

H

I

J

K

M

Usage:

1

Response

You did not report a VolumetricFlowRate in the HFF record for FuelCode [fueled],
which is required when using [systype] MonitoringSystemID [ID],

You reported a VolumetricFlowRate in the HFF record for FuelCode [fueled], which
is invalid when using an OILM system.

You did not report one and only one default record for [parameter] for FuelCode
[fueled] in your monitoring plan that was active during current hour.
The DefaultValue reported in the active [parameter] default record for the hour is
invalid.

The VolumetricFlowRate reported in the HFF record for FuelCode [fueled] is
invalid.

You reported a SourceOfDataVolumetricCode of [sodc] in the HFF record for
FuelCode [fueled], but the VolumetricFlowRate is not equal to the fuel flow rate
defined in the active [parameter] default record in your monitoring plan.
The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode [fueled] is not
the same as the DefaultUnitsOfMeasureCode in the active [parameter] default
record in your monitoring plan.

You did not report one and only one active SystemFuelFlow record for
MonitoringSystemID [ID] in your monitoring plan for the hour.
The MaximumFuelFlowRate reported in the active System Fuel Flow record for
MonitoringSystemID [ID] in your monitoring plan is invalid.

You reported a SourceOfDataVolumetricCode of 3 in the HFF record for FuelCode
[fueled], but the VolumetricFlowRate is not equal to the MaximumFuelFlowRate
specified in the active System Fuel Flow record for MonitoringSystemID [ID] in
your monitoring plan.

Warning: The VolumetricFlowRate reported in the HFF record for FuelCode
[fueled] exceeds the MaximumFuelFlowRate specified in the active System Fuel
Flow record for MonitoringSystemID [ID] in your monitoring plan. Sources are
required to periodically (at least once annually) evaluate the appropriateness of
these maximum values in the monitoring plan and make proper adjustments when
necessary. You should investigate the cause of these exceedances and determine
whether an adjustment to your monitoring systems or monitoring plan is
necessary.

The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode [fueled] is not
the same as the SystemFuelFlowUOMCode in the active System Fuel Flow record
for MonitoringSystemID [ID] in your monitoring plan.

You did not report one and only one valid active Unit Capacity record in your
monitoring plan for the unit for the hour.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 205 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-11

Check Name:	Check Mass Oil Flow in HFF Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

HFF Calc Mass Oil Rate = null
HFF Max Heat Input for Mass = null

If (HFF System Type is not null AND HFF SOD Status == true AND HFF Mass SODC Status == true AND HFF UOM Status ==

true)

If (Current Fuel Flow 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Count active Default Record for the location where

ParameterCode == HFF Mass Oil Default Parameter
FuelCode == Current Fuel Flow Record.FuelCode
if (Count o 1)

return result F

else if {DefaultRecord.DefaultValue <= 0 OR Default Record DQfavXWJniisOfMaaswQCodQ o "LBHR")
return result G

else

HFF Calc Mass Oil Rate = Default Record .DefaultValue
If (Current Fuel Flow 7?ecw HFF Calc Mass Oil Rate)
return result H

else if (Current Fuel Flow 7?ecw HFF Calc Mass Oil Rate)
return result K

else

If (HFF Calc Mass Oil Rate > System Fuel Flow i?econi.MaximumFuelFlowRate
return result L

else

If (Current Fuel Flow 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F

G

H

I
J

K

M

Usage:

1

Response

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but the

MonitoringSystemID [ID] is an [systype] fuel flow system.

You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode

[fueled], which indicates that the mass oil rate was calculated from the volumetric

oil rate, but you did not report a MassFlowRate in the record.

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but this

value is required for an ARP unit.

You reported a MassFlowRate in the HFF record for FuelCode [fueled]. This value
should be blank for a gas fuel.

The MassFlowRate reported in the HFF record for FuelCode [fueled] is invalid.
You did not report one and only one default record for [parameter] for FuelCode
[fueled] in your monitoring plan that was active during current hour.
The DefaultValue or DefaultUnitsOfMeasureCode reported in the active
[parameter] default record for the hour is invalid.

You reported a SourceOfDataMassCode of [sodc] in the HFF record for FuelCode

[fueled], but the MassFlowRate is not equal to the fuel flow rate defined in the

active [parameter] default record in your monitoring plan.

You did not report one and only one active SystemFuelFlow record for

MonitoringSystemID [ID] in your monitoring plan for the hour.

The MaximumFuelFlowRate or SystemFuelFlowUOMCode reported in the active

System Fuel Flow record for MonitoringSystemID [ID] in your monitoring plan is

invalid.

You reported a SourceOfDataMassCode of 3 in the HFF record for FuelCode
[fueled], but the MassFlowRate is not equal to the MaximumFuelFlowRate
specified in the active System Fuel Flow record for MonitoringSystemID [ID] in
your monitoring plan.

Warning: The MassFlowRate reported in the HFF record for FuelCode [fueled]
exceeds the MaximumFuelFlowRate specified in the active System Fuel Flow record
for MonitoringSystemID [ID] in your monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary. You
should investigate the cause of these exceedances and determine whether an
adjustment to your monitoring systems or monitoring plan is necessary.

You did not report one and only one valid active Unit Capacity record in your
monitoring plan for the unit for the hour.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Informational Message

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 208 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-12

Check Name:	Determine Density

Related Former Checks:

Applicability:	Appendix D Check

Description:

Validation Tables:

Fuel Type Reality Checks for Density (Cross Check Table)

Fuel Type Warning Levels for Density (Cross Check Table)

Table D-6 Missing Data Values (Cross Check Table)

Specifications:

HFF Density = null
Current Density Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.Hourly¥uel¥lowlD AND
HourlyParamFuelFlow.ParameterCode = "DENSOIL"

If (Count >1)

return result A
Else If (Count == 0)

If {HFF System Type== "OILV" and Current Fuel Flow Record.SovirceC){DataMassCode == "2")
return result B

Else if {HFF System Type= "OILV" AND Current Fuel Flow Record. SourceO{DataMassCode == "2")

Current Density Record = matching record
Density UOM = Current Density 7?ecw0)

Density Default = null

If {Current Density Record. SampleTypeCode == 8)

Density Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "DENSOIL -" + Density UOM AND "FuelCode" column = Current
Fuel Flow Record. Fucl Code

If {Density Default == null)

Max Expected Density = Lookup "Upper Value" in "Fuel Type Warning Levels for Density Cross Check
Table"

where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow
Record.Y' ucl Code. " -Density UOM)

== "GALHR" AND Density UOM <> "LBGAL")
== "BBLHR" AND Density UOM <> "LBBBL")
== "M3HR" AND Density UOM o "LBM3")
== "SCFH" AND Density UOM o "LBSCF")

Environmental Protection Agency

Page 209 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Min Expected Density = Lookup "Lower Value" in "Fuel Type Warning Levels for Density Cross Check
Table"

where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow
Record.¥\xc\CoAc. " -Density UOM)

Max Allowed Density = Lookup "Upper Value" in "Fuel Type Reality Checks for Density Cross Check
Table"

where "Fuel Code - Units Of Measure" column = concatenation of (Current Fuel Flow
Record.V uclCodc. " -Density UOM)

Min Allowed Density = Lookup "Lower Value" in "Fuel Type Reality Checks for Density Cross Check
Table"

where "Fuel Code - Units Of Measure" column = concatenation of (Current Fuel Flow
Record.Y' uclCodc. " -Density UOM)

if (Max Allowed Density is not null AND Current Density 7?ecw Max Allowed Density)
OR {Min Allowed Density is not null AND Current Density 7?ecw Max Expected Density)
return result F

else

if {Density Default == Current Density Record.ParamValFuel)
HFF Density = Current Density 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F
G

H
I

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

You did not report an HPFF record for [parameter] for FuelCode [fueled] for the
hour.

The ParameterUOMCode reported in the HPFF record for DENSOIL for FuelCode
[fueled] is missing or invalid.

The ParameterUOMCode reported in the HPFF record for DENSOIL for FuelCode
[fueled] is inconsistent with the VolumetricUnitsOfMeasureCode reported in the
associated HFF record.

The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is outside the range of allowable values for the fuel type.
The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is outside the range of expected values for the fuel type.
You reported a SampleTypeCode of 8 in the HPFF record for [parameter] for
FuelCode [fueled], indicating the use of a Table D-6 default, but the
ParameterValueForFuel does not equal the default value for the fuel.
The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is invalid. The value should be greater than 0.

You reported an HPFF record for [parameter] for FuelCode [fueled], but this value
is only appropriate when using an OILV system and a SourceOfDataMassCode
equal to 2.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 211 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-13

Check Name:	Check Density Sample Type

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current Density Record is not null)

If Current Density Record. SampleTypeCode not in {1, 2, 5, 6, 7, 8}
return result A

Severity

Critical Error Level 1

Results:

Result	Response

A	The SampleTypeCode reported in the HPFF record for DENSOIL for FuelCode

[fueled] is missing or invalid.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 212 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-14

Check Name:

Check Extraneous Density Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current Density Record is not null)

If (Current Density itecorrf.Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If (Current Density 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-15

Check Name:

Calculate Mass Oil Flow

Related Former Checks:

Applicability:

Appendix D Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

IfHFF Calc Volumetric Flow is not null AND HFF Density is not null)

HFF Calc Mass Oil Flow= HFF Density * HFF Calc Volumetric Flow, and round the result to one decimal place (0.1)

Flow Rate Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "OILM" AND
UOM = "LBHR"

If (Current Fuel Flow itecorrf.MassFlowRate > 0)

if (ABS{Current Fuel Flow itecorrf.MassFlowRate - HFF Calc Mass Oil Flow) > Flow Rate Tolerance)

return result A

Results:

Result
A

Response

The MassFlowRate reported in the HFF record for FuelCode [fueled] is
inconsistent with the value calculated from the VolumetricFlowRate and density.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 214 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-16

Check Name:	Determine GCV

Related Former Checks:

Applicability:	Appendix D Check

Description:

Validation Tables:

Fuel Type Reality Checks for GCV (Cross Check Table)

Fuel Type Warning Levels for GCV (Cross Check Table)

Table D-6 Missing Data Values (Cross Check Table)

Specifications:

HFF GCV = null
Current GCV Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow RecordHourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "GCV"

If (Count >1)

return result A
Else If (Count == 0)

If (Current HI HPFF Record is not null)
return result B
Else if (Current HI HPFF Record is not null)

Current GCV Record = matching record

GCVUOM = Current GCKitecorrf.ParameterUOMCode

if (GCVUOM not in set {BTUGAL, BTUBBL, BTUM3, BTUSCF, BTULB, BTUHSCF}
return result C

else if (Current Fuel Group == "GAS" AND GCVUOM o "BTUHSCF")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow 7?ecw
"BTULB")

return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow 7?ec "BTUM3")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow .Recorrf.MassFlowRate is null AND Current Fuel Flow
7?ecw "BTUSCF")

return result D
else if (Current GCV7?ecw 0)

GCV Default = null

If (Current GCV Record SamplcTypcCodc == 8)

GCV Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

Environmental Protection Agency

Page 215 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

where "Parameter" column = "GCV -" + GCVUOM AND "FuelCode" column = Current Fuel Flow
Record. FuelCode

If (GCV Default == null)

GCV Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "GCV -" + GCVUOM and FuelCode column is null.

If (GCV Default == null)

Max Expected GCV = Lookup "Upper Value" in "Fuel Type Warning Levels for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow
Fuel Code. " -GCVUOM)

Min Expected GCV = Lookup "Lower Value" in "Fuel Type Warning Levels for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of (Current Fuel Flow
Record.¥uclCodc. " -GCVUOM)

Max Allowed GCV = Lookup "Upper Value" in "Fuel Type Reality Checks for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of (Current Fuel Flow
Record.¥uclCodc. " -GCVUOM)

Min Allowed GCV = Lookup "Lower Value" in "Fuel Type Reality Checks for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of (Current Fuel Flow
Record.fuslCodQ," -GCVUOM)

if (Max Allowed GCV is not null AND Current GCV7?ecw Max Allowed GCV) OR (Min
Allowed GCV is not null AND Current GCV 7?ecw Max Expected GCV)
return result F

If (Current GC V Record P aram Val F ucl is not rounded to one decimal place)
return result J

else if (GCV Default == Current GCVitecorrf.ParamValFuel)

HFFGCV = Current GC V Record P aram Val F ucl

else

return result G

else

return result H

else

return result I

Environmental Protection Agency	Page 216 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C

D

E
F
G

H

I

J

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

You did not report a HPFF record for GCV for FuelCode [fueled] for the hour.
The ParameterUOMCode reported in the HPFF record for GCV for FuelCode
[fueled] is missing or invalid.

The ParameterUOMCode reported in the HPFF record for GCV for FuelCode
[fueled] is inconsistent with the fuel flow units of measure.
The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is outside the range of allowable values for the fuel type.
The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is outside the range of expected values for the fuel type.
You reported a SampleTypeCode of 8 in the HPFF record for [parameter] for
FuelCode [fueled], indicating the use of a Table D-6 default, but the
ParameterValueForFuel does not equal the default value for the fuel.
The ParameterValueForFuel reported in the HPFF record for GCV for FuelCode
[fueled] is invalid. The value must be greater than 0.

You reported an HPFF record for GCV for FuelCode [fueled], but you have not
reported an HPFF record for HI for the hour.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 217 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Name:

Check Code:

HOURAD-17

Check GCV Sample Type

Related Former Checks:

Applicability:

Appendix D Check

Description:

Specifications:

If (Current GCV Record is not null)

If {Current Fuel Group == "OIL" AND Current GCV Record. SampleTypeCode not in {1, 2, 5, 6, 7, 8})
return result A

else if {Current Fuel Group == "GAS" AND Current GCV Record. SampleTypeCode not in {0, 2, 3, 4, 6, 7, 8})
return result A

Results:

Result
A

Response

The SampleTypeCode reported in the HPFF record for GCV for FuelCode [fueled] is
missing or invalid.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 218 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-18

Check Name:

Check Extraneous GCV Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current GCV Record is not null)

If (Current GCVitecorrf.Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If (Current GCV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-19

Check Name:	Validate Heat Input Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

Current HI HPFF Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Recordi\ow\y¥uQ\Y\ovi\T) AND
HourlyParamFuelFlow.ParameterCode = "HI"

If (Count >1)

HIApp D Accumulator = -1
return result A
Else If (Count == 0)

If (Heat Input App D Method Active For Hour == true)

HI App D Accumulator = -1
return result B

Else if (Heat Input App D Method Active For Hour == true)

Current HI HPFF Record = matching record

if {Current HI HPFF fiecwf/.MonitoringFormulald is null
return result C

else

Cur HIMon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current HI HPFF	MonitoringFormula ID

if {Cur HI Mon Formula Record is null)
return result D

else if {Cur HI Mon Formula Record. ParameterCode o "HI")

return result E
else if {Current Fuel Group == "GAS")

If {Cur HI Mon Formula Record. EquationCode not in set {D-6, F-20})
return result F

else if {Current Fuel Flow 7?ecw "F-19V")
return result F

else

return result G

Environmental Protection Agency

Page 220 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E

F

G

Usage:

1

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

You did not report an HPFF record for [parameter] for FuelCode [fueled] for the
hour.

You did not report a FormulalD in the HPFF record for HI for FuelCode [fueled].
You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but
this is not an HI formula.

The FormulaCode of FormulalD [ID] reported in the HPFF record for HI for
FuelCode [fueled] is invalid.

You reported an HPFF record for GCV for FuelCode [fueled], but you have not
reported an HPFF record for HI for the hour.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 221 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-20

Check Name:

Check Extraneous Heat Input Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current HI HPFF Record is not null)

If (Current HI HPFF	MonitoringSy stem ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current HI HPFF Record. SegmenfNumber is not null)

append " SegmentNumber" to Hourly Extraneous Fields
If (Current HI HPFF Record. OpQvatmgConditionCodQ is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current HI HPFF Record. SampleTypeCode is not null)

append "SampleTypeCode" to Hourly Extraneous Fields

If (Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

Response

You reported [fieldnames] in the HPFF record for HI for FuelCode [fueled]. This
data should be blank.

Severity

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 222 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-21

Check Name:

Calculate Heat Input Rate

Related Former Checks:
Applicability:

Appendix D Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

HFF Calc HI Rate = null

If (Current HI HPFF Record is not null)

if {Current Fuel Flow /?t;t'WY/.SourccOrDataVolumctricCodc == "4")
if (HFF Max Heat Input for Volume is not null)

HFF Calc HI Rate = HFF Max Heat Input for Volume

else

else if {Current Fuel Flow Record. SourceOfDataMassCode == "4")
if (HFF Max Heat Input for Mass is not null)

HFF Calc HI Rate = HFF Max Heat Input for Mass

else

HIApp D Accumulator = -1

return result A

else if (HFF GCV is not null)

HI HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI HPFF" AND
UOM = "MMBTUHR"

If (HFF System Type== "GAS" OR Current Fuel Flow RecordMassFlowRatQ is null)

If (HFF Calc Volumetric Rate is not null)

HFF Calc HI Rate = HFF Calc Volumetric Rate * HFF GCV / 1000000, and round the result to
one decimal place.

HFF Calc HI Rate = HFF Calc Mass Oil Rate * HFF GCV / 1000000, and round the result to one
decimal place.

HI App D Accumulator = -1

return result A

else

HI App D Accumulator = -1

return result A

else

if (HFF Calc Mass Oil Rate is not null)

else

HI App D Accumulator = -1

return result A

If (HFF Calc HI Rate is not null)

Environmental Protection Agency

Page 223 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If Current Fuel Flow Record.¥ue\UsageTmie > 0 AND Current Fuel Flow Record.FuelUsageTime <= 1 AND HI
App D Accumulator >=0)

// Note - this accumulates totals for all Fuel flow records and does not work like a normal parameter
HI App D Accumulator = HI App D Accumulator + HFF Calc HI Rate * Current Fuel Flow
7?ecw 0)

If (Current Fuel Flow Record. SourceOfDataVolumetricCode == "4" OR Current Fuel Flow
Record. SourceOfDataMassCode == "4")

if (HFF Calc HI Rate is equal to Current HI HPFF 7?ecw Flow Tolerance)
return result C

else

If (Current Fuel Flow 7?ecw Flow Tolerance)
return result D

else

If (ABS(HFF Calc HI Rate - Current HI HPFF Record.?aramVaWuel) > HI HPFF Tolerance)
return result B

else

HI App D Accumulator = -1

return result A

Environmental Protection Agency

Page 224 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

Usage:

1

Response

The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode
[fueled] could not be recalculated due to errors listed above.
The ParameterValueForFuel reported in the HPFF record for HI for FuelCode
[fueled] is inconsistent with the recalculated value.

You reported a SourceOfDataVolumetricCode of 4, indicating that you burned an
emergency fuel, but the VolumetricFlowRate in the HFF record for FuelCode
[fueled] is inconsistent with the maximum fuel flow rate for the unit. When you
burn an emergency fuel, you should report the maximum fuel flow rate, which is
based on the maximum hourly heat input capacity of the unit.

You reported a SourceOfDataMassCode of 4, indicating that you burned an
emergency fuel, but the MassFlowRate in the HFF record for FuelCode [fueled] is
inconsistent with the maximum fuel flow rate for the unit. When you burn an
emergency fuel, you should report the maximum fuel flow rate, which is based on
the maximum hourly heat input capacity of the unit.

Severity

Informational Message
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 225 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-22

Check Name:

Check Reported Heat Input

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

If (Current HI HPFF Record is not null)

If (Current HI HPFF Record FaramVaWuel >= 0

If (Current HI HPFF Record.ParamValFuel is not rounded to one decimal place)
return result D

else if (Current Fuel Flow Record. SourceOfDataVolumetricCode == "4" and HFF Max Heat Input for Volume is
not null)

if (Current HI HPFF Record.PsramValFuel is not equal to HFFMaxHeat Inputfor Volume)

return result E

else if (Current Fuel Flow Record. SourceOfDataMassCode == "4" and HFF Max Heat Input for Mass is not null)
if (Current HI HPFF 7?ecw Lfart Capacz'/y i?ecor^.MaximumHourlyHeatInputCapacity
return result B

else

else

return result C

Environmental Protection Agency

Page 226 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D
E

Response

You did not report one and only one active Unit Capacity record in your
monitoring plan for the unit (or for each unit linked to the pipe) for the hour.
Warning: The ParameterValueForFuel reported in the HPFF record for HI for
FuelCode [fueled] exceeds the MaximumHourlyHeatlnputCapacity reported in the
Unit Capacity record in your monitoring plan. Sources are required to periodically
(at least once annually) evaluate the appropriateness of maximum values in the
monitoring plan and make proper adjustments when necessary. You should
investigate the cause of these exceedances and determine whether an adjustment
to the MaximumHourlyHeatlnputCapacity reported in your monitoring plan is
necessary.

The ParameterValueForFuel reported in the HPFF record for HI for FuelCode
[fueled] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported a SourceOfDataVolumetricCode of 4 in the HFF record, indicating
that you burned an emergency fuel. However, you did not report the maximum
hourly heat input capacity for the unit as the ParameterValueforFuel in the HPFF
record for HI, which is required when you burn an emergency fuel.

You reported a SourceOfDataMassCode of 4 in the HFF record, indicating that you
burned an emergency fuel. However, you did not report the maximum hourly heat
input capacity for the unit as the ParameterValueforFuel in the HPFF record for HI,
which is required when you burn an emergency fuel.

Severity

Critical Error Level 1
Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 227 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-23

Check Name:	Check Heat Input Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current HI HPFF Record is not null)

If (Current HI HPFF 7?ecw "MMBTUHR")
return result A

Severity

Critical Error Level 1

Results:

Result	Response

A	The ParameterUOMCode reported in the HPFF record for HI for FuelCode [fueled]

is missing or invalid. The value should be "MMBTUHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 228 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-24

Check Name:	Validate S02 Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

Current S02 HPFFRecord = null
HFF S02 Equation Code = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow RecordHourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "S02"

If (Count >1)

SO2 App D Accumulator = -1
return result A
Else If (Count == 0)

If {SO2 App D Method Active For Hour == true)

SO2 App D Accumulator = -1
return result B
Else if (S02 App D Method Active For Hour == true)

Current S02 HPFF Record = matching record

if (Current S02 HPFF Record. MonitoringFormulald is null
return result C

else

Cur SO2 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current S02 HPFF Record. MonitoringFormulalD

if (Cur SO2 Mon Formula Record is null)
return result D

else if (Cur S02 Mon FormulaRecord.FsrameterCode o "S02")

return result E
else if (Current Fuel Group == "GAS")

If (Cur SO2 Mon Formula Record.EquationCode in set {D-4, D-5})

HFF S02 Equation Code = Cur SO2 Mon Formula Record.EquationCode

else

return result F

If (Cur S02 Mon Formula Record.EquationCode == "D-2")

HFF S02 Equation Code = Cur SO2 Mon Formula Record.EquationCode

else

return result F

else

else

return result G

Environmental Protection Agency

Page 229 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E

F

G

Usage:

1

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

You did not report an HPFF record for [parameter] for FuelCode [fueled] for the
hour.

You did not report a FormulalD in the HPFF record for S02 for FuelCode [fueled].
You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but
this is not an S02 formula.

The FormulaCode of FormulalD [ID] reported in the HPFF record for S02 for
FuelCode [fueled] is invalid.

You reported an HPFF record for S02 for FuelCode [fueled], but you do not have
an active Appendix D S02 method for the hour.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 230 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-25

Check Name:

Check Extraneous S02 Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current S02 HPFFRecord is not null)

If (Current S02 HPFF Record.MonhormgSyslcm ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current S02 H PFF Record .ScgmcniHuxnbcr is not null)

append " SegmentNumber" to Hourly Extraneous Fields
If (Current S02 HPFF Record.Opcr'dlmgCondilionCodc is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current S02 HPFF /?/*
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-26

Check Name:	Check S02 Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current S02 HPFFRecord is not null)

If (Current S02 HPFF Record ParamctcrUOMCode o "LBHR")
return result A

Severity

Critical Error Level 1

Results:

Result	Response

A	The ParameterUOMCode reported in the HPFF record for S02 for FuelCode

[fueled] is missing or invalid. The value should be "LBHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 232 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-27

Check Name:	Calculate S02 Mass Rate

Related Former Checks:

Applicability:	Appendix D Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

HFF Calc S02 = null

If (Current S02 HPFFRecord is not null)

if (Current Fuel Group == "GAS" AND HFF S02 Equation Code == "D-4" AND HFF Sulfur is not null AND HFF Calc
Volumetric Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Gas HPFF" AND
UOM = "LBHR"

HFF Calc S02 = HFF Sulfur * HFF Calc Volumetric Rate * 2.0 / 7000, and round the result to 5 decimal places.

else if (Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-5" AND HFFS02 Emission Rate is not null
AND HFF Calc HI Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Gas HPFF" AND
UOM = "LBHR"

HFF Calc S02 = HFF S02 Emission Rate * HFF Calc HI Rate, and round the result to 5 decimal places.

else if (Current Fuel Group == "OIL" AND HFF Sulfur is not null AND HFF Calc Mass Oil Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Oil HPFF" AND
UOM = "LBHR"

HFF Calc S02 = HFF Sulfur * HFF Calc Mass Oil Rate * 2.0 /100, and round the result to 1 decimal place.

If {HFF Calc S02 is not null)

If Current Fuel Flow Record.FuelUsageTime > 0 AND Current Fuel Flow Record.FuelUsageTime <= 1 AND SO2
App D Accumulator >=0)

// Note - this accumulates totals for all Fuel flow records and does not work like a normal parameter
SO2 App D Accumulator = S02 App D Accumulator + HFF Calc S02 * Current Fuel Flow
7?ecw= 0)

if (PJ3S(HFF Calc S02 - Current S02 HPFF Record. Param V al F ucl) > S02 HPFF Tolerance)
return result A

else

Environmental Protection Agency

Page 233 of 703


-------
Draft ECMPS Emissions Check Specifications

S02 App D Accumulator = -1

return result B

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode
[fueled] is inconsistent with the recalculated value.

The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode
[fueled] could not be recalculated due to errors listed above.

Severity

Critical Error Level 1
Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 234 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-28

Check Name:	Determine Sulfur Content

Related Former Checks:

Applicability:	Appendix D Check

Description:

Validation Tables:

Fuel Type Reality Checks for Sulfur (Cross Check Table)

Fuel Type Warning Levels for Sulfur (Cross Check Table)

Table D-6 Missing Data Values (Cross Check Table)

Specifications:

HFF Sulfur = null
Current Sulfur Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.Hourly¥uel¥lowlD AND
HourlyParamFuelFlow.ParameterCode = "SULFUR"

If (Count >1)

return result A
Else If (Count == 0)

If (HFFS02 Equation Code in set {D-2, D-4})
return result B
Else if (HFFS02 Equation Code in set {D-2, D-4})

Current Sulfur Record = matching record

Sulfur UOM = Current Sulfur 7?ec "PCT")

return result C
else if (Current Sulfur 7?ec0)

Sulfur Default = null
If (Sulfur UOM == "GRHSCF")

Sulfur Precision = 1

else

Sulfur Precision = 4

If (Current Sulfur 7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Max Allowed Sulfur = Lookup "Upper Value" in "Fuel Flow Reality Checks for Sulfur Content Cross Check
Table"

where "Fuel Code" column = Current Fuel Flow Record.FuelCode
Min Allowed Sulfur = Lookup "Lower Value" in "Fuel Flow Reality Checks for Sulfur Content Cross Check
Table"

where "Fuel Code" column = Current Fuel Flow Record.FuelCode

If (Max Allowed Sulfur is not null AND Current Sulfur 7?ecw Max Allowed Sulfur) OR
{Min Allowed Sulfur is not null AND Current Sulfur Record.ParamValFuel < Min Allowed Sulfur)
return result D

else if (Current Sulfur itecorrf.ParamValFuel is not rounded to Sulfur Precision)
return result I

else

HFF Sulfur = Current Sulfur Record Param Val Fuel

if (Min Expected Sulfur is not null AND HFF Sulfur < Min Expected Sulfur) OR (Max Expected
Sulfur is not null AND HFF Sulfur > Max Expected Sulfur)
return result E

else

If (Current Sulfur 7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 237 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-29

Check Name:

Check Extraneous Sulfur Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current Sulfur Record is not null)

If (Current Sulfur itecorrf.Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If (Current Sulfur 7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-30

Check Name:

Check Sulfur Sample Type

Related Former Checks:

Applicability:

Description:

Specifications:

Appendix D Check

If (Current Sulfur Record is not null)

If {Current Fuel Group == "OIL" AND Current Sulfur Record SamplcTypcCodc not in {1, 2, 5, 6, 7, 8})
return result A

else if {Current Fuel Group == "GAS" AND Current Sulfur Record.SampleTypeCode not in {0, 2, 4, 5, 6, 7, 8})
return result A

Results:

Result
A

Response

The SampleTypeCode reported in the HPFF record for SULFUR for FuelCode
[fueled] is missing or invalid.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 239 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-31

Check Name:	Determine S02 Emission Rate

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

HFF S02 Emission Rate = null
Current S02R Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.Hourly¥uel¥lowlD AND
HourlyParamFuelFlow.ParameterCode = "S02R"

If (Count >1)

return result A
Else If (Count == 0)

If (HFFS02 Equation Code == "D-5")
return result B
Else if (HFFS02 Equation Code == "D-5")

Current S02R Record = matching record

If (Current S02RRecord.ParameterUOMCode o "LBMMBTU"}

return result C
else if (Current S02R Record.?d.TdmVal¥uQl > 0)

HFF S02 Emission Rate = Current S()2R Record Param Val Fucl

else

return result D

else

return result E

Results:

Result	Response	Severity

A	You reported more than one HPFF record for [parameter] for FuelCode [fueled] for Critical Error Level 1

the hour.

B	You reported a formula with a FormulaCode of "D-5" in the HPFF record for S02 for Critical Error Level 1

FuelCode [fueled], but you did not report an HPFF record for S02R. Use of formula
D-5 to calculate S02 requires the reporting of the S02 emission rate for the fuel.

C	The ParameterUOMCode reported in the HPFF record for S02R for FuelCode	Critical Error Level 1

[fueled] is missing or invalid. The value should be "LBMMBTU".

D	The ParameterValueForFuel reported in the HPFF record for [parameter] for	Critical Error Level 1

FuelCode [fueled] is invalid. The value should be greater than 0.

E	You reported an HPFF record for [parameter] for FuelCode [fueled], but you do not Critical Error Level 1

require this value to calculate S02.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 240 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-32

Check Name:

Check Extraneous S02R Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current S02R Record is not null)

If {Current S()2R /?£?t'WY/.MonitoringSystcmID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current S()2R Record ScgmcntNumbcr is not null)

append " SegmentNumber" to Hourly Extraneous Fields
If (Current S()2R Record. Opera ting Condition Code is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current S()2R Record SamplcTypcCodc is not null)

append "SampleTypeCode" to Hourly Extraneous Fields

If (Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

Response

You reported [fieldnames] in the HPFF record for S02R for FuelCode [fueled]. This
data should be blank.

Severity

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 241 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-33

Check Name:	Check S02R Formula

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current S02R Record is not null)

If {Current S()2R/?£?t'WY/.FormulaIdcntificr is null)

If {Current Fuel Flow Record.FuelCode <> "PNG" OR Current S()2R Record Param Val Fucl o 0.0006)
return result A

else

Cur S02R Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current S()2R Record M on i tori n g F orm ill a ID

if (Cur S02R Mon Formula Record is null)
return result B

else if (Cur S02R Mon Formula ifecord.ParameterCode <> "S02R"
return result C

else if (Cur S02R Mon Formula Record.EquationCode o "D-1H")
return result D

Results:

Result
A

B
C
D

Response

You did not report a FormulalD in the HPFF record for S02R for FuelCode [fueled].
This formula is required except when using the standard default emission rate of
0.0006 for pipeline natural gas.

You reported FormulalD [ID] in the HPFF record for S02R for FuelCode [fueled],
but there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for S02R for FuelCode [fueled],
but this is not an S02R formula.

The FormulaCode of FormulalD [ID] reported in the HPFF record for S02R for
FuelCode [fueled] is invalid. The FormulaCode should be "D-1H".

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 242 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-34

Check Name:	Check Reported S02 Mass Rate

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current S02 HPFFRecord is not null)

If (Current S02 HPFF Record. Val F ucl is null or is less than 0
return result A

else if {Current Fuel Group == "OIL" AND Current S02 HPFF Record Param Val Fucl is not rounded to one decimal place)
return result B

Results:

Result
A

B

Response

The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode
[fueled] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 243 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-35

Check Name:	Determine FC Factor

Related Former Checks:

Applicability:	Appendix D Check

Description:

Validation Tables:

Fuel Type Reality Checks for FC FACTOR (Cross Check Table)

Specifications:

HFF Fc Factor = null
Current Fc Factor Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow RecordHourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "FC"

If (Count >1)

return result A
Else If (Count == 0)

If (Current C02 HPFFRecord is not null)
return result B
Else if (Current C02 HPFF Record is not null)

Current Fc Factor Record = matching record

If (Current Fc Factor Record.ParameterUOMCode o "SCFCBTU")

return result C
else if (Current FcFactor 7?ecw0)

if (Current FcFactor 7?ecw Max Allowed Fc
Factor) OR (Min Allowed FcFactor is not null AND Current Fc Factor Record.ParamValFuel < Min
Allowed Fc Factor)

return result D

else

return result E

else

return result F

Environmental Protection Agency

Page 244 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E

F

G

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

You reported an HPFF record for C02 for FuelCode [fueled], but you did not report
an HPFF record for F C for the hour.

The ParameterUOMCode reported in the HPFF record for FC for FuelCode [fueled]
is missing or invalid.

The ParameterValueForFuel reported in the HPFF record for [parameter] for
FuelCode [fueled] is outside the range of allowable values for the fuel type.
The ParameterValueForFuel reported in the HPFF record for FC for FuelCode
[fueled] is invalid.

You reported an HPFF record for FC for FuelCode [fueled], but you have not
reported an HPFF record for C02 for the hour.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 245 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-36

Check Name:

Check Extraneous Fc Factor Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current Fc Factor Record is not null)

If (Current Fc Factor itecorrf.Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If (Current Fc Factor 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-37

Check Name:	Validate C02 Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

Current C02 HPFF Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HovxlyYudFlovfTD AND
HourlyParamFuelFlow.ParameterCode = "C02"

If (Count >1)

C02 App D Accumulator = -1
return result A
Else If (Count == 0)

If (CO 2 App D Method Active For Hour == true)

CO2 App D Accumulator = -1
If (Legacy Data Evaluation == false)
return result B

else

return result H
Else if (C02 App D Method Active For Hour == true)

Current C02 HPFF Record = matching record

if (Current C02 HPFF RecordMomioxm^oxmxA^A is null
return result C

else

Cur C02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current C02 /fPFFitecorrf.MonitoringFormulalD

if (Cur C02 Mon Formula Record is null)
return result D

else if (Cur C02 Mon Formulai?ecor "G-4")
return result F

else

return result G

Environmental Protection Agency

Page 247 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E

F

G

H

Response

You reported more than one HPFF record for [parameter] for FuelCode [fueled] for
the hour.

Your monitoring plan indicates the use of the Appendix D C02 method, but you

did not report an HPFF record for C02 for FuelCode [fueled] for the hour.

You did not report a FormulalD in the HPFF record for C02 for FuelCode [fueled].

You reported FormulalD [ID] in the HPFF record for C02 for FuelCode [fueled], but

there is no active Formula record for this formula in your monitoring plan.

You reported FormulalD [ID] in the HPFF record for C02 for FuelCode [fueled], but

this is not a C02 formula.

The FormulaCode of FormulalD [ID] reported in the HPFF record for C02 for
FuelCode [fueled] is invalid. The FormulaCode should be "G-4".

You reported an HPFF record for C02 for FuelCode [fueled], but you do not have
an active Appendix D C02 method for the hour.

Your monitoring plan indicates the use of the Appendix D C02 method, but you
did not report an HPFF record for C02 for FuelCode [fueled] for the hour.
Fuel-specific C02 emissions data was not required in the EDR data, but is required
for all data submitted through ECMPS. The software will not recalculate C02
emissions values.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 248 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-38

Check Name:

Check Extraneous C02 Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

Hourly Extraneous Fields = null

If (Current C02 HPFF Record is not null)

If (Current C02 HPFF Record. Monitoring SystemID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current C02 HPFF Record ScgmcntNumbcr is not null)

append "SegmentNumber" to Hourly Extraneous Fields
If (Current C02 HPFF	OpcratingCondi tionCodc is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current C02 HPFF	Samp 1 cTypcCodc is not null)

append "SampleTypeCode" to Hourly Extraneous Fields

If (Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

Response

You reported [fieldnames] in the HPFF record for C02 for FuelCode [fueled]. This
data should be blank.

Severity

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 249 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-39

Check Name:

Calculate C02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

HFF Calc C02 = null

If (Current C02 HPFFRecord is not null)

if ( HFF Calc HI Rate is not null AND HFF Fc Factor is not null)

C02HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02" AND
UOM = "TNHR"

HFF Calc C02 = HFF Calc HI Rate * HFF Fc Factor * 44.0 / (385.0 * 2000.0), and round the result to one decimal
place.

If Current Fuel Flow	Fuel Usage Time > 0 AND Current Fuel Flow Record.FuelUsageTime <= 1 AND CO 2

App D Accumulator >=0)

// Note - this accumulates totals for all Fuel flow records and does not work like a normal parameter
CO2 App D Accumulator = C02 App D Accumulator + HFF Calc C02 * Current Fuel Flow
7?ecw= 0)

if (ABS {HFF Calc C02 - Current C02 HPFF Record. ParamValFuel) > C02 HPFF Tolerance)

return result A

else

CO2 App D Accumulator = -1

return result B

Results:

Result
A

Response

The ParameterValueForFuel reported for HPFF record for C02 for FuelCode [fueled]
is inconsistent with the recalculated value.

The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode
[fueled] could not be recalculated due to errors listed above.

Severity

Critical Error Level 1

B

Informational Message

Environmental Protection Agency

Page 250 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 251 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-40

Check Name:

Check Reported C02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

If (Current C02 HPFF Record is not null)

If (Current C02 HPFF Record Param Val Fucl is null or is less than 0
return result A

else if (Current C02 //PFFTJecwrf.ParamValFuel is not rounded to one decimal place)
return result B

Results:

Result
A

Response

The ParameterValueForFuel reported in the HPFF record for C02 for FuelCode
[fueled] is invalid. The value should be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 252 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAD-44

Check Name:	Check C02 Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current C02 HPFF Record is not null)

If 0Current C02 HPFF Record. ParameterUOMCode o "TNHR")
return result A

Results:

Result	Response	Severity

A	The ParameterUOMCode reported in the HPFF record for C02 for FuelCode	Critical Error Level 1

[fueled] is missing or invalid. The value should be "TNHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 253 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAD-45

Check Name:

Determine Appendix D Measure Codes

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

If (Current Fuel Flow Record. SourceOfDataMassCode in set {4, 5, 6} OR Current Fuel Flow
7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Monitor Measure Code Array for "DENSITY" to "MEASSUB"

else

set Monitor Measure Code Array for "DENSITY" to "SUB"
else if (Current Density Record. SampleTypeCode in set {1, 2, 5, 6, 7})

if (Monitor Measure Code Array for "DENSITY" contains "SUB")

set Monitor Measure Code Array for "DENSITY" to "MEASSUB"

else

set Monitor Measure Code Array for "DENSITY" to "MEASURE"

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 255 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Appendix E

Environmental Protection Agency

Page 256 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAE-1

Check Name:	Initialize AE Reporting Method

Related Former Checks:

Applicability:	Appendix E Check

Description:

Specifications:

App E Reporting Method = null
App E Op Code = null
App E Segment Number = null
App E Reported Value = null
App E Fuel Code = null
App E Calc HI = null

if (CurrentNOx Rate Method Code == "AE")

Total Fuel Sources = Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil

II App E Constant Fuel Mix detected when processing DHV records
if (Total Fuel Sources >1)

App E Reporting Method = "MULTIPLE"
else if (Total Fuel Sources ==1)

App E Reporting Method = "SINGLE"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 257 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-2

Check Name:

Validate NOXR Record

Related Former Checks:
Applicability:

Appendix E Check

Description:

Specifications:

Current App E NOXR Record = null

App E NOXR HPFF Count for Gas = find matching HourlyParamFuelFlow records where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Recordi\ow\y¥uQ\Y\ovi\T) AND
HourlyParamFuelFlow.ParameterCode = "NOXR"

If {App E NOXR HPFF Count for Gas == 0)

if {App E Reporting Method in set {MULTIPLE, SINGLE})

NOXR App E Accumulator = -1
return result A

else if (If App E NOXR HPFF Count for Gas > 1)

if {App E Reporting Method in set {MULTIPLE, SINGLE})

NOXR App E Accumulator = -1
return result B

else

return result D

Else if {App E Reporting Method in set {MULTIPLE, SINGLE})

Current App E NOXR Record = matching record

App E Segment Number = Current App E NOXR 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

Response

You did not report an HPFF record for NOXR to report the NOx emission rate for
individual fuels.

You reported more than one HPFF record for NOXR for FuelCode [fueled] for the
hour.

The OperatingConditionCode reported in the HPFF record for NOXR for FuelCode
[FUELCD] is missing or invalid.

You reported an HPFF record for NOXR, but, according to your monitoring plan,
you use an Appendix E mixed fuel curve to determine the NOx emission rate. If this
is the case, you should report the NOx emission rate in a NOXR DHV record. The
HPFF record will not be evaluated and the NOx emissions rate will not be
recalculated.

You reported an HPFF record for NOXR, but you have not defined a NOXR AE
method in your monitoring plan that is active during the current hour. The HPFF
record will not be evaluated and the NOx emissions rate will not be recalculated.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 259 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-4

Check Name:

Check for Extraneous Fields in NOXR Record

Related Former Checks:
Applicability:

Appendix E Check

Description:

Specifications:

Hourly Extraneous Fields = null

if (Current App E NOXR Record is not null)

if (Current App E NOXR 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-5

Check Name:

Check Monitoring System Data for Appendix E NOXR

Related Former Checks:
Applicability:

Appendix E Check

Description:

Specifications:

if {Current App E NOXR Record is not null)

App E NOXE System ID = null
App E NOXE System Identifier = null

if {Current App E NOXR 7?ecw "NOXE"
return result D

else if {Current App E NOXR Mon Sys Record.FuelCode o Current Fuel Flow Record FuclC'odc
return result E

else

App E NOXE System ID = Current App E NOXR Record .MonitoringSystemld

App E NOXE System Identifier = Current App E NOXR Mon Sys Record. Sy stemldentifier

if (Current App E NOXR /?et'w
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 262 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-7

Check Name:

Related Former Checks:

Retrieve Appendix E Correlation Test Results or Default Value

Applicability:

Description:

Specifications:

Appendix E Check

Maximum App E Curve NOx Emission Rate = null
App E NOx MER = null
App E Segment Total = null

If (App E Op Code in set {N, W, X, Y, Z} )

if (Current Appendix E Status begins with "IC" or "Undetermined")

QA Supp Attribute Count Record = matching record in QASuppAttribute where

Q ASupp Attribute. QASuppDatald = Prior Appendix E Record. QASuppDatald
QASuppAttribute. AttributeName = "SEGMENT_COUNT"

if (QA Supp Attribute Count Record is not null)

App E Segment Total = QA Supp AttributeCount Record. Attribute Value
Dimension App E Correlation NOx Rate Array with App E Segment Total elements
Dimension App E Correlation Heat Input Array with AppE Segment Total elements

for (X = 1 to App E Segment Total)

QA Supp Attribute Segment NOx Record = matching record in QASuppAttribute where
QASuppAttribute. QASuppDatald = Prior Appendix E Record. QASuppDatald
QASuppAttribute. AttributeName = "NOX_RATE_X" (where X matches the loop variable)

if (QA Supp Attribute Segment NOx Record is not null)

if (QA Supp Attribute Segment NOx Record .Attribute Value > Maximum App E Curve NOx
Emission Rate

Maximum App E Curve NOx Emission Rate = QA Supp Attribute Segment NOx
Record. Attribute V alue

App E Correlation NOx Rate Array[X] = QA Supp Attribute Segment NOx
Record. Attribute V alue

QA Supp Attribute Segment HI Record = matching record in QASuppAttribute where
QASuppAttribute. QASuppDatald = Prior Appendix E Record. QASuppDatald
QASuppAttribute. AttributeName = "HI_RATE_X" (where X matches the loop variable)

if (QA Supp Attribute Segment HI Record is not null)

App E Correlation Heat Input Arra^X] = QA Supp Attribute Segment HI
Record. Attribute V alue

else if (App E Op Code in set {E, M, U} )

Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND

Environmental Protection Agency

Page 263 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code

if (Count <> 1)

return result A

else

App E NOxMER Default Record = matching record
If {App E NOxMER Default Record. DefaultValue > 0

App E NOx MER = App E NOx MER Default i?ecor
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAE-8

Check Name:	Determine Appendix E Curve Segment

Related Former Checks:

Applicability:	Appendix E Check

Description:

Specifications:

App E Calc Segment Num = null
if (App E Op Code is not null)

switch (App E Op Code)

case "E" or "U" or "M" or "W":

if App E Segment Number is not null
return result A

case "N" or "X":

If (App E Segment Total is not null)

if App E Segment Number is not null

if [App E Segment Number > number of elements in the App E Correlation NOx Rate
Array)

return result B

else if (App E Correlation NOx Rate Array \App E Segment Number} o Maximum App E
Curve NOx Emission Rate)

return result B

else

if (Legacy Data Evaluation == false)
return result G

case "Y" OR"Z":

If (App E Calc HI is not null) and (App E Segment Total is not null)
i = 1

while (i <= App E Segment Total AND App E C ale HI > App E Correlation Heat Input Rate
Array[i])

i = i + 1

if (i <= App E Segment Total AND App E Calc HI <= App E Correlation Heat Input Arra^i])
App E Calc Segment Num = i

if (App E Op Code == "Z")

if (App E Calc Segment Num ol)

return result C
else if App E Segment Number is null

if (Legacy Data Evaluation == false)

Environmental Protection Agency

Page 265 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result G
else if (App E Segment Number ol)
return result D

else if App E Segment Number is null

if (Legacy Data Evaluation == false)
return result G

else if (App E Calc HI == App E Correlation Heat Input A rray\ i \)

if (App E Segment Number <> App E Calc Segment Num AND AppE Segment
Number <> App E Calc Segment Num + 1)

return result E

else

if (App E Segment Number o App E Calc Segment Num)
return result E

return result F

Results:

Result
A

B

D

E
F

Response

You reported a SegmentNumber in the HPFF or DHV record for NOXR for
FuelCode [fueled]. This field should be blank when OperatingConditionCode is
[OpCode].

You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF record
for NOXR for FuelCode [fueled], but the reported SegmentNumber does not
represent the segment on the Appendix E curve with the maximum NOx emission
rate.

You reported an OperatingConditionCode of Z in the DHV or HPFF record for
NOXR for FuelCode [fueled], but the calculated heat input rate is not below the
lowest point on the Appendix E curve.

You reported an OperatingConditionCode of Z in the DHV or HPFF record for
NOXR for FuelCode [fueled], but you did not report a SegmentNumber of 1.
The SegmentNumber reported in the HPFF or DHV record for NOXR for FuelCode
[fueled] is inconsistent with the calculated heat input.

You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF record
for NOXR for FuelCode [fueled], but the calculated heat input rate is higher than
the maximum heat input rate on the Appendix E curve. You should report an
OperatingConditionCode of W, and use the appropriate substitute data algorithm
to calculate the NOx emission rate.

You did not report a SegmentNumber in the HPFF or DHV record for NOXR for
FuelCode [fueled].

Severity

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 266 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

2

3

Process/Category:

Conditions:

Process/Category:

Conditions:

Process/Category:

Conditions:

Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 267 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-9

Check Name:

Calculate Appendix E NOx Rate

Related Former Checks:
Applicability:

Appendix E Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

App E Calculated NOx Rate for Source = null
if (App E Op Code in set {Y, Z})

If (App E Calc Segment Num is not null)

if (App E Calc Segment Num == 1)

App E Calculated NOx Rate for Source = App E Correlation NOx Rate Array\ 1 ]

else

y2 = App E Correlation NOx Rate Array[App E Calc Segment Num\
x2 = App E Correlation Heat Input A rray\ App E Calc Segment Num\
y 1 = App E Correlation NOx Rate Array[App E Calc Segment Num - 1]
xl = App E Correlation Heat Input Airay\ App E Calc Segment Num - 1]

slope = (y2 - yl) / (x2 - xl)

App E Calculated NOx Rate for Source = slope * (App E Calc HI - x 1) + y 1, and round the result to 3
decimal places.

else if (App E Op Code in set {N, X})

App E Calculated NOx Rate for Source = Maximum App E Curve NOx Emission Rate

else if (App E Op Code in set {E, M, U})

App E Calculated NOx Rate for Source = App E NOx MER

else if (App E Op Code == " W" AND Maximum App E Curve NOx Emission Rate is not null AND App E Reported Value >= 0
AND App E Reported Value is rounded to three decimal places)

If (App E Reported Value >= Maximum App E Curve NOx Emission Rate *1.25 (rounded to 3 decimal places))

App E Calculated NOx Rate for Source = App E Reported Value

else

Count active MonitoringDefault record for location where

ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code

if (Count <> 1)

return result A

Environmental Protection Agency

Page 268 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

NOxMER Default Record = matching record
If {NOxMER Default Record. DefaultValue > 0)

If (App E Reported Value>= NOx MER Default Record. DefaultValue)

App E Calculated NOx Rate for Source = App E Reported Value

else

if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result B

else

NOXR App E Accumulator = -1

return result C

else

if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result D

else

NOXR App E Accumulator = -1

return result D

if (App E Calculated NOx Rate for Source is not null)

NOXR HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

if (App E Reporting Method == "CONSTANT")

if (App E Reported Value >= 0 AND ABS (App E Calculated NOx Rate for Source - App E Reported Value) >

NOXR HPFF Tolerance)
return result E

if (App E Reporting Method == "APPORTIONED")

Apportionment Calc NOXR Array at this Location = App E Calculated NOx Rate for Source

if (Rpt Period NOx Rate Calculated Accumulator Array fox this location is not null)

if (Rpt Period NOx Rate Calculated Accumulator Array for this location >= 0)

Rpt Period NOx Rate Calculated Accumulator Array for this location = Rpt Period NOx Rate
Calculated Accumulator Array for this location + App E Calculated NOx Rate for Source

else

Rpt Period NOx Rate Calculated Accumulator Array for this location = App E Calculated NOx Rate for
Source

Rpt Period NOx Rate Hours Accumulator Array for this location = Rpt Period NOx Rate Hours Accumulator
Array for this location + 1

Set Current Measure Code to the Monitor Measure Code Array for "NOXR".

if (App E Reported Value >= 0 AND ABSfApp E Calculated NOx Rate for Source - App E Reported Value) >

NOXR HPFF Tolerance)
return result E

Environmental Protection Agency

Page 269 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If Current Fuel Flow Record.¥ue\UsageTmie > 0 AND Current Fuel Flow Record.FuelUsageTime <= 1 AND
NOXR App E Accumulator >= 0 AND App E Calc HI is not null)

NOXR App E Accumulator = NOXR App E Accumulator + {App E Calculated NOx Rate for Source *
Current Fuel Flow 7?ecw= 0 AND ABSfApp E Calculated NOx Rate for Source - App E Reported Value) >

NOXR HPFF Tolerance)

if {App E Reporting Method == "CONSTANT")
return result G

else if {App E Reporting Method == "APPORTIONED")

Apportionment Calc NOXR Array at this Location = -1

Rpt Period NOX Rate Calculated Accumulator Array for this location = -1

return result G

else if {App E Op Code is not null)

NOXR App E Accumulator = -1

return result H

return result F

else

Results:

Result
A

Response

The NOx emission rate could not be determined, because you did not report one
and only one missing data default record for NORX for FuelCode [fueled] in your
monitoring plan that was active during current hour.

You reported an OperatingConditionCode of W in the DHV record for NOXR for
FuelCode [fueled], but the AdjustedHourly Value is less than the minimum
allowable substitute data value according to Appendix E sec. 2.5.2.1.

You reported an OperatingConditionCode of W in the HPFF record for NOXR for
FuelCode [fueled], but the ParameterValueForFuel is less than the minimum
allowable substitute data value according to Appendix E sec. 2.5.2.1.

The NOx emission rate could not be determined, because the DefaultValue in the
NORX default record for FuelCode [fueled] is invalid.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

The ParameterValueForFuel reported in the HPFF record for NOXR for FuelCode
[fueled] is inconsistent with the value recalculated from the Appendix E curve.
The AdjustedHourly Value in the DHV record for [param] could not be recalculated
due to errors listed above.

The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode
[fueled] could not be recalculated due to errors listed above.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

D

Critical Error Level 1

E

Critical Error Level 1

F

Critical Error Level 1

G

Informational Message

H

Informational Message

Environmental Protection Agency

Page 270 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

2

3

Process/Category:

Conditions:

Process/Category:

Conditions:

Process/Category:

Conditions:

Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 271 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-13

Check Name:

Check Reported NOx Emission Rate

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

If {Current Appe E NOXR Record is not null)

If {Current App E NOXR 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAE-14

Check Name:	Check NOXR Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If {Current App E NOXR Record is not null)

If (Current App E NOXR 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAE-15

Check Name:

Determine Appendix E Measure Code

Related Former Checks:

Applicability:

Appendix E Check

Description:

Specifications:

if (App E Op Code is not null)

If (AppE Op Code = "E" or Monitor Measure Code Array for "NOXR" =="OTHER")

set Monitor Measure Code Array for "NOXR" to "OTHER"
else if (.AppE Op Code in set {M, U, N})

if (Monitor Measure Code Array for "NOXR" begins with "MEAS")

set Monitor Measure Code Array for "NOXR" to "MEASSUB"

else

set Monitor Measure Code Array for "NOXR" to "SUB"
else if (AppE Op Code in set {W, X, Y, Z})})

if (Monitor Measure Code Array for "NOXR" contains "SUB")

set Monitor Measure Code Array for "NOXR" to "MEASSUB"

else

set Monitor Measure Code Array for "NOXR" to "MEASURE"

Results:

Result

Response

Severity

Usage:

2

3

Process/Category:

Conditions:

Process/Category:

Conditions:

Process/Category:

Conditions:

Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 274 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Apportionment

Environmental Protection Agency

Page 275 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAPP-1

Check Name:

Determine Monitoring Plan Configuration

Related Former Checks: HOUROP-28

Applicability:

CEM Check

Description:

Specifications:

MP Stack Config for Hourly Checks = null

MP Pipe Config for Hourly Checks = null

MP Load UOM = null

MP Unit Load = null

Stack OpTime Accumulator = 0

Stack LoadTimesOpTime Accumulator = 0

Pipe LoadTimesOpTime Accumulator = 0

Config HeatlnputTimesOpTime Accumulator = 0

Config NOxRateTimesHeatlnput Accumulator = 0

Config NOxRateTimesOpTime Accumulator = 0

Config OpTime Accumulator = 0

Config Heatlnput Accumulator = 0

Max Stack OpTime = 0

Unit OpTime Accumulator = 0

Unit LoadTimesOpTime Accumulator = 0

Unit HeatlnputTimesOpTime Accumulator = 0

Max Unit OpTime = 0

CP Fuel Count = 0

Current Month = month from Current Date

AppE Reporting Method = null

App E Op Code = null

App E Segment Number = null

App E Reported Value = null

App E Fuel Code = null

App E Calc HI = null

App E NOXE System ID = null

App E NOXE System Identifier = null

CurrentAppendixEStatus = null

EarliestLocationReportDate = null

Current Measure Code = null

Set Monitor Measure Code Array to null for each parameter.

For each array below, initialize each array with Current Location Count entries and the values as described

Apportionment OpTime Array - set each element in array to 0.0
Apportionment Load Array - set each element in array to 0
Apportionment Calc HI Array - set each element in array to 0.0
Apportionment Calc NOXR Array - set each element in array to 0.0
Apportionment HI Method Array - set each element in array to null
Apportionment NOX Method Array - set each element in array to null
Apportionment HI Measure Code Array - set each element in array to null
Apportionment NOXR Measure Code Array - set each element in array to null
Apportionment Stack Unit List - set each element in array to null
Apportionment NOXR Method Array - set each element in array to null

Environmental Protection Agency

Page 276 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If Current Location Count > 1

Find List of MonitorLocationlds in MonitorPlanLocation Table that match Current Monitoring Plan Id

For each MonitorLocationld in list, lookup record in Monitor I. ocation table
if StackPipeld is not null, add StackPipeld to StackPipe list
if Unitld is not null, add Unitld to Unit list

MS Count = 0
MP Count = 0
CS Count = 0
CP Count = 0
Unit Count = 0
CS Unit Count = 0
CP Unit Count = 0
Unit MS Count = 0

For each MonitorLocationld in list, lookup record in MonitorLocation table

if MonitorLocation. StackPipelD is not null,

set Stack Unit Count to 0

for each UnitStackConfiguration record where

BeginDate <= Current Date AND EndDate >= Current Date AND
StackPipeld = MonitorLocation. StackPipeld

add 1 to Stack Unit Count

append MonitorLocationID of the unit to Apportionment Stack Unit List for the stack location

if (StackPipeUnit Count > 0)

if {MonitorLocation.StackPipeName begins with "MS")
add 1 to MS Count

else if {MonitorLocation.StackPipeName begins with "MP")
add 1 to MP Count

else if {MonitorLocation.StackPipeName begins with "CS")
add 1 to CS Count

f (CSCount == 1)

CS Unit Count = Stack Unit Count

else if {MonitorLocation.StackPipeName begins with "CP")
add 1 to CP Count

if {CP Count ==1)

CP Unit Count = Stack Unit Count

else if Unitld is not null

Environmental Protection Agency

Page 277 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

add 1 to Unit Count

if (Unit Count == 1)

Unit MS Count = number of UnitStackConfiguration records where
UnitStackConfiguration.BegmD&te <= Current Date AND
UnitStackConfigurationHndD&tQ >= Current Date AND
UnitStackConfiguration.UmtID = MonitorLocation. Unitld
UnitStackConfiguration.StackPipeName begins with "MS"

if (MS Count > 1 AND CS Count == 0 AND Unit Count == 1 AND MS Count == Unit MS Count)
MP Stack Config for Hourly Checks = "MS"

Multiple Stack Configuration = true
else if (CS Count == 1 AND MS Count == 0 AND Unit Count > 1 AND Unit Count == CS Unit Count)

MP Stack Config for Hourly Checks = "CS"
else if (CS Count == 1 AND MS Count > 0)

MP Stack Config for Hourly Checks = "CSMS"
else if (CS Count + MS Count > 0)

MP Stack Config for Hourly Checks = "COMPLEX"

If (CP Count ==1 AND MP Count == 0 AND Unit Count > 1 AND Unit Count == CP Unit Count)

MP Pipe Config for Hourly Checks = "CP"
else if (CP Count + MP Count > 0)

MP Pipe Config for Hourly Checks = "MULTIPLE"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Initialization

Environmental Protection Agency

Page 278 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAPP-2

Check Name:	Pre-Validate Heat Input Calculation

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Calculate Apportioned HI = false

Calculate NOXM From Apportioned HI = false

if Current Monitor Plan Location Record Stack Pipe ID is not null

If the StackPipelD of the monitoring location begins with "CS",
set Current HI Entity Type = "CS"

If the StackPipelD of the monitoring location begins with "CP",
set Current HI Entity Type = "CP"

If the StackPipelD of the monitoring location begins with "MS",
set Current HI Entity Type = "MS"

If the StackPipelD of the monitoring location begins with "MP",
set Current HI Entity Type = "MP"

else if the UnitID of the monitoring location is not null
set Current HI Entity Type = "Unit"

If {Apportionment HI Method Array for the location contains "CALC") OR (Apportionment HI Method Array for the location ==
"COMPLEX")

If {MP Pipe Configfor Hourly Checks == "CP" AND CP Fuel Count >1)

Apportionment HI Method Array for the location == "NOCALC"

If (Apportionment OpTime Array for the location > 0 AND Apportionment OpTime Array for the location <= 1)

//F-25

If (MP Stack Configfor Hourly Checks == "CS" AND Current HI Entity Type = "CS")

if (Apportionment NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

If Apportionment OpTime Array fox the location < Max Unit OpTime

return result A

else if Apportionment OpTime Array for the location > Unit OpTime Accumulator + (the number of units in
the monitoring plan * .005)
return result B

else

If (Config HeatlnputTimesOpTime Accumulator >0)

Calculate Apportioned HI = true

if (MPLoad UOM <> "INVALID" AND Stack LoadTimesOpTime Accumulator > 0 AND Unit
LoadTimesOpTime Accumulator > 0 AND absfStack LoadTimesOpTime Accumulator - Unit
LoadTimesOpTime Accumulator) >= number of items in the Apportionment OpTime Array)

Environmental Protection Agency

Page 279 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result C

//F-21A/B

else if {{MP Stack Config for Hourly Checks== "CS" OR MP Pipe Config for Hourly Checks== "CP") AND
Apportionment HI Method Array fox the location not in set {NOCALC, COMPLEX})

if {Apportionment NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

If Max Stack OpTime < Max Unit OpTime AND MP Pipe Config for Hourly Checks is null
return result A

else if Max Stack OpTime > Unit OpTime Accumulator + (the number of units in the monitoring plan *
.005) AND MP Pipe Config for Hourly Checks is null

return result B
else if MPLoadUOM <> "INVALID"

if {{MP Pipe Config for Hourly Checks <> " CP" AND MP Stack Config for Hourly Checks ==
"CS" AND StackLoadTimesOpTimeAccumulator > 0 AND UnitLoadTimesOpTime
Accumulator > 0 AND {Stack LoadTimesOpTime Accumulator - Unit LoadTimesOpTime
Accumulator) > number of items in the Apportionment OpTime Array)
return result C

else if {Config HeatlnputTimesOpTime Accumulator >= 0 AND Apportionment Load Array for
this Location >= 0 AND Unit LoadTimesOpTime Accumulator >= 0 AND Apportionment Calc HI
Array for this Location >= 0)

Calculate Apportioned HI = true

If {Unit LoadTimesOpTime Accumulator == 0)

Apportionment HI Method Array for the location == "NOCALC"

// Cannot apportionment but will validate total configuration

else if {{MP Stack Config for Hourly Checks begins with "CS" OR MP Pipe Configfor Hourly Checks == "CP" OR
MP Pipe Config for Hourly Checks == "MULTIPLE") AND Apportionment HI Method Array fox the location <>
"COMPLEX")

if {Apportionment NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

If Max Stack OpTime > Unit OpTime Accumulator + (the number of units in the monitoring plan * .005)
AND MP Pipe Config for Hourly Checks is null
return result B

else if {Config HeatlnputTimesOpTime Accumulator > 0 and Unit HeatlnputTimesOpTime Accumulator
== 0) OR {Config HeatlnputTimesOpTime Accumulator == 0 AND Unit HeatlnputTimesOpTime
Accumulator >0)

return result G

else if {Config HeatlnputTimesOpTime Accumulator >= 0 AND Unit HeatlnputTimesOpTime
Accumulator >= 0)

Calculate Apportioned HI = true

// COMPLEX

else if {MP Stack Config for Hourly Checks == "COMPLEX" OR Apportionment HI Method Array for the location
== "COMPLEX")

Environmental Protection Agency

Page 280 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if {Apportionment NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

if {Config HeatlnputTimesOpTime Accumulator > 0 and Unit HeatlnputTimesOpTime Accumulator == 0)
OR {Config HeatlnputTimesOpTime Accumulator == 0 AND Unit HeatlnputTimesOpTime Accumulator

>0)

return result G

else if {Config HeatlnputTimesOpTime Accumulator >= 0 AND Unit HeatlnputTimesOpTime
Accumulator >=0)

Calculate Apportioned HI = true

//F-21C

else if {MP Stack Config for Hourly Checks == "MS")

if {Apportionment NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

if {Config HeatlnputTimesOpTime Accumulator >= 0)

Calculate Apportioned HI = true

If Apportionment OpTime Array for the location < Max Stack OpTime

return result D

else if Apportionment OpTime Array fox the location > Stack OpTime Accumulator

return result E

else if {Current Entity Type -o-"Unit" AND Apportionment OpTime Array fox the location > 0 AND the sum of Apportionment
OpTime Array for all units in the Apportionment Stack Unit List for the location == 0)
if {Current Entity Type starts with "C")
return result B

else

return result D

else if {Current Entity Type == "MS" AND MP Load UOM o "INVALID" and MP Unit Load > 0 AND Apportionment Load
Array fox the location >0)

if {MP Unit Load <> Apportionment Load Array for the location)
return result F

Environmental Protection Agency

Page 281 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E

F

G

Response

The OperatingTime reported at the common stack/pipe is less than the
OperatingTime reported for one or more units linked to the stack/pipe.
The OperatingTime reported for one (or more) stacks/pipes is greater than the sum
of the operating times reported for the units for the hour.

The HourLoad reported at the common stack/pipe is inconsistent with the load and
operating time values reported at the units linked to the stack/pipe.
The OperatingTime reported for the unit is less than the OperatingTime reported
for one or more multiple stacks linked to the unit.

The OperatingTime reported for the unit is greater than the sum of operating times
at the multiple stacks linked to the unit.

The HourLoad in the Hourly Operating record for all multiple stacks linked to this
unit are not equal.

The Heat Input Rate and Operating Time reported for the unit is inconsistent with
the Heat Input Rates and Operating Times for the configuration.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 282 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAPP-3

Check Name:	Calculate Apportioned or Summed Heat Input Rate

Related Former Checks:	HOUROP-29

Applicability:	CEM Check
Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Current HI Apportionment Record = null
HI Calculated Apportioned Value = null
AppE Checks Needed = false

If {Apportionment HI Method Array for the location contains "CALC" OR Apportionment HI Method Array for the location
equals "COMPLEX")

If {Calculate Apportioned HI = true)

Count active DerivedHourly ValueData records for location
WHERE ParameterCode = "HI"

If {Count ==1)

Current HI Apportionment Record = matching record

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI" AND
UOM = "MMBTUHR"

else

Calculate Apportioned HI = false

// F-25

If {MP Stack Config for Hourly Checks == "CS" AND Current HI Entity Type = "CS")

If {Calculate Apportioned HI == true)

HI Calculated Apportioned Value = Config HeatlnputTimesOpTime Accumulator / Apportionment
OpTime Array for this Location, rounded to one decimal place.

if {Current Month is not April OR Annual Reporting Requirement == true)

If {Rpt Period HI Calculated Accumulator for this location >=0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated
Accumulator for this location + {HI Calculated Apportioned Value * Apportionment
OpTime Array for this Location)

if {Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for
this location + {HI Calculated Apportioned Value * Apportionment OpTime Array for this
Location)

if {Current HI A pportionment Record Adj ustcdHourly V al lie >= 0 AND ABSiCurrent HI Apportionment

7?ecw Heat Input Tolerance)

Environmental Protection Agency

Page 283 of 703


-------
Draft ECMPS Emissions Check Specifications

return result A

3/7/2012 12:00:00AM

else if {Apportionment OpTime Array for the location <> 0)

if {Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result B

// other complex situations

else if {Current HI Entity Type <> "Unit")

If {Calculate Apportioned HI == true AND Current HI Apportionment Record Adj ustcdHourly Val lie >= 0)

HI Calculated Apportioned Value = Current HI Apportionment Record Adj ustcdHourly Value

if {Current Month is not April OR Annual Reporting Requirement == true)

If {Rpt Period HI Calculated Accumulator for this location >=0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated
Accumulator for this location + (HI Calculated Apportioned Value * Apportionment
OpTime Array for this Location)

if {Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for
this location + {HI Calculated Apportioned Value * Apportionment OpTime Array for this
Location)

else if {Apportionment OpTime Array for the location o 0)

if {Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result B

//F-21A/B

else if {{MP Stack Config for Hourly Checks== "CS" OR MP Pipe Config for Hourly Checks== "CP") AND
(Apportionment HI Method Array fox the location not in set {NOCALC, COMPLEX})

If {Apportionment NOXR Method Array for the location = "AE")
AppE Checks Needed = true

If {Calculate Apportioned HI == true)

if {Unit LoadTimesOpTime Accumulator > 0 OR Current HI A pportionment Record Adj ustcdHourly V aluc

>=0)

if {Unit LoadTimesOpTime Accumulator >0)

HI Calculated Apportioned Value = {Config HeatlnputTimesOpTime Accumulator*
Apportionment OpTime Array for this Location * Apportionment Load Array for this
Location / Unit LoadTimesOpTime Accumulator ) / Apportionment OpTime Array for this
Location), rounded to one decimal place.

Environmental Protection Agency

Page 284 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

HI Calculated Apportioned Value = Current HI Apportionment
itecorrf. AdjustedHourly'Value

HI Calculated Apportioned Value = HI Calculated Apportioned Value + Apportionment Calc HI
Array for this Location

if (Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >=0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI
Calculated Accumulator for this location + (HI Calculated Apportioned Value *
Apportionment OpTime Array for this Location)

if (Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated
Accumulator for this location + (HI Calculated Apportioned Value *
Apportionment OpTime Array for this Location)

if (Current HI Apportionment Record. AdjustedHourlyValue >= 0 AND A B S (Current HI
Apportionment Record. Kd)us\edilo\iv\yValue - HI Calculated Apportioned Value) > Heat Input
Tolerance)

return result A

else if (Apportionment OpTime Array for the location o 0)

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result B

else if (Apportionment OpTime Array for the location o 0)

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result B

// Cannot apporition or Complex configuration

else if (MP Stack Configfor Hourly Checks begins with "CS" OR MP Stack Conjig for Hourly Checks == "COMPLEX"
OR MP Pipe Config for Hourly Checks in set {CP, MULTIPLE})

If (Apportionment NOXR Method Array for the location = "AE")
AppE Checks Needed = true

If (Calculate Apportioned HI == true)

If (ABS(ConfigHeatlnputTimesOpTimeAccumulator - UnitHeatlnputTimesOpTime Accumulator) <=
Heat Input Tolerance OR Apportionment HI Method Array for the location == "COMPLEX" OR (MP Stack
Config for Hourly Checks == "COMPLEX" and MP Pipe Config for Hourly Checks is null))

HI Calculated Apportioned Value = Current HI Apportionment Record. AdjustedHowly Value

if (Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >= 0)

Rpt Period HI Calculated Accumulator for this location = RptPeriodHI

Environmental Protection Agency

Page 285 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Calculated Accumulator for this location + (HI Calculated Apportioned Value *
Apportionment OpTime Array for this Location)

if (Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated
Accumulator for this location + (HI Calculated Apportioned Value *
Apportionment OpTime Array fox this Location)

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result C

else if (Apportionment OpTime Array for the location o 0)

if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator for this location = -1

Count active DerivedHourly ValueData records for location
WHERE ParameterCode = "HI"

If (Count ==1)

Current HI Apportionment Record = matching record

if (Current HI Apportionment Record. AdjustedHourlyValue > 0 AND Config

HeatlnputTimesOpTime Accumulator == 0)

return result D

else

return result B

else

return result B

// F-21C

else if (MP Stack Config for Hourly Checks == "MS")

If (Calculate Apportioned HI == true)

HI Calculated Apportioned Value = Config HeatlnputTimesOpTime Accumulator / Unit OpTime
Accumulator, rounded to one decimal place.

if (Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >= 0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated
Accumulator for this location + (HI Calculated Apportioned Value * Unit OpTime
Accumulator)

if (Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for
this location + (HI Calculated Apportioned Value * Apportionment OpTime Array for this
Location)

if [Current HI Apportionment Record Adj ustcdHourly Value >= 0 AND ABS(Current HI Apportionment

7?ecw Heat Input Tolerance)
return result A

Environmental Protection Agency	Page 286 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (.Apportionment OpTime Array for the location o 0)

if {Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator for this location = -1
return result B

Results:

Result
A

B

C

D

Usage:

1

Response

The AdjustedHourly Value reported in the DHV record for HI is inconsistent with
the recalculated apportioned or summed value.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
due to other errors listed in this report.

The heat input calculated for the configuration is inconsistent with the sum of the
reported heat input at the units in this configuration.

You reported heat input at the unit, but there was no heat input at any of the
locations where heat input was measured.

Severity

Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 287 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURAPP-4

Check Name:	Calculate NOx Mass Rate from Apportioned or Summed Heat Input Rate

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

Current NOX Apportionment Based Record = null
NOX Calculated Apportionment Based Value = null

If (Calculate NOXM From Apportioned HI == true)

If {HI Calculated Apportioned Value is not null AND Apportionment Calc NOXR Array for this location >= 0)

Count active DerivedHourly ValueData records for location and hour
WHERE ParameterCode = "NOX"

If (Count ==1)

Current NOX Apportionment Based Record = matching record

NOX Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOX" AND
UOM = "LBHR"

NOX Calculated Apportionment Based Value = HI Calculated Apportioned Value * Apportionment Calc
NOXR Array, rounded to one decimal place.

if {Current Month is not April OR Annual Reporting Requirement == true

if (Apportionment OpTime Array for this location is between 0 and 1 (inclusive))

If (Rpt Period NOX Mass Calculated Accumulator for this location) >= 0)

Rpt Period NOX Mass Calculated Accumulator for this location = Rpt Period NOX
Mass Calculated Accumulator for this location + (NOX Calculated Apportionment
Based Value * Apportionment OpTime Array for this location)

if (Current Month is April)

April NOX Mass Calculated Accumulator for this location = April NOX Mass
Calculated Accumulator for this location + (NOX Calculated Apportionment
Based Value * Apportionment OpTime Array for this location)

else

Rpt Period NOX Mass Calculated Accumulator for this location = -1

if (Current NOX Apportionment Record. AdjustsdHouvly Value >= 0)

If (ABS(Current HI Apportionment Record. AdjustedHourlyValue - NOX Calculated
Apportionment Based Value) > NOX Tolerance)

If (Legacy Data Evaluation == false)

Environmental Protection Agency

Page 288 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result A

else if {Apportionment OpTime Array for this Location is greater than 0 and less than or
equal to 1)

If (kBSiCurrent HI Apportionment /?ec«/Y/. AdjustedHourly Value - NOX
Calculated Apportionment Based Value) > NOX Tolerance / Apportionment
OpTime Array for this Location)
return result A

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B

Results:

Result	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent	Critical Error Level 1

with the recalculated value.

B	The AdjustedHourly Value in the DHV record for [param] could not be recalculated Informational Message

due to other errors listed in this report.

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 289 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAPP-5

Check Name:

Sum Weighted NOx Emission Rate from Multiple Stacks

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If {MP Stack Config for Hourly Checks == "MS" AND Current HI Entity Type == "Unit")

If (Config NOxRateTimesHeatlnput Accumulator <> 0 OR Config NOxRateTimesOpTime Accumulator <> 0)

Expected Summary Value NOx Rate Array for this location = true

If (Config NOxRateTimesHeatlnput Accumulator > 0 AND Config Heatlnput Accumulator > 0 AND Rpt Period
NOX Rate Calculated Accumulator Array for this location >= 0)

Rpt Period NOX Rate Calculated Accumulator Array for this location = Rpt Period NOX Rate Calculated
Accumulator for this location + (Config NOxRateTimesHeatlnput Accumulator / Config Heatlnput
Accumulator, rounded to 3 decimal places.)

Rpt Period NOX Rate Hours Accumulator Array for this location = Rpt Period NOX Rate Hours
Accumulator for this location + 1

else if (Config NOxRateTimesOpTime Accumulator > 0 AND Config OpTime Accumulator > 0 AND Rpt Period
NOX Rate Calculated Accumulator Array for this location >= 0)

Rpt Period NOX Rate Calculated Accumulator Array for this location = Rpt Period NOX Rate Calculated
Accumulator for this location + (Config NOxRateTimesOpTime Accumulator / Config OpTime
Accumulator, rounded to 3 decimal places.)

Rpt Period NOX Rate Hours Accumulator Array for this location = Rpt Period NOX Rate Hours
Accumulator for this location + 1

else

Rpt Period NOX Rate Calculated Accumulator Array for this location = -1

Results:

Result

Response

Severity

Environmental Protection Agency

Page 290 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 291 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURAPP-6

Check Name:

Related Former Checks:

Initialize Variable for Calculating Appendix E NOx Rate via Apportionment

Applicability:

Description:

Specifications:

Appendix E Check

If (App E Checks Needed == true)

App E Op Code = null

App E Reporting Method = "APPORTIONED'

Count active DerivedHourly ValueData records for location and hour

WHERE ParameterCode = "NOX"

If (Count == 1)

Current NOXR Apportionment Based Record = matching record

if (Current NOXR Apportionment Based 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C

Response

You reported an OperatingConditionCode of E in the DHV record for NOXR. You
should report the NOx emission rate for emergency fuels in an HPFF record, not a
DHV record.

The OperatingConditionCode reported in the DHV record for NOXR is missing or
invalid.

According to your monitoring plan, your reported that you are determining NOx
emission rate using the Appendix E methodology, but you did not report a
MonitoringSystemID in this record. You should report the MonitoringSystemID of
the NOXE system associated with the Appendix E fuel curve.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 293 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Calculated Data

Environmental Protection Agency

Page 294 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-1

Check Name:

Calculate Percent H20

Related Former Checks:

Applicability:

CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (H20 Method Code = "MWD" AND Current DHV Record ModcCode in set {01, 02, 03, 04, 53, 54})

if (H20 CEM Equation Code == "F-31")

if (Current DHV Record Valid == true AND 02 Wet Calculated Adjusted Value is not null AND 02 Dry
Calculated Adjusted Value is not null)

H20 DHV Calculated Adjusted Value = ((02 Dry Calculated Adjusted Value - 02 Wet Calculated
Adjusted Value) * 100.0 ) / 02 Dry Calculated Adjusted Value, ROUNDED to one decimal place.

H20 Cone Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "H20" AND
UOM = "PCT"

If (Derived Hourly Adjusted Value Status == true AND ABS (H20 DHV Calculated Adjusted Value -
Current DHV Record. AdjustedHourly Value) > H20 Cone Tolerance)
return result A

else

return result B

else if (H20 CEM Equation Code == "M-1K")

if (Derived Hourly Adjusted Value Status == true)

H20 DHV Calculated Adjusted Value = Current DH V Record Ad j ustcdHourly Val lie

else

return result B

else if (H2() Method Code = "MDF" AND Current DHV Record ModcCode == "40")
H20 DHV Calculated Adjusted Value = H20 Default Value

else

H20 DHV Calculated Adjusted Value = Current DHV Calculated Adjusted Value

Results:

Result
A

Response

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
due to errors listed above.

Severity

Critical Error Level 1

B

Informational Message

Environmental Protection Agency

Page 295 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Calculation Verification

Environmental Protection Agency

Page 296 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-3

Check Name:

Determine Diluent Cap and Moisture for C02 Concentration Calculation Verification

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

if (CO 2 Cone CEM Equation Code == "F-14B")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for C02C = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)

Calculated Moisture for C02C = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for C02C = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is not
null)

if (Use 02 Diluent Cap for Co2 Cone Calc == true)

02XCount = # of active MonitoringDefault records for location where
ParameterCode = '02X' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if (02XCount > 1)

return result A
else if (02XCount == 0)

return result B
else if MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent for C02C = MonitoringDefault.DefaultValue

case (CO2 Cone CEM Equation Code)

"F-14A":

Calculated Diluent for C02C = 02 Dry Calculated Adjusted Value

"F-14B":

Calculated Diluent for C02C = 02 Wet Calculated Adjusted Value

Calculated Moisture for C02C = H20 Default Value

else

Environmental Protection Agency

Page 297 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.

You did not report a default record for 02X in your monitoring plan that was active
during the current hour. Please note that the use of a diluent cap to calculate C02
concentration is only applicable to legacy data.

The DefaultValue reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 298 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-4

Check Name:

Related Former Checks:

Calculate C02 Concentration

Applicability:

Description:

Specifications:

CEM Check

If (Current DHV RecordModcCode in set {01, 02, 03, 04, 53, 54})

C02 Cone Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerance" where
Parameter = "C02C" AND
UOM = "PCT"

case (CO 2 Cone CEM Equation Code)

"F-14A":

If (Current DHV Record Valid == true AND Calculated Diluent for C02C is not null AND Valid FC
Factor Exists == true AND Valid FD Factor == true)

C02C DHV Calculated Adjusted Value = 100 * (Current Hourly Op Record. FcFactor /Current
Hourly Op Record.FdF actor) * [(20.9 - Calculated Diluent for C02C) / 20.9 ], and round the result
to 1 decimal place.

If (C02C DHV Calculated Adjusted Value < 0)

C02C DHV Calculated Adjusted Value = 0

If (Derived Hourly Adjusted Value Status == true AND ABS(C02C DHV Calculated Adjusted
Value - Current DHV Record. AdjustedHourly Value) > C02 Cone Tolerance)
return result A

else

return result B

If (Current DHV Record Valid == true AND Calculated Diluent for C02C is not null AND Valid FC
Factor Exists == true AND Valid FD Factor Exists == true AND Calculated Moisture for C02C is not

null)

C02C DHV Calculated Adjusted Value = [100/20.9] * (Current Hourly Op Record. FcFactor
/Current Hourly Op Record. FdF actor) * [20.9 * ((100 - Calculated Moisture for C02C)/100) -
Calculated Diluent for C02C ], and round the result to 1 decimal place.

If (C02C DHV Calculated Adjusted Value < 0)

C02C DHV Calculated Adjusted Value = 0

If (Derived Hourly Adjusted Value Status == true AND ABS(C02C DHV Calculated Adjusted
Value - Current DHV Record. AdjustedHourly Value) > C02 Cone Tolerance)
return result A

else

return result B

'F-14B":

Environmental Protection Agency

Page 299 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Otherwise

return result B

else

C02C DHV Calculated Adjusted Value = Current DHV Calculated Adjusted Value

Results:

Result	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent	Critical Error Level 1

with the recalculated value.

B	The AdjustedHourly Value in the DHV record for [param] could not be recalculated Informational Message

due to errors listed above.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 300 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-6

Check Name:	Determine Diluent Cap and Moisture for Heat Input Calculation Verification

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

If (Heat Input Method Code== "CEM")

if (Heat Input Equation Code in set {F-16, F-17, F-18}

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for HI = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for HI = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20DHV
Calculated Adjusted Value is not null)

Calculated Moisture for HI = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default
Value is not null)

Calculated Moisture for HI = H20 Default Value

if (Heat Input Equation Code = "F-15" OR Heat Input Equation Code = "F -16"

If (Current DHV Record. DiluentCapIndicator == 1)

C02N Count = # of active MonitoringDefault records for the location where
ParameterCode = 'C02N' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if (CO2N Count > 1)

return result A
else if (C02NCount == 0)

return result B
else if MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent For HI = MonitoringDefault.DefaultValue

else if (CO2 Cone Checks Neededfor Heat Input == true)

if (Current C02 Cone Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = C02C SD Calculated Adjusted Value

else

Calculated Diluent for HI = C02C MHV Calculated Adjusted Value

else if (Heat Input Equation Code == "F-17" OR Heat Input Equation Code == "F-18" )
if (Current Z)//f/7?ecw 1)

return result D
else if (02XCount == 0)
return result E

Environmental Protection Agency

Page 301 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if MonitoringDefault.DefaultValue <= 0
return result F

else

Calculated Diluent For HI = MonitoringDefault.DefaultValue

else if (Heat Input Equation Code= "F-17" AND 02 Wet Checks Neededfor Heat Input == true)

if (Current 02 Wet Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = 02C SD Calculated Adjusted Value

else

Calculated Diluent for HI = 02 Wet Calculated Adjusted Value
else if (Heat Input Equation Code == "F-18" AND 02 Dry Checks Needed for Heat Input == true)

Results:

Result
A

B

C
D
E

if (Current 02 Dry Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = 02C SD Calculated Adjusted Value

else

Calculated Diluent for HI = 02 Dry Calculated Adjusted Value

Response

You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.

You did not report an active C02N diluent cap default record in your monitoring
plan for the hour. The use of the diluent cap to calculate HI is only applicable for
legacy data.

The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.

You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.

You did not report a default record for 02X in your monitoring plan that was active
during the current hour. Please note that the use of a diluent cap to calculate HI is
only applicable to legacy data.

The DefaultValue reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 302 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-7

Check Name:

Calculate Heat Input

Related Former Checks:
Applicability:

General Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op 7?ecw= 0)

Unit HeatlnputTimesOpTime Accumulator = Unit HeatlnputTimesOpTime Accumulator + Heat Input Total
Reported Value

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Reported Accumulator Array for this location = -1
if (CurrentEntity Type == "Unit")

Unit HeatlnputTimesOpTime Accumulator = -1

Total Heat Input from Fuel Flow = null

If (Heat Input Method Code== "CEM")

case (Heat Input Equation Code)

= "F-15":

If (Current DHV Record Valid == true AND Calculated Diluentfor HI is not null AND Valid FC Factor
Exists == true AND FLOW Calculated Adjusted Value is not null)

HI Calculated Adjusted Value = (FLOW Calculated Adjusted Value * Calculated Diluent for
Heat Input) / (Current Hourly Op Record. FcFactor * 100.0), and round the result to 1 decimal place.

else

return result A

= "F-16":

If (Current DHV Record Valid == true AND Calculated Diluentfor HI is not null AND Valid FC Factor
Exists == true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not

null)

HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (100 - Calculated Moisture

Environmental Protection Agency

Page 303 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

for HI) * Calculated Diluent for HI ] / (10,000 * Current Hourly Op Record. FcFactor), and round
the result to 1 decimal place.

else

return result A

= "F-17":

If {Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FD Factor
Exists == true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not

null)

HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (1 / Current Hourly Op
Record.¥d¥ actor)* [ 0.209 * (100 - Calculated Moisture for HI) - Calculated Diluent for HI] / 20.9)
], and round the result to 1 decimal place.

else

return result A

= "F-18":

If {Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FD Factor
Exists == true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not

null)

HI Calculated Adjusted Value = {FLOW Calculated Adjusted Value *[100 - Calculated Moisture
forHI\ * [20.9 - Calculated Diluent for HI]) / (2090 * Current Hourly Op Record. FdFactor), and
round the result to 1 decimal place.

else

return result A

= All Other Equation Codes:
return result A

if no result

if {HI Calculated Adjusted Value is less than 1 AND Legacy Data Evaluation == false)

HI Calculated Adjusted Value = 1

Apportionment Calc HI Array at this Location = HI Calculated Adjusted Value
if {MP Stack Config for Hourly Checks == "MS")

Config Heatlnput Accumulator = Config Heatlnput Accumulator + HI Calculated Adjusted Value

if result A

Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1

if {Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator Array for this location = -1
if {MP Stack Config for Hourly Checks == "MS")

Config Heatlnput Accumulator = -1

else if {Heat Input App D Method Active for Hour == true)

if {HIApp D Accumulator >= 0)

Total Heat Input from Fuel Flow = HI App D Accumulator

Environmental Protection Agency

Page 304 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (HIApp D Accumulator >= 0 AND Current Hourly Op Record.OperatingTime is greater than 0 and less than or equal to

1)

Apportionment Calc HI Array at this Location = HIApp D Accumulator / Current Hourly Op
Record. OperatingT ime, rounded to one decimal place.

if (Heat Input Method Code == "AD")

HI Calculated Adjusted Value = Apportionment Calc HI Array at this Location
App E Calc HI = HI Calculated Adjusted Value

else

for each location in the configuration where Apportionment HI Method Array in set {CALC, ADCALC}
set Apportionment HI Method Array for this location to "NOCALC"

else

Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator Array for this location = -1
return result A

else if (Heat Input Method Code NOT in set {ADCALC, CALC})

HI Calculated Adjusted Value = Current DHV Calculated Adjusted Value
Apportionment Calc HI Array at this Location = HI Calculated Adjusted Value

If (HI Calculated Adjusted Value is not null)

If (Current Hourly Op /?£?tw= 0)

Config HeatlnputTimesOpTime Accumulator = Config HeatlnputTimesOpTime Accumulator + Heat
Input Total Calculated Value

if (Current Month is not April OR Annual Reporting Requirement == true)

if (Rpt Period HI Calculated Accumulator Array for this location is not null)

if (Rpt Period HI Calculated Accumulator Array fox this location >= 0)

Rpt Period HI Calculated Accumulator Array for this location = Rpt Period HI Calculated
Accumulator Array for this location + Heat Input Total Calculated Value

else

Rpt Period HI Calculated Accumulator Array for this location = Heat Input Total Calculated
Value

if (Current Month is April)

if (April HI Calculated Accumulator Array for this location is not null)

April HI Calculated Accumulator Array for this location = April HI Calculated
Accumulator Array for this location + Heat Input Total Calculated Value

else

April HI Calculated Accumulator Array for this location = Heat Input Total Calculated
Value

else

Environmental Protection Agency

Page 305 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Config HeatlnputTimesOpTime Accumulator = -1

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator Array for this location = -1

If (Derived Hourly Adjusted Value Status == true)

If (Heat Input Method Code in set {CEM, AD})

if (HI Calculated Adjusted Value is equal to 1 AND Current DHV 7?ecw Heat Input
Tolerance)

return result B

else if (Apportionment Calc HI Array at this Location is greater than or equal to 0) \\ ADCALC

If (Current Hourly Op 7?ecw= 0)

Config HeatlnputTimesOpTime Accumulator = Config HeatlnputTimesOpTime Accumulator + Heat
Input Total Calculated Value

else

Config HeatlnputTimesOpTime Accumulator = -1

else if (Heat Input Method Codenot in set {ADCALC, CALC})

Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator Array for this location = -1

Environmental Protection Agency

Page 306 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

Usage:

Response

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You reported in AdjustedHourly Value of less than 1 in the DHV record for [param].
You must report a minimum heat input of 1 and a MODCCode of "26".

Severity

Informational Message
Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 307 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-9

Check Name:	Calculate S02 Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op 7?ecw= 0)

Rpt Period S02 Mass Reported Accumulator Array for this location = Rpt Period S02 Mass Reported
Accumulator Array for this location + S02 Total Reported Value

else

Rpt Period S02 Mass Reported Accumulator Array for this location = S02 Total Reported Value

else

Rpt Period S02 Mass Reported Accumulator Array for this location = -1

If (SO2 CEM Method Active for Hour == true)

if (S02 Equation Code == "F-l")

If (Current DHV Record Valid == true AND S02C Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null)

SO2 Calculated Adjusted Value = 0.000000166 * S02C Calculated Adjusted Value * FLOW Calculated
Adjusted Value, ROUNDED to one decimal place.

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A

else if (S02 Equation Code == "F-2")

If (Current DHV Record Valid == true AND S02C Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null AND Calculated Moisture for S02 is not null)

SO2 Calculated Adjusted Value = 0.000000166 * S02C Calculated Adjusted Value * FLOW Calculated
Adjusted Value * (100.0 - Calculated Moisture for S02) /100.0, ROUNDED to one decimal place.

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A

else if (S02 F23 Method Active for Hour == true)

If (Current DHV Record Valid == true AND F23 Default Value is not null AND HI Calculated Adjusted Value is

Environmental Protection Agency

Page 308 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

not null)

S02 Calculated Adjusted Value = F23 Default Value * HI Calculated Adjusted Value, rounded to one
decimal place.

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A

else if (SO2 App D Method Active for Hour == true)

if (SO2 App D Accumulator >= 0 AND Current Hourly Op /?= 0)

Rpt Period S02 Mass Calculated Accumulator Array fox this location = Rpt Period S02 Mass
Calculated Accumulator Array for this location + S02 Total Calculated Value

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = S02 Total Calculated Value

else

Rpt Period S02 Mass Calculated Accumulator Array fox this location = -1

If (Derived Hourly Adjusted Value Status == true)

S02 Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02" AND
UOM = "LBHR"

if (A B S (Current DHV 7?ecw S02 Tolerance)
return result B

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1

Environmental Protection Agency

Page 309 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated Informational Message

due to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent	Critical Error Level 1

with the recalculated value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 310 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-12

Check Name:	Determine Diluent Cap, Moisture, and NOXC for NOx Rate Calculation Verification

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If {Current NOx Rate Method Code == "CEM" AND Current DHVRecord.ModcCode in set {01, 02, 03, 04, 14, 22, 53, 54})

if (NOx Cone Monitor Hourly Count == 1 AND Current NOx Cone Monitor Hourly 7?ecw 1

return result A
else if 02 Monitor Default Matches = 0
return result B

else

02 Monitor Default Record = the single matched record

if (02 Monitor Default Record. DefaultValue is NULL OR 02 Monitor Default Record. DefaultValue

<=0)

return result C

else

Calculated Diluent for NOXR = 02 Monitor Default Record DefaultValue
else if (NOxRate Equation Codein set {F-6, 19-6, 19-7, 19-8, 19-9})

C02 Monitor Default Matches = count of # active MonitoringDefaultData records for location where

Environmental Protection Agency

Page 311 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

MonitoringDefaultData.ParameterCode = "C02N" AND

MonitoringDefaultData.DefaultPurposeCode = "DC" AND MonitoringDefaultData.FuelCode =
"NFS"

if C02 Monitor Default Matches > 1

return result D
else if C02 Monitor Default Matches = 0
return result E

else

C02 Monitor Default Record = the single matched record

if (C02 Monitor Default Record. DefaultValue is NULL OR C02 Monitor Default
itecord.DefaultValue <= 0)
return result F

else

If (NOxRate Equation Code in set ! F-5. 19-1, 19-4} AND 02 Dry Checks Needed for NOx Rate Calc== true)
Calculated Diluent for NOx Rate = 02 Dry Calculated Adjusted Value

else if (NOx Rate Equation Code in set {19-2, 19-3, 19-5} AND 02 Wet Checks Needed for NOx Rate Calc ==

true)

Calculated Diluent for NOx Rate = 02 Wet Calculated Adjusted Value

else if (NOxRate Equation Code in set {F-6, 19-6, 19-7, 19-8, 19-9} AND CO 2 Cone Monitor Hourly Checks
Needed == true)

Calculated Diluent for NOx Rate = C02C MHV Calculated Adjusted Value

Calculated Diluent for NOx Rate = C02 Monitor Default Record .DefaultValue

else

Results:

Result
A

Response

You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.

You did not report a default record for 02X in your monitoring plan that was active
during current hour.

The DefaultValue reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.

You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.

You did not report an active C02N diluent cap default record in your monitoring
plan for the hour.

The DefaultValue reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

D

Critical Error Level 1

E

Critical Error Level 1

F

Critical Error Level 1

Environmental Protection Agency

Page 312 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 313 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-13

Check Name:

Calculate Unadjusted NOx Emissions Rate

Related Former Checks:
Applicability:

CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

NOXR Calculated Unadjusted Value = null
Derived Hourly Unadjusted Calculation Status = false

If {Current NOx Rate Method Code == "CEM" AND Current DHVRecord.ModcCode in set {01, 02, 03, 14, 22, 53})

If (Current DHV Record Sy stcmTypcCodc == "NOX")

RATA Status Required = true

case (NOx Rate Equation Code)

"19-1" or "F-5":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true)

if (Calculated Diluent for NOXR == 20.9)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record. FdF actor * [20.9 / (20.9 - Calculated Diluent for NOXR)], rounded to 3 decimal
places.

else

return result B

"19-2":

Moisture Fraction = null

BWA Default Record Count = count active MonitoringDefaultData Records for the location where ParameterCd =

'BWA'

If (BWA Default Record Count == 0)

Moisture Fraction = 0.027
else If (BWA Default Record Count == 1 AND MonitorDefaultData.DefaultValue > 0 AND
MonitorDefaultData.DefaultValue < 1)

Moisture Fraction = MonitorDefaultData.DefaultValue

else

return result D

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FWFactor Exists == true AND Moisture Fraction is not null)

if (Calculated Diluent for NOXR == 20.9 * (1 - Moisture Fraction))
return result A

else

Environmental Protection Agency

Page 314 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record. FwFactor * [20.9 / (20.9 *(1 - Moisture Fraction) - Calculated Diluent for
NOXR)], rounded to 3 decimal places.

else

return result B

"19-3":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true AND Calculated Moisture for NOXR is not null)

if (Calculated Diluent for NOXR == 20.9*(100 - Calculated Moisture for NOXR ) / 100)

return result A

else

denom = (20.9*(100 - Calculated Moisture for NOXR )/l 00 - Calculated Diluent for NOXR )
NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FdFactor * [20.9 /denom ], rounded to 3 decimal places.

else

return result B

"19-3D":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true AND Calculated Moisture for NOXR is not null)

h2oFactor = (100 - Calculated Moisture for NOXR ) / 100.0
denomTerm = (20.9 * h2oFactor) - (Calculated Diluent for NOXR * h2oFactor)
if ( denomTerm == 0)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FdFactor * 20.9 / denomTerm, rounded to 3 decimal places.

else

return result B

"19-4":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true AND Calculated Moisture for NOXR is not null)

if ( Calculated Diluent for NOXR == 20.9 OR Calculated Moisture for NOXR == 100)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FdF actor / [ (100 - Calculated Moisture for NOXR ) / 100.0] * (20.9 / (20.9 -
Calculated Diluent for NOXR)), rounded to 3 decimal places.

else

return result B

"19-5":

Environmental Protection Agency

Page 315 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true AND Calculated Moisture for NOXR is not null)

if (Calculated Moisture for NOXR == 100)

return result A

else

H20Term = (100 - Calculated Moisture for NOXR )/ 100.0
denom = 20.9 - Calculated Diluent for NOXR / H20Term

if (denom == 0)

return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc ¦

Current Hourly Op Record.FdFactor / denom, rounded to 3 decimal places.

else

return result B

"19-5D":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true)

if (Calculated Diluent for NOXR == 20.9)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record. FdF actor * 20.9/ (20.9 - Calculated Diluent for NOXR), rounded to 3 decimal
places.

else

return result B

"19-6" or "19-7" or "F-6":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FC Factor Exists == true)

if (Calculated Diluent for NOXR == 0.0)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record. FcF actor * 100.0 / Calculated Diluent for NOXR , rounded to 3 decimal places.

else

return result B

"19-8":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FC Factor Exists == true AND Calculated Moisture for NOXR is not null)

if (Calculated Diluent for NOXR ==0.0 OR Calculated Moisture for NOXR == 100)

Environmental Protection Agency

Page 316 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record. FcF actor / [ (100 - Calculated Moisture for NOXR ) / 100.0] * (100.0 /
Calculated Diluent for NOXR), rounded to 3 decimal places.

else

return result B

"19-9":

If (Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FC Factor Exists == true AND Calculated Moisture for NOXR is not null)

if (Calculated Diluent for NOXR == 0.0)
return result A

else

H20Term = (100 - Calculated Moisture for NOXR )/ 100.0
C02Term = 100.0 / Calculated Diluent for NOXR

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FcFactor * H20Term * C02Term, rounded to 3 decimal places.

else

return result B

If (Derived Hourly Unadjusted Value Status == true AND NOXR Calculated Unadjusted Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

if ( ABS(Current DHV7?ecw Tolerance)
return result C

else

Derived Hourly Unadjusted Calculation Status = true

else if (Current NOx Rate Method Code == "PEM" AND Current DHV Record. ModcCode in set {01, 02, 03})

If (Current DHV Record Sy stcmTypcCodc == "NOXP")

RATA Status Required = true

If Current DH V Record U n ad j listed Hourly V al lie >= 0

NOXR Calculated Unadjusted Value = Current DHV Record. UnadjustedHourly Value
Derived Hourly Unadjusted Calculation Status = true

else if (Current NOx Rate Method Code == "AE")

If (App E Constant Fuel Mix == true)

NOXR Calculated Adjusted Value = App E Calculated NOx Rate for Source

else

NOXR Calculated Adjusted Value= Current DHV Calculated Adjusted Value

if (Current NOx Rate Method Code in set {CEM, PEM} AND Current DHVRecord.ModcCode == 21)

Environmental Protection Agency

Page 317 of 703


-------
Draft ECMPS Emissions Check Specifications

If (Current DHVRecord SystcmTypcCodc in set {NOX, NOXP})
RATA Status Required = true

3/7/2012 12:00:00AM

Results:

Result
A

B
C
D

Response

The NOx emission rate could not be recalculated, because the diluent and/or
moisture value would result in division by zero. You should report an MODC of 14
indicating the use of a diluent cap to prevent this.

The UnadjustedHourly Value in the DHV record for [param] could not be
recalculated due to errors listed above.

The UnadjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You did not report a single valid MonitorDefault record for ParameterCode BWA
for the hour.

Severity

Critical Error Level 1

Informational Message
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 318 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-15

Check Name:

Related Former Checks:

Determine Moisture for NOx Mass Calculation Verification

Applicability:

Description:

Specifications:

CEM Check

If (NOx Mass Monitor Method Code begins with " CEM")
If (NOx Mass Equation Code == "F-26B")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for NOX = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for NOX = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20DHV
Calculated Adjusted Value is not null)

Calculated Moisture for NOX = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default
Value is not null)

Calculated Moisture for NOX = H20 Default Value

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 319 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-16

Check Name:	Calculate NOx Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op 7?ecw=0)

Rpt Period NOX Mass Reported Accumulator Array for this location = Rpt Period NOX Mass
Reported Accumulator Array for this location + NOX Mass Total Reported Value

else

Rpt Period NOX Mass Reported Accumulator Array for this location = NOX Mass Total Reported Value

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Reported Accumulator Array for this location = -1

If (NOx Mass Monitor Method Code in set {CEM, NOXR, CEMNOXR})

if (NOx Mass Equation Code== "F-26A")

If (Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null)

NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * Stack Flow
Calculated Adjusted Value, ROUNDED to one decimal place.

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A

else if (NOX Mass Equation Code== "F-26B")

If (Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null AND Calculated Moisture for NOX is not null)

NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * FLOW Calculated
Adjusted Value * (100.0 - Calculated Moisture for NOX) /100.0, ROUNDED to one decimal place.

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A

Environmental Protection Agency

Page 320 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

else if (NOX Mass Equation Code== "F-24A")

if (Heat Input Method Code NOT in set {CALC, ADCALC})

If (Current DHV Record Valid == true AND NOXR Calculated Adjusted Value is not null

If (HI Calculated Adjusted Value is not null)

NOX Calculated Adjusted Value = NOXR Calculated Adjusted Value * HI Calculated
Adjusted Value, ROUNDED to one decimal place.

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array fox this location = -1
return result A

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array fox this location = -1
return result A

else

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A

else

NOX Calculated Adjusted Value= Current DHV Calculated Adjusted Value

If (NOX Calculated Adjusted Value is not null)

If (Current Hourly Op /?£?tw= 0)

Rpt Period NOX Mass Calculated Accumulator Array for this location = Rpt Period NOX
Mass Calculated Accumulator Array for this location + NOXMass Total Calculated Value

else

Rpt Period NOX Mass Calculated Accumulator Array for this location = NOXMass Total
Calculated Value

if (Current Month is April)

if (April NOX Mass Calculated Accumulator Array for this location is not null)

April NOX Mass Calculated Accumulator Array for this location = April NOX Mass
Calculated Accumulator Array for this location + NOXMass Total Calculated Value

else

April NOX Mass Calculated Accumulator Array for this location = NOXMass Total
Calculated Value

else

Environmental Protection Agency

Page 321 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1

If (Derived Hourly Adjusted Value Status == true AND Current DHVMethod in set {CEM, NOXR, CEMNOXR})

NOX Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOX" AND
UOM = "LBHR"

if (ABS(Current DHV	AdjustedHourly Value - NOX Calculated Adjusted Value) > NOX Tolerance)

If (Legacy Data Evaluation == false)
return result B

else if (NOX Mass Equation Code <> "F-24A" OR Current DHV Record Valid == false OR NOXR Calculated Adjusted Value is
null OR Heat Input Method CWeNOT in set {CALC, ADCALC})

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1

else if (Current Hourly Op Data. OpTime is greater than 0 and less than or equal to 1)

if (ABS(Current DHV 7?ecw NOX
Tolerance / Current Hourly Op Record OpcratingTimc )
return result B

Results:

Result
A

Response

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

Severity

Informational Message

B

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 322 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-18

Check Name:

Related Former Checks:

Determine Diluent Cap and Moisture for C02 Mass Calculation Verification

Applicability:

Description:

Specifications:

CEM Check

If (CO 2 Method Code == "CEM")

if (CO2 Mass Equation Code == "F-2")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for C02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for C02 = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20DHV
Calculated Adjusted Value is not null)

Calculated Moisture for C02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default
Value is not null)

Calculated Moisture for C02 = H20 Default Value

if (Use CO2 Diluent Cap for C02 Mass Calc == true)

C02N Count = # of active MonitoringDefault records for location where
ParameterCode = 'C02N' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if (C02N Count > 1)

return result A
else if (C02N Count == 0)

return result B
else if MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent for C02 = MonitoringDefault.DefaultValue

else if (C02 Cone Derived Checks Needed == true)

Calculated Diluent for C02 = C02C DHV Calculated Adjusted Value

else if (C02 Cone Checks Needed for C02 Mass == true)

if (Current C02 Cone Missing Data Monitor Hourly Record is not null)

Calculated Diluent for C02 = C02C SD Calculated Adjusted Value

else

Calculated Diluent for C02 = C02C MHV Calculated Adjusted Value

Environmental Protection Agency

Page 323 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.

A DHV record indicates use of a diluent cap to calculate C02, but you did not
report an active C02N default record in your monitoring plan for the hour. Please
note that the use of the diluent cap to calculate C02 is only applicable to legacy
data.

The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 324 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-19

Check Name:	Calculate C02 Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op 7?ecw= 0)

Rpt Period C02 Mass Reported Accumulator Array for this location = Rpt Period C02 Mass Reported
Accumulator Array for this location + C02 Total Reported Value

else

Rpt Period C02 Mass Reported Accumulator Array for this location = C02 Total Reported Value

else

Rpt Period C02 Mass Reported Accumulator Array for this location = -1

If (CO2 Method Code == "CEM")

if (C()2 Mass Equation Code == "F-l 1")

If {Current DHV Record Valid == true AND Calculated Diluent for C02 is not null AND FLOW Calculated
Adjusted Value is not null)

CO 2 Calculated Adjusted Value = 0.00000057 * Calculated Diluent for C02 * FLOW Calculated
Adjusted Value, ROUNDED to one decimal place.

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A

else if (CO2 Mass Equation Code == "F-2")

If {Current DHV Record Valid == true AND Calculated Diluent for C02 is not null AND FLOW Calculated
Adjusted Value is not null AND Calculated Moisture for C02 is not null)

C02 Calculated Adjusted Value = 0.00000057 * Calculated Diluent for C02 * FLOW Calculated
Adjusted Value* [(100.0 - Calculated Moisture for C02) /100.0], ROUNDED to one decimal place.

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A

else if (CO 2 App D Method Active for Hour == true)

Environmental Protection Agency

Page 325 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

if (C02 App D Accumulator >= 0 AND Current Hourly Op Record.0peratingTime is between 0 and 1 (inclusive))

CO 2 Calculated Adjusted Value = C02 App D Accumulator / Current Hourly Op Record. OperatingT ime, rounded
to one decimal place.

else

if (Legacy Data Evaluation == false)

Rpt Period C02 Mass Calculated Accumulator Array fox this location = -1
return result A

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -2

else

CO2 Calculated Adjusted Value = Current DHV Calculated Adjusted Value

If (CO 2 Calculated Adjusted Value is not null)

If i Current Hourly Op 7?ecw= 0)

Rpt Period C02 Mass Calculated Accumulator Array fox this location = Rpt Period C02 Mass
Calculated Accumulator Array for this location + C02 Total Calculated Value

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = C02 Total Calculated Value

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1

If (Derived Hourly Adjusted Value Status == true)

C02 Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02" AND
UOM = "TNHR"

if (A B S (Current DHV 7?ecw C02 Tolerance)
return result B

else

if (Rpt Period C02 Mass Calculated Accumulator Array for this location <> -2)

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1

Environmental Protection Agency

Page 326 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated Informational Message

due to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent	Critical Error Level 1

with the recalculated value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 327 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-25

Check Name:

Determine BAF Value for NOx Emission Rate System

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current NOX System BAF = null

If (Current NOx System Status == true AND NOXR Calculated Unadjusted Value is not null AND Current NOx Rate Method
Code in set {CEM, PEM}) AND CurrentDHVRecord.ModcCode in set {01, 02, 03, 14, 22, 53})

If (RATA Status BAF is not null)

Current NOX System BAF = RATA Status BAF

else

return result A

Results:

Result
A

Response

The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined,
because the prior RATA had critical errors or because of a RATA Status error
listed on this report.

Severity

Informational Message

Usage:

Process/Category: Emissions Data Evaluation Report	NOX RAT A Status Evaluation

Environmental Protection Agency

Page 328 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-30

Check Name:

Initialize S02 Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "S02"

Current DHV Record Valid = S02 Derived Hourly Status
S02 Calculated Adjusted Value = null
Calculated Moisture for S02 = null

Current DHV Record = Current S02 Derived Hourly Record

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 329 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-31

Check Name:

Initialize NOX Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "NOX"

Current DHV Record Valid = NOX Derived Hourly Status
NOX Calculated Adjusted Value = null
Calculated Moisture for NOX = null

Current DHV Record = Current NOx Rate Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 330 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-32

Check Name:

Initialize NOXR Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "NOXR"

Current DHV Record Valid = NOXR Derived Hourly Status

NOXR Calculated Adjusted Value = null

Calculated Diluent for NOXR = null

Calculated Moisture for NOXR = null

Current DHV HBHA Value = Current NOXR HBHA Value

Current DHV Record = Current NOx Rate Derived Hourly Record

Current Appendix E Status = null

RATA Status Required = false

RATA Status BAF = null

Current Hourly Record for RA TA Status = Current NOx Rate Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 331 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-33

Check Name:

Initialize C02 Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "C02"

Current DHV Record Valid = C02 Derived Hourly Status
C02 Calculated Adjusted Value = null
Calculated Diluent for C02 = null
Calculated Moisture for C02 = null

Current DHV Record = Current C02 Mass Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 332 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-34

Check Name:

Initialize C02C Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "C02C"

Current DHV Record Valid = C02C Derived Hourly Status
C02C DHV Calculated Adjusted Value = null
Calculated Diluent for C02C = null
Calculated Moisture for C02C = null

Current DHV HBHA Value = Current C02C DHV HBHA Value
Current DHV Record = Current C02 Cone Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 333 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-35

Check Name:

Initialize H20 Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "H20"

Current DHV Record Valid = H20 Derived Hourly Status
H20 DHV Calculated Adjusted Value = null
Current DHV HBHA Value = Current H20 DHV HBHA Value
Current DHV Record = Current H20 Derived Hourly Record

if {Current DHV Record. MODCCode in set {01, 02, 03, 21, 53} AND Current DHV Record SystcmTypcCodc == "H20")
RATA Status Required = true

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	H20 Calculation Verification

Environmental Protection Agency

Page 334 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-36

Check Name:

Initialize HI Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "HI"

Current DHV Record Valid = HI Derived Hourly Status
HI Calculated Adjusted Value = null
Calculated Diluent for HI = null
Calculated Moisture for HI = null

Current DHV Record = Current Heat Input Derived Hourly Record
RATA Status Required = false

Current Hourly Record for RA TA Status = Current Heat Input Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 335 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-37

Check Name:

Check Unadjusted Value

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Derived Hourly Unadjusted Value Status = false
If (Current NOx Rate Method Code in set {CEM, PEM})

If (Current DHVRecord.ModcCode in set {01, 02, 03, 04, 14, 21, 22, 53, 54})

If (Current /)//17Unadj ustcdHourly Value is not null)

If (Current l)H V Record. Unadj listed Hourly V aluc < 0.0 AND

Current DHVRecord.ModcCode o "21" )
return result A

Else if (Current 1)H V Record. Unadj listed Hourly V al lie > 0 AND

Current DHV Record. ModcCode == 21)
return result B

Else if (Current I)H V Record. Unadj listed Hourly V al lie is not rounded to three decimal places)
return result F

Derived Hourly Unadjusted Value Status = true

if (Current DHV Max Min Value is not null AND (NOx Cone MODC is null OR is NOT in set {19,

20}))

if (Current DHV Record\JnaA)usiQdHovx\yValue > Current DHV Max Min Value)
return result C

Else If (Current DHV Record. ModcCode not in set {04, 53, 54})
return result A

Else

Derived Hourly Unadjusted Value Status = true

Else if (Derived Hourly Mode Status == true)

If [Current /)//17Unadj ustcdHourly Value is not null)
return result D

Else

Derived Hourly Unadjusted Value Status = true
Else If (Current DHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F

Usage:

1

Response

The UnadjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

You reported an MODCCode of 21 in the DHV record for [param], but the
UnadjustedHourly Value is greater than 0.

Warning: The UnadjustedHourly Value reported in the DHV record for [param] is in

excess of the maximum value listed in the monitoring plan. Sources are required to

periodically (at least once annually) evaluate the appropriateness of these maximum

values in the monitoring plan and make proper adjustments when necessary.

Adjustments may include the need to update Span and/or Default values. You

should investigate the cause of these exceedances and determine whether

adjustments to your monitoring systems or monitoring plan are necessary.

You reported an MODCCode of [modcCode] in the DHV record for [param], so you

should not have reported a value for the UnadjustedHourly Value.

You reported an UnadjustedHourly Value in the DHV record for [param], A value in

this field should not be reported for the [param] [method] method.

You reported [fieldname] in the [type] record for [param] that is not rounded to the

appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 337 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-38

Check Name:

Determine Maximum or Minimum Value for Parameter in DHV Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current DHV Max Min Value = null

If (Current DHV Record Valid == true AND

({Current DHV Parameter == "H20" AND H20 Method Code == "MWD") OR

(Current DHV Parameter == "NOXR" AND Current NOx Rate Method Code in set {CEM,PEM}) OR

Current DHV Parameter == "C02C" OR

Current DHV Parameter =="HI")

If (Current DHV Parameter == "H20")

If (H20 Fuel Specific Missing Data == true)

Current DHV Fuel Specific Hour = true

If (H20 Missing Data Approach == "MAX")

Current DHV Default Parameter = "H20X"

Else If (H20 Missing Data Approach == "MIN")

Current DHV Default Parameter = "H20N"

Else If (Current DHV Record.ModcCode == 12)
return result A

else if (Current DHV Parameter == "NOXR")

Current DHV Default Parameter = "NORX"

If (Current DHV Record. ModcCode in set {23, 24})

If (NOx Rate Bypass Code == "BYMAXFS")

else if (NOx Rate Fuel Specific Missing Data == true)

Current DHV Fuel Specific Hour = true

else

Current DHV Fuel Specific Hour = false

else if (Current DHV Parameter == "C02C")

Current DHV Default Parameter = "C02X"

If (CO2 Fuel Specific Missing Data == true)

Current DHV Fuel Specific Hour = true

If (Current DHV Parameter == "HI")

Locate all active UnitCapacity records linked to the location where MaxHourlyHeatlnputCapacity > 0.

If any are found,

Set Current DHV Max Min Value to the sum of MaxHourlyHeatlnputCapacity in all records found.

Current DHV Fuel Specific Hour = true

else

Current DHV Fuel Specific Hour = false

Environmental Protection Agency

Page 338 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Current DHV Default Parameter is not null)

If (Current DHV Record. ModcCode in set {12, 23, 25} AND Current DHV Fuel Specific Hour = true)

If i Current Hourly Op Record .V uc\QoAc is not null)

Current DHV Missing Data Fuel = Current Hourly Op Record F uclC'odc

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = Current Hourly Op Record .¥ vic\Qo&c
DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set {A,U} // Not Controlled

if (count > 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ > 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D

else if (Current DHV Record.ModcCode in set {13, 24}

If (Current DHV Fuel Specific Hour == true)

If Current Hourly Op Record .¥ vic\Qo&c is not null

Current DHV Missing Data Fuel = Current Hourly Op Record F uclC'odc

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = Current Hourly Op Record.FuelCode
DefaultPurposeCode = "MD" // Missing Data
OperatingCode in == "C" // Controlled

if (count > 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record

if (DefaultRecord.DefaultValue > 0)

Current DHV Max Min Value = Default ifecorJ.DefaultValue

else

return result D

Environmental Protection Agency

Page 339 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Current DHVMissing Data Fuel = "NFS"

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = "NFS"

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in == "C" // Controlled

if (count > 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ > 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D

else if (Current DHV Record.Mo&cQo&c o " 15"

Current DHV Missing Data Fuel = "NFS"

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = "NFS"

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set {A,U} // Not Controlled

if (count > 1)

return result B

else if (count == 0 AND Current DHV Parameter == "C02C")

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "C02" AND
MonitoringSpanData. SpanScaleCode = "H"

if (Monitor Span Record Count > 1)

return result E
else if (Monitor Span Record Count = 0)
return result F

else

Current Monitor Span Record = the single matched record

If (Current Monitor Span Record.DefaultHighRange is null AND Current DHV
Record.ModcCode not in set {13, 24})

if (Current Monitor Span Record.MPCValue > 0)

Current DHV Max Min Value = Current Monitor Span Record.MPCVahxs

Environmental Protection Agency

Page 340 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result G

else if (count == 0 AND Current DHV Parameter == "NOXR")

Count active MonitoringDefaultData record for location where
ParameterCode = "MNNX"

FuelCode = "NFS"

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set {A,U} // Not Controlled

if (count >1)

Current DHV Default Parameter = "MNNX"
return result B

else if (count = 0)

return result C

else

Current DHV Default Parameter = "MNNX"

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ >= 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D

else if (count == 0)

return result C

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ > 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D

Environmental Protection Agency

Page 341 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C
D
E
F
G

Usage:

Response

The missing data default parameter for H20 could not be determined, because you
used both Standard and Inverse Part 75 missing data approaches during the hour.
You reported more than one applicable [param] Default record with a FuelCode of
[FuelCode] in your monitoring plan for the hour.

You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].

The values reported in the applicable [param] Default record with a FuelCode of
[FuelCode] are invalid.

You reported more than one active span record for [key] in your monitoring plan
for the hour.

You did not report a missing data maximum default for C02 in a span or default
record in your monitoring plan.

The values reported in the applicable span record for [key] are invalid.

Severity

Critical Error Level 2
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

1

Process/Category:

Emissions Data Evaluation Report —

— C02

2

Process/Category:

Emissions Data Evaluation Report —

— H20

3

Process/Category:

Emissions Data Evaluation Report —

— Heat

4

Process/Category:

Emissions Data Evaluation Report —

— NOx

Environmental Protection Agency

Page 342 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-39

Check Name:	Check Adjusted Hourly Value in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Validation Tables:

Parameter UOM (Complex Lookup Table)

Specifications:

Derived Hourly Adjusted Value Status = false
Current DHV Calculated Adjusted Value = null

if (Current DHV Record Valid == true)

Locate Parameter Units of Measure lookup table record where ParameterCode = Current DHV Parameter.

If (Hourly Fuel Flow Count For Gas is greater than 0 AND Current DHV Parameter == "S02")

Set Current DHV Precision to 4.

else

Set Current DHV Precision to the Parameter Units of Measwfe.Decimals_Hrly.

if (Current DHV Record.ModcCodc is not null)

case (Current DHV Record. ModcC ode)

= 21: Current DHV Calculated Adjusted Value = 0

if (Current DHV Record. AdjustedHourlyVahie == 0)

Derived Hourly Adjusted Value Status = true

else

return result A

= 12 OR 23 OR 25:

If (Current DHV Max Min Value is not null)

Current DHV Calculated Adjusted Value = Current DHV Max Min Value
if (Current DHV Record Adj ustcdHourly Value == Current DHV Max Min Value)

Derived Hourly Adjusted Value Status = true

else

return result B

= 13 OR 24:

If (Current DHV Max Min Value is not null)

Current DHV Calculated Adjusted Value = Current DHV Max Min Value
if (Current DHV Record Adj ustcdHourly Value == Current DHV Max Min Value)

Derived Hourly Adjusted Value Status = true

else

return result C

= 06:

If (Current DHV Parameter in set {C02C, H20} AND (Current DH V Record Adj ustcdHourly V al lie is null

Environmental Protection Agency

Page 343 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

or Current DHVRecord.k&)uslQdi\ow\yVa[viQ < 0 or Current /)//K/?et'w 100))
return result L

else if (Current DHV HBHA Value is not null)

Current DHV Calculated Adjusted Value = Current DHV HBHA Value

If (Current 1)HVRecord AdjustcdHourly Vallie >= 0)

if ( Current DH V Record Ad j ustcdHourly Val lie == Current DHV Calculated Adjusted
Value)

Derived Hourly Adjusted Value Status = true

else

return result D

else

return result E

else

If (Current	Adj ustcdHourly Value >= 0)

If (Current DHV 7?ecw Current DHV Max
Min Value)

If (Current DHV Parameter == "NOXR" and Current DHV
Record. Adj ustedHourlyValue > Current DHV Max Min
Value * 2)

return result 0
Otherwise,

return result G

Else

return result E

= 08 OR 09:

If (Current DHV Parameter in set {C02C, H20} AND (Current DHV Record Adj ustcdHourly Value is null
or Current Z)//f/7?ecw 100))

return result L

else if (Current DHV Record A djustedHourly Value >= 0)

Environmental Protection Agency

Page 344 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current DHVHBHA Value is not null AND Current DHVParameter == "H20" AND H20
Missing Data Approach == "MIN" AND Current DHV HBHA Value < Current DHV
Record. Adj ustedHourly Value)

Current DHV Calculated Adjusted Value = Current DHV HBHA Value

return result N

else if (Current DHV HBHA Value is not null AND (Current DHV Parameter <> "H20" OR H20
Missing Data Approach == "MAX") AND Current DHV HBHA Value > Current DHV
7?ecw

"NOXR"))

Current DHV Calculated Adjusted Value = Current DHV HBHA Value

return result F

elseif (Current DHV 7?ecw Current DHV Max Min
Value)

If (Current DHV Parameter == "NOXR" and Current DHV
Record. Adj ustedHourlyValue > Current DHV Max Min Value * 2)

return result 0
Otherwise,

return result G

Else

return result E

= 04, 05, 07, 10, 11, 15, 53, 54, OR 55:

If (Current DHV Parameter in set {C02C, H20} AND (Current DHV Record Adj ustedHourly Value is null
or Current Z)//f/7?ecw 100))

return result L

else if (Current DHV7?ecw= 0)

If (Current DHV 7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

if (Current DHVParameter in set {C02C, H20, NOXR} AND Current DHVMax Min
Value is not null)

If (Current DHV Parameter == "H20" AND H2() Missing Data Approach ==

"MIN")

if (Current DHV 7?ecw Current DHV Max Min
Value)

If (Current DHV Parameter == "NOXR" and Current DHV

Adj ustedHourly Value > Current DHV Max Min Value * 2)
return result 0
Otherwise,

return result G

Else

return result E

= 26: If (Current /)//K/?et'w 100))

return result L

else if (Current DHV7?ecw= 0)

If (Current DHV itecorrf. AdjustedHourly Value is not rounded to Current DHV Precision)
return result M

else

Derived Hourly Adjusted Value Status = true

If (Current DHV Parameter in set {C02C, H20} AND Current DHV Max Min Value is not

null)

If (Current DHV Parameter == "H20" AND H2() Missing Data Approach ==

"MIN")

if (Current DHV 7?ecw Current DHV Max Min
Value)

return result G

Else

return result E

else

If (Current DHV Record Adj ustcdHourly Value >= 0)

Environmental Protection Agency

Page 346 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current I)HVRecord AdjustcdHourly Valuc is not rounded to Current DHVPrecision)
return result M

else

Derived Hourly Adjusted Value Status = true

If {Current DHV Parameter == "HI")

if {Heat Input Method Codenot in set {AD, ADCALC, CALC})

Current DHV Calculated Adjusted Value = Current DHV
Record. Adj ustedHourly Value

If (Current 1)H V Record Adj ustcdHourly V al uc == 0.0)

If {Heat Input Method Code == "CEM")

If Legacy Data Evaluation = true

If {Current Hourly Op Record.> 0.25)
return result J

else

If {Current Hourly Op Record. OpTime >0)
return result K

else if {Current DHV Max Min Value is not null and Current DHV
Record. Adj ustedHourlyValue > Current DHV Max Min Value)
return result G

else if {Current DHV Parameter == "NOXR")

if {Current NOx Rate Method Code <> "AE")

Current DHV Calculated Adjusted Value = Current DHV
Record. Adj ustedHourly Value

else if {Current DHV Parameter == " S02")

if (S02 App D Method Active for Hour == false)

Current DHV Calculated Adjusted Value = Current DHV
Record. Adj ustedHourly Value

else if {Current DHV Parameter == "C02")

if (CO 2 App D Method Active for Hour == false)

Current DHV Calculated Adjusted Value = Current DHV
Record. Adj ustedHourly Value

else

Current DHV Calculated Adjusted Value = Current DHV Record Adj ustcdHourly Value

else

return result E

Environmental Protection Agency

Page 347 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Environmental Protection Agency	Page 348 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

E
F

H

I
J
K

L

M

N

0

Response

You reported an MODCCode of 21 in the DHV record for [param], but the
AdjustedHourly Value does not equal 0.

You reported an MODCCode of [modcCode] in the DHV record for [param], but the
AdjustedHourly Value does not equal the maximum potential value reported in the
span or default record in your monitoring plan.

You reported an MODCCode of 13 or 24 in the DHV record for NOXR, but the
AdjustedHourly Value does not equal the maximum controlled emission rate
reported in the NORX default record in your monitoring plan.

You reported an MODCCode of 06 in the DHV record for [param], but the
AdjustedHourly Value does not equal average of measured hour before and
measured hour after.

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

You reported an MODCCode of [MODCCode] in the DHV record for [param], but
you reported an AdjustedHourly Value that is less than the average of the
measured hour before and measured hour after.

Warning: The AdjustedHourly Value reported in the DHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span, Default, and/or Unit Capacity
values. You should investigate the cause of these exceedances and determine
whether adjustments to your monitoring systems or monitoring plan are necessary.
Warning: The AdjustedHourly Value reported in the DHV record for [param] is
lower than the minimum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these minimum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span Default values. You should
investigate the cause of these low values and determine whether adjustments to
your monitoring systems or monitoring plan are necessary.

You reported an MODCCode of 26 in the DHV record for [param], but the
AdjustedHourly Value does not equal 1.

You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you
operated more than 0.25 hour.

You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you had
operating time during the hour. If you operated, you must report a heat input rate
of at least 1 mmBtu/hr.

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be between 0 and 100.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported an MODCCode of [MODCCode] in the DHV record for [param], but
you reported an AdjustedHourly Value that is greater than the average of the
measured hour before and measured hour after.

Warning: The UnadjustedHourly Value reported in the DHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Informational Message

Informational Message

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Environmental Protection Agency

Page 349 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Calculation Verification
C02 Mass Rate Calculation Verification
H20 Calculation Verification
Heat Input Calculation Verification
NOx Emissions Rate Calculation Verification
NOx Mass Rate Calculation Verification
S02 Calculation Verification

Environmental Protection Agency

Page 350 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-40

Check Name:

Related Former Checks:

Determine Moisture for S02 Mass Calculation Verification

Applicability:

Description:

Specifications:

CEM Check

If (S02 Method Code begins with "CEM")

if (SO2 Mass Equation Code == "F-2")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for S02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for S02 = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20DHV
Calculated Adjusted Value is not null)

Calculated Moisture for S02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default
Value is not null)

Calculated Moisture for S02 = H20 Default Value

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 351 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURCV-41

Check Name:	Calculate Adjusted NOx Rate in DHV Record

Related Former Checks:

Applicability:	General Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true)

if (Rpt Period NOx Rate Reported Accumulator Array for this location is not null)

if {Rpt Period NOx Rate Reported Accumulator Array for this location >= 0)

Rpt Period NOx Rate Reported Accumulator Array for this location = Rpt Period NOx Rate Reported
Accumulator Array for this location + Current DHV 7?ecw 0
AND App E Constant Fuel Mix == false)

If (NOXR App E Accumulator >= 0 AND HI Calculated Adjusted Value is not null AND Current Hourly Op
7?ecw= 0 AND HI Calculated Adjusted Value is not null)

Config NOxRateTimesHeatlnput Accumulator = Config NOxRateTimesHeatlnput Accumulator + (HI
Calculated Adjusted Value * NOXR Calculated Adjusted Value)

else

Config NOxRateTimesHeatlnput Accumulator = -1

Environmental Protection Agency

Page 352 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if {Config NOxRateTimesOpTime Accumulator >= 0 AND Current Hourly Op Record.OperatingTime is between 0
and 1 (inclusive))

Config NOxRateTimesOpTime Accumulator = Config NOxRateTimesOpTime Accumulator + (Current
Hourly Op /?£?tw=0)

Rpt Period NOx Rate Calculated Accumulator Array for this location = Rpt Period NOx Rate Calculated
Accumulator Array for this location + NOXR Calculated Adjusted Value

else

Rpt Period NOx Rate Calculated Accumulator Array for this location = NOXR Calculated Adjusted Value

Rpt Period NOx Rate Hours Accumulator Array for this location = Rpt Period NOx Rate Hours Accumulator Array for
this location + 1

if (Derived Hourly Adjusted Value Status == true AND Derived Hourly Unadjusted Calculation Status == true)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

if ABS{NOXR Calculated Adjusted Value - Current DHV Record. AdjustedHourly Value) > Tolerance
return result B

else if Current NOx Rate Method Code <> " AE" OR Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor Oil > 0)

>0)

Apportionment Calc NOXR Array at this Location = -1

Rpt Period NOx Rate Calculated Accumulator Array for this location = -1

if {MP Stack Config for Hourly Checks == "MS")

Config NOxRateTimesHeatlnput Accumulator = -1

if {RATA Status Required == true AND Current NOX System BAF is null AND NOXR Calculated Unadjusted Value is not

null)

return result A

Environmental Protection Agency

Page 353 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated Informational Message

due to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent	Critical Error Level 1

with the recalculated value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Conditions:	RATA Status Required Equals false

2	Process/Category: Emissions Data Evaluation Report	NOX RAT A Status Evaluation

Environmental Protection Agency

Page 354 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-42

Check Name:

Related Former Checks:

Check HI System in DHV Record

Applicability:

Description:

Specifications:

CEM Check

If Current DHV Parameter == "HI" AND Heat Input Method Code in set {CEM, AMS} )

If (Current I)H V Record Moni tori ng Sy stem ID is null

If (Heat Input Method Code== "CEM" AND

(CO 2 Cone Checks Needed for Heat Input == true AND Current C02 Cone Monitor Hourly
Record is not null AND Current C02 Cone Monitor Hourly Record.ModcCode in set {01, 02, 03,
04, 17, 20, 21}) OR

(02 Wet Checks Neededfor Heat Input == true AND Current 02 Wet Monitor Hourly Record is
not null AND Current 02 Wet Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20}) OR
(02 Dry Checks Neededfor Heat Input == true AND Current 02 Dry Monitor Hourly Record is

not null AND Current 02 Dry Monitor Hourly Record.ModcCodc in set {01, 02, 03, 04, 17, 20}))

If (Heat Input Method Code == "CEM" AND

((C02 Cone Checks Needed for Heat Input == false OR (Current C02 Cone Monitor Hourly
Record is not null AND Current C02 Cone Monitor Hourly Record.ModcCode NOT in set {01, 02,
03, 04, 05, 17, 20, 21, 53, 54})) AND

(02 Wet Checks Needed for Heat Input == false OR (Current 02 Wet Monitor Hourly Record is
not null AND Current 02 Wet Monitor Hourly Record.ModcCode NOT in set {01, 02, 03, 04, 05, 17,

20, 53, 54})) AND

(02 Dry Checks Needed for Heat Input == false OR (Current 02 Dry Monitor Hourly Record is not
null AND Current 02 Dry Monitor Hourly Record.ModcCodc NOT in set {01, 02, 03, 04, 05, 17, 20,

53, 54})))

If (Current DHV Record Valid == true)
return result B

else

HI DHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

Usage:

1

Response

You did not report MonitoringSystemID in the DHV record for HI. While this was
acceptable for legacy data, this field is required when you report measured data.
You reported a MonitoringSystemID in the DHV record for [param]. This field
should be blank when missing data substitution is used.

You reported MonitoringSystemID [ID] in the DHV record for [param], but
according to your monitoring plan this system was not active during the hour.
You reported MonitoringSystemID [ID] in the DHV record for HI, but this system is
not a C02 or 02 monitoring system.

Severity

Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 356 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURCV-43

Check Name:

Determine DHV Measure Code

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Set Current Measure Code to null.

If {Current DHV Parameter in set {C02C, H20})

If (Current DHV Record. ModcCode in set {01, 02, 03, 04, 21, 53, 54})

Set Monitor Measure Code Array for the Current DHV Parameter to "MEASURE"

if (Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F-14B" AND Monitor
Measure Code Array for "H20" == "SUB")

Set Monitor Measure Code Array for "C02C" to "MEASSUB".

else if (Current DHV Record. ModcCode in set {06, 07, 08, 09, 10, 12, 55})

Set Monitor Measure Code Array for the Current DHV Parameter to " SUB"

if (Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F-14B" AND Monitor
Measure Code Array for "H20" == "MEASURE")

else if (Current DHV Parameter == "NOXR")

If (Current NOx Rate Method Code in set {CEM, PEM}

If (Current DHV Record. ModcCode in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})

Set Current Measure Code" to "MEASURE".

if (NOx Rate Equation Code in set {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9} AND Monitor Measure Code Array
for "H20" == "SUB")

set Current Measure Code to "MEASSUB".

else if (Current DHV Record. ModcCode in set {06, 07, 08, 09, 10, 11, 12, 23, 24, 25, 55})

Set Current Measure Code to "SUB"

if (NOx Rate Equation Code in set {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9} AND Monitor Measure Code Array
for "H20" == "MEASURE")

set Current Measure Code to "MEASSUB".

else if (Current NOx Rate Method Code == "AE")

Set Current Measure Code to the Monitor Measure Code Array for "NOXR".

Set NOXR Measure Code to the Current Measure Code.

else if (Current DHV Parameter == "HI")

If (Heat Input Method Code == "CEM")

Set Monitor Measure Code Array for "C02C" to "MEASSUB".

Environmental Protection Agency

Page 357 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if {Heat Input Equation Code in set {F-15, F-16})

If (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both not null)
set Current Measure Code to "ME AS SUB".

else if (Heat Input Equation Code in set {F-18})

If (Monitor Measure Code Array for "02D" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "02D" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "02D" and "FLOW" are both not null)
set Current Measure Code to "ME AS SUB".

else if (Heat Input Equation Code in set {F-17})

If (Monitor Measure Code Array for "02W" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "02W" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "02W" and "FLOW" are both not null)
set Current Measure Code to "MEASSUB".

if (Heat Input Equation Code in set {F-16, F-17, F-18} AND Monitor Measure Code Array for "H20" is not null)

If ((Current Measure Code == "MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == "MEASURE"))
set Current Measure Code to "MEASSUB".

else if (Heat Input App D Method Active for Hour == true)

If (Monitor Measure Code Array for "FF" in set {OTHER, MEASSUB})

set Current Measure Code to Monitor Measure Code Array for "FF".

else if (Monitor Measure Code Array for "FF" and "GCV" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "FF" and "GCV" are both equal to "SUB")
set Current Measure Code to " SUB".

Environmental Protection Agency

Page 358 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Monitor Measure Code Array for "FF" and "GCV" are both not null)
set Current Measure Code to "MEASSUB".

if (Monitor Measure Code Array for "DENSITY" is not null)

If ({Current Measure Code == "MEASURE" AND Monitor Measure Code Array for "DENSITY" ==
"SUB") OR (Current Measure Code == "SUB" AND Monitor Measure Code Array for "DENSITY" ==
"MEASURE"))

set Current Measure Code to "MEASSUB".

Set HI Measure Code to the Current Measure Code.

else if (Current DHVParameter == "S02")

If (SO2 CEM Method Active for Hour == true)

If (Monitor Measure Code Array for "S02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "S02C" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "S02C" and "FLOW" are both not null)
set Current Measure Code to "MEASSUB".

if (SO2 Equation Code == "F-2" AND Monitor Measure Code Array for "H20" is not null)

If ((Current Measure Code == "MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == "MEASURE"))
set Current Measure Code to "MEASSUB".

else if (SO2 F23 Method Active for Hour == true)

set Current Measure Code to HI Measure Code.

else if (SO2 App D Method Active for Hour == true)

If (Monitor Measure Code Array for "FF" in set {OTHER, MEASSUB} OR Monitor Measure Code Array for
"SULFUR" is null)

set Current Measure Code to Monitor Measure Code Array for "FF".

else if (Monitor Measure Code Array for "FF" and "SULFUR" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "FF" and "SULFUR" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "FF" is not null)
set Current Measure Code to "MEASSUB".

Environmental Protection Agency

Page 359 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Current DHVParameter == "C02")

If (CO 2 Method Code == "CEM")

If (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both not null)
set Current Measure Code to "MEASSUB".

if (CO 2 Mass Equation Code == "F-2" AND Monitor Measure Code Array for "H20" is not null)

If ({Current Measure Code == "MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == "MEASURE"))
set Current Measure Code to "MEASSUB".

else if (CO 2 App D Method Active for Hour == true)

set Current Measure Code to HI Measure Code.

else if (Current DHV Parameter == "NOX")

if (NOx Mass Equation Code== "F-24A")

If (HIMeasure Code andNOXR Measure Code are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (HIMeasure Code andNOXR Measure Code are both equal to "SUB")
set Current Measure Code to "SUB".

else if (HIMeasure Code andNOXR Measure Code are both not null)
set Current Measure Code to "MEASSUB".

else if (NOx Mass Equation Code in set {F-26A, F-26B})

If (Monitor Measure Code Array for "NOXC" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "NOXC" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "NOXC" and "FLOW" are both not null)
set Current Measure Code to "MEASSUB".

if (NOx Mass Equation Code == "F-26B" AND Monitor Measure Code Array for "H20" is not null)

If ((Current Measure Code == "MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == "MEASURE"))

Environmental Protection Agency

Page 360 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Current Measure Code to "MEASSUB".

else if {Current DHVParameter in set {S02M, NOXM, C02M, HIT}

Set Current Measure Code to "LME".

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Calculation Verification

2

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Calculation Verification

3

Process/Category:

Emissions Data Evaluation Report —

— C02M Derived Hourly Evaluation (LME)

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Calculation Verification

5

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Calculation Verification

6

Process/Category:

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

7

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Calculation Verification

8

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Calculation Verification

9

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

10

Process/Category:

Emissions Data Evaluation Report —

— S02 Calculation Verification

11

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 361 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Derived Data

Environmental Protection Agency

Page 362 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-1

Check Name:

Initialize S02 Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "S02"

SO2 Derived Hourly Status = true

Current DHV Record = Current S02 Derived Hourly Record
Current DHV Method = S02 Method Code
Current DHV System Type = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Environmental Protection Agency

Page 363 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-2

Check Name:

Initialize NOX Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "NOX"

NOX Derived Hourly Status = true

Current DHV Record = Current NOx Mass Derived Hourly Record
Current DHV Method = NOx Mass Monitor Method Code
Current DHV System Type = null

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 364 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-3

Check Name:

Initialize NOXR Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "NOXR"

NOXR Derived Hourly Status = true
Current DHV System Type = null

Current DHV Record = Current NOx Rate Derived Hourly Record
Current DHV Method = Current NOx Rate Method Code

NOx Emission Rate MODC = Current NOx Rate Derived Hourly Record.ModcCode

if {Current DHV Method == "CEM">

Current DHV System Type = "NOX"
else if {Current DHV Method == "PEM")

Current DHV System Type = "NOXP"
if {Current DHV Method == "AE")

Current DHV System Type = "NOXE"

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 365 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-4

Check Name:

Initialize C02 Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "C02"

C02 Derived Hourly Status = true

Current DHV Record = Current C02 Mass Derived Hourly Record
Current DHV Method = C02 Method Code
Current DHV System Type = null

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 366 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-5

Check Name:

Initialize C02C Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current DHV Parameter = "C02C"

C02C Derived Hourly Status = true

Current DHV Record = Current C02 Cone Derived Hourly Record
Current DHV System Type = 'C02'

Current DHV Method = "CEM"

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Environmental Protection Agency

Page 367 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-6

Check Name:

Initialize H20 Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current DHV Parameter = "H20"

H20 Derived Hourly Status = true

Current DHV Record = Current H20 Derived Hourly Record
Current DHV System Type = "H20"

Current DHV Method = H20 Method Code
RATA Status Required = false

Current Hourly Record for RATA Status = Current H20 Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Environmental Protection Agency

Page 368 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-7

Check Name:

Initialize HI Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current DHV Parameter = "HI"

HI Derived Hourly Status = true
Current DHV System Type = null

Current DHV Record = Current Heat Input Derived Hourly Record
Current DHV Method = Heat Input Method Code

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Environmental Protection Agency

Page 369 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-8

Check Name:

Initialize S02R Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current DHV Parameter = "S02R"

S02R Derived Hourly Status = true
Current DHV System Type = null

Current DHV Record = Current S02R Derived Hourly Record
Current DHV Method = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 370 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-9

Check Name:

Initialize S02M Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

Current DHV Parameter = "S02M"

S02M Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current S02 Derived Hourly Record

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 371 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-10

Check Name:

Initialize NOXM Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

Current DHV Parameter = "NOXM"

NOXM Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current NOx Mass Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 372 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-11

Check Name:

Initialize C02M Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

Current DHV Parameter = "C02M"

C02M Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current C02 Mass Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 373 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-12

Check Name:

Initialize HIT Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

Current DHV Parameter = "HIT"

HIT Derived Hourly Status = true

Current DHV System Type = null

Current DHV Method = Heat Input Method Code

Current DHV Record = Current Heat Input Derived Hourly Record

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 374 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-13

Check Name:	Check MODC in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Derived Hourly Mode Status = false

case (Current DHV Parameter)

S02: If {Current DHV Method == "AMS")

If {Current DHV Record. ModcCode is not null and is not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 13,
15, 16,21, 23, 53, 54, 55})
return result A

Else

Derived Hourly Mode Status = true

else

If {Current DHV Record. ModcC ode is not null)
return result B

Else

Derived Hourly Mode Status = true

NOX: If {Current DHV Method == "AMS")

If {Current DHV Record. ModcCode is not null and is not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12,
13, 15,21, 23, 24, 53, 54, 55})
return result A

Else

Derived Hourly Mode Status = true

else

If {Current DHV Record. ModcC ode is not null)
return result B

Else

Derived Hourly Mode Status = true

NOXR: If {Current DHV Method == "AMS" AND Current DHV Record. ModcCode is null)
Derived Hourly Mode Status = true

else if {Current DHV Method == "AE")

If {Current DHV Recortl.MoAcCoAc is not null)
return result C

Else

Derived Hourly Mode Status = true

else

if {Current DHV Record.ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 21, 22,
23, 24, 25, 53, 54, 55})
return result A

Else

Derived Hourly Mode Status = true

C02C: If {Current DHV Record. ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
return result A

Environmental Protection Agency

Page 375 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else

Derived Mode Status = true

C02: If {Current DHVMethod == "AMS")

If {Current DHV Record ModcCode is not null and is not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 53,
54, 55})

return result A

Else

Derived Hourly Mode Status = true

else

If {Current DHV Record. ModcC ode is not null)
return result B

Else

Derived Hourly Mode Status = true

HI: If {Current DHV Method == "AMS")

If {Current DHV Record. ModcCode is not null and is not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 26,
53, 54, 55})

return result A

Else

Derived Hourly Mode Status = true

else

If {Current DHV Record. ModcC ode is not null and Current DHV Recoril.MoAcCoAc o "26")
return result B

Else

Derived Hourly Mode Status = true

H20: if {Current DHV Method == "MWD" i

If {Current DHV Record. ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
return result A

else

Derived Hourly Mode Status = true

else if {Current DHV Method == "MDF")

If {Current DHV Record.ModcCode o "40")
return result A

else

Derived Hourly Mode Status = true

S02R: If (SO2 F23 Method Active For Hour == true)

If {Current DHV Record.ModcCode o "40")
return result A

else

Derived Hourly Mode Status = true

HIT: If {Current DHVRecordMoAcQoAc == "45")

If {LME HI Substitute Data Code == "MHHI")
Derived Hourly Mode Status = true

else

return result D
else if {Current DHV Record. ModcCode is not null)
return result A

Environmental Protection Agency

Page 376 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else

Derived Hourly Mode Status = true

S02M, NOXM, C02M:

If (Current DHV Record.Mo&cCo&c is not null)
return result B

Else

Derived Hourly Mode Status = true

Results:

Result

A

B

C

D

Usage:

Response

The MODCCode reported in the DHV record for [param] is invalid.

You reported an MODCCode in the DHV record for [param]. This field should be

blank.

You reported an MODCCode in the DHV record for NOXR. This field should be
blank when you use the Appendix E method to determine the NOx emission rate.
You reported an MODCCode of 45 in the DHV record for HIT, but you have not
reported a SubstituteDataCode of MHHI in the active heat input method record in
your monitoring plan.

Severity

Critical Error Level 1
Non-Critical Error

Critical Error Level 1

Critical Error Level 1

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Derived Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Derived Hourly Evaluation

3

Process/Category:

Emissions Data Evaluation Report —

— C02M Derived Hourly Evaluation (LME)

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

7

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

9

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

10

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

11

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

12

Process/Category:

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 377 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-14

Check Name:

Check Percent Monitor Availability in DHV Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Derived Hourly Pma Status = false
Derived Hourly Missing Data Status = true

If (Derived Hourly Mode Status == true)

If ( Current DHV Record Percent Available is NULL)

if {Current DHV Parameter not in set {H20, C02C, NOXR})
Derived Hourly Pma Status = true

else if {Current DHV Parameter == "NOXR" and Current DHV Method not in set {PEM, CEM})
Derived Hourly Pma Status = true

else if {Current DHV Parameter == "H20" and Current DHV Record.ModcCode == "40")
Derived Hourly Pma Status = true

if {Current DHV Record. ModcCode not in set {01, 02, 03, 04, 14, 21, 22, 53, 54} AND Legacy Data
Evaluation == true)

Derived Hourly Pma Status = true
return result A

else

return result B

else

if {Current DHV Parameter == "NOXR" and Current DHV Method == "AE")
return result C

else if {Current DHV Parameter == "H20" and Current DHV Record.ModcCode == "40")
return result C

else if {Current DHV Parameter not in set {H20, C02C, NOXR} AND Current DHV Method <> "AMS")
return result C

else if {Current DHV Record.?ercentAvai\ab\e> 100.0 OR

Current DHV Record. Percent Available < 0.0)
return result D

Else

case ( Current DHV Record.ModcCode)

= 06: If CurrentD//K/?ecw= 90.0
Derived Hourly Pma Status = true

else

Else

return result E

08: If Current DHV Record. Percent Available >= 95.0
Derived Hourly Pma Status = true

Else

Environmental Protection Agency

Page 378 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result E

= 09: If Current DHV7?ecw= 90.0 AND Current DHV7?ecw=80.0 AND Current DHV 7?ecw=90.0
Derived Hourly Pma Status = true
return result F

Else

return result E

= 11: If Current DHV RecordPqrcent Available >=90.0
Derived Hourly Pma Status = true

Else

return result E

All other MODC Codes:

Derived Hourly Pma Status = true

Results:

Result
A

B
C

D

E
F

Response

You reported an MODCCode of [ModcCode] in the DHV record for [param], but

you did not report a value for PercentAvailable. While this is not required for

legacy EDR data, it is required in all [param] DHV records for ECMPS.

You did not report PercentAvailable in the DHV record for [param].

You reported PercentAvailable in the DHV record for [param]. This field should be

blank.

The PercentAvailable reported in the DHV record for [param] is invalid. This value
must be between 0 and 100.

You reported an MODCCode of [modcCode] in the DHV for [param], but the
PercentAvailable is not appropriate for this MODC.

You reported an MODCCode of 10 in the [type] record for [param], but the
PercentAvailability is greater than or equal to 90. When the PMA is greater than or
equal to 90, you should only report an MODC of 10 to indicate that you used the
maximum hourly value in the lookback period for the next available higher load bin,
because there were no quality-assured data in the bin corresponding to the current
load range. (See Part 75.33(c)(5).)

Severity

Informational Message

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Environmental Protection Agency

Page 379 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category

2

Process/Category

3

Process/Category

4

Process/Category

5

Process/Category

6

Process/Category

7

Process/Category

8

Process/Category

9

Process/Category

10

Process/Category

11

Process/Category

12

Process/Category

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 380 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-15

Check Name:	Check Prior QA'd Hours for MODC 07

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
if (Current DHV Record Mo&cQo&c == 07)

case (Current DHV Parameter)

NOXR: MODC Set = {01, 02, 04, 14, 21, 22, 53}

C02C: MODC Set = {01, 02, 04, 21, 53}

H20: MODC Set = {01, 02, 04, 21, 53}

Prior QA Hours = count DerivedHourly ValueData records where

DerivedHourlyValueData.ModcCode in set MODC Set AND

DerivedHourly ValueData.ParameterCode = Current DHV Record ParamctcrCodc AND
(DerivedHourly ValueData.BeginDate < Current Date OR

(DerivedHourly ValueData.BeginDate = Current Date AND DerivedHourly ValueData.BeginHour < Current
Hour))

if {Current DHV Parameter == "NOXR")
if (Prior QA Hours >2160)

Derived Hourly Missing Data Status = false
return result A

else

if (Prior QA Hours > 720)

Derived Hourly Missing Data Status = false
return result A

Results:

Result	Response	Severity

A	You reported an MODCCode of 07 in the DHV record for [param], but too many	Critical Error Level 1

prior quality assured hours exist in evaluation period for use of this missing data
approach.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

3	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 381 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-16

Check Name:

Related Former Checks:

Check for Correct Use of Missing Data MODCs

Applicability:

Description:

Specifications:

CEM Check

Current DHV HBHA Value = null

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)

case (Current DHV Parameter)

NOXR: MODC Set = {01, 02, 03, 04, 14, 21, 22, 53, 54}
C02C: MODC Set = {01, 02, 03, 04, 21, 53, 54}
H20: MODC Set = {01, 02, 03, 04, 21, 53, 54}

if (Current DHV Record ModcCode in set {06, 08, 09})

If (Current MHVParameter in set {C02C, H20})

Prior Record = latest DerivedHourly ValueData record or MonitorHourly ValueData record where
ParameterCode = Current DHV Parameter AND
ModcCode in set MODC Set AND
(Date < Current Date OR

(Date = Current Date AND Hour < Current Hour ))

If Prior Record is not null and is in current reporting period

Next Record = earliest DerivedHourly ValueData record or MonitorHourly ValueData record where
Data.ParameterCode = Current MHV Parameter AND
Data.ModcCode in set MODC Set AND
(Date > Current Date OR

(Date = Current Date AND Hour > Current Hour ))

If Next Record is not null and is in current reporting period

If PriorRecord. AdjustedHourlyValue >= 0 AND NextRecord. AdjustedHourlyValue >= 0

Current DHV HBHA Value = (/Vz'or .Record. AdjustedHourly Value + Next
Record. AdjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Derived Hourly Missing Data Status = false
return result A

else

Prior DHV Record = latest DerivedHourly ValueData record where

DerivedHourly ValueData.ParameterCode = Current DHV Parameter AND
DerivedHourValueData.ModcCode in set MODC Set AND

Environmental Protection Agency

Page 382 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

[DerivedHourlyValueData.Date < Current Date OR

(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour < Current
Hour)]

If Prior DHVRecord is not null and is in current reporting period

Next DHVRecord = earliest DerivedHourlyValueData record where

DerivedHourlyValueData.ParameterCode = Current MHVParameter AND
DerivedHourValueData.ModcCode in set MODC Set AND
[DerivedHourlyValueData.Date > Current Date OR

(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour >
Current Hour)]

If Next DHV Record is not null and is in current reporting period

If Prior DHV Record. AdjustedHourly Value >= 0 AND Next DHV
Record. AdjustedHourlyValue >= 0

Current DHV HBHA Value = (/>z'or.D/fFi?ecor(i.AdjustedHourlyValue + Next
DHVRecord. AdjustedHourlyValue) / 2, ROUNDED to three decimal places.

else

Derived Hourly Missing Data Status = false
return result A

else if (Current DHV RecordModcCode == "11")

Prior Measured DHVRecord = DerivedHourlyValueData record at latest time for the location where
DerivedHourlyValueData.ModcCode in set MODC Set AND
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate < Current Date OR

(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour < Current
Hour))

If Prior Measured DHVRecord is not null and is in the current reporting period
PriorDate = Prior Measured DHV Record .BeginDate
PriorHour = Prior Measured DHVRecord.BeginHour

else

PriorDate = the day prior to the beginning of the current reporting period
PriorHour = 23

Next Measured DHV Record = DerivedHourlyValueData record at earliest time for the location where
DerivedHourlyValueData.ModcCode in set MODC Set AND
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate > Current Date OR

(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour> Current
Hour))

If Next Measured DHV Record is not null and is in the current reporting period
NextDate = Next Measured DHVifecord.BeginDate
NextHour = Next Measured DHV Record. BeginHour

Environmental Protection Agency

Page 383 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

NextDate = the day after the end of the current reporting period
NextHour= 0

Missing Data Period Length = Count of DerivedHourly ValueData records for the location where
DerivedHourlyValueDataParameterCode = Current DHVParameter AND
(DerivedHourly ValueData.BeginDate > PriorDate OR

(DerivedHourly ValueData.BeginDate = PriorDate AND DerivedHourly ValueData.BeginHour >
PriorHour)) AND

(DerivedHourly ValueData.BeginDate < NextDate OR

(DerivedHourly ValueData.BeginDate = NextDate AND DerivedHourly ValueData.BeginHour <

NextHour))

if {Current DHV Record. PercentAvailable is null OR Current DHV Record. Percent Available >= 95.0)
if (Missing Data Period Length > 24)

Derived Hourly Missing Data Status = false
return result B

else

if (Missing Data Period Length > 8)

Derived Hourly Missing Data Status = false
return result B

Results:

Result
A

B

Usage:

1

2

3

Response

The AdjustedHourly Value reported in the DHV record for [param] either before or
after the current hour is invalid.

You reported an MODCCode of 11 in the DHV record for [param], but the length of
the missing data period exceeds the allowable value for use of this missing data
procedure.

Severity

Critical Error Level 1
Critical Error Level 1

Process/Category:
Process/Category:
Process/Category:

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 384 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-17

Check Name:

Check Extraneous Data in DHV Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Derived Hourly Null Status = false
Hourly Extraneous Fields = null

if (Current DHV Record. UnadjustedHourly Value is not null)

append "UnadjustedHourly Value" to Hourly Extraneous Fields

if (Current DHV Record ScgmcntNumbcr is not null)

append " SegmentNumber" to Hourly Extraneous Fields

if (Current DHVRecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:



1

Process/Category

2

Process/Category

3

Process/Category

4

Process/Category

5

Process/Category

6

Process/Category

7

Process/Category

8

Process/Category

9

Process/Category

10

Process/Category

11

Process/Category

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 386 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-18

Check Name:	Check System in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current DHV Mon Sys Record = null
Derived Hourly System Status = false

if {Current DHV Parameter == "NOXR")

App E Constant Fuel Mix = false

If {{Current DHV Parameter in set {S02, S02R, NOX, C02} AND Current DHV Method <> "AMS") OR

{Current DHV Parameter == "HI" AND Current DHV Method in set {CALC, AD, ADCALC}) OR
{Current DHV Parameter == "H20" AND Current DHV Method == "MDF") OR
LME HI Method is not null)

if Current DHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Current DHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHV7?ecw Current DHV System Type)
return result E

else if (Current DHV Method == "AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count
for Oil> 0)

If (Derived DHV Mon Sys Record F uclC'odc == "MIX" OR Current DHV
7?ecw "MIX")
return result G

else

return result H

else

return result I

else

Derived Hourly System Status = true

else

Derived Hourly System Status = true

Environmental Protection Agency

Page 388 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F

H
I

Response

You reported [fieldnames] in the DHV record for [param]. This data should be
blank.

You reported a MonitoringSystemID in the DHV record for [param]. This field

should be blank when missing data substitution is used.

You did not report a MonitoringSystemID in the DHV record for [param]. This

information is required when you report measured data.

You reported MonitoringSystemID [ID] in the DHV record for [param], but

according to your monitoring plan this system was not active during the hour.

You reported MonitoringSystemID [ID] in the DHV record for [param], but the

SystemTypeCode of this system is not appropriate.

You reported an OperatingConditionCode of E in the DHV record for NOXR. You
should report the NOx emission rate for emergency fuels in an HPFF record, not a
DHV record.

You reported an OperatingConditionCode in the DHV record for NOXR, which
indicates that you are determining NOx emission rate from a mixed fuel Appendix E
curve, but the FuelCode of NOXE MonitoringSystemID [ID] is not equal to "MIX".
If a NOXE system measures an individual fuel, the emissions from this system
should be reported in an HPFF record, not a DHV record.
The OperatingConditionCode reported in the DHV record for NOXR is missing or
invalid.

You reported NOXE MonitoringSystemID [ID] in the DHV record for NOXR, but
the FuelCode of this system is not equal to "MIX". If a NOXE system measures an
individual fuel, the emissions from this system should be reported in an HPFF
record. If this data represents unit-level emissions based on fuel-specific
emissions data that have been reported in one or more HPFF records, then the
MonitoringSystemID should be blank.

You reported an OperatingConditionCode in the DHV record for NOXR, which
indicates that you are determining NOx emission rate using Appendix E, but you
did not report a MonitoringSystemID in this record. If you determined the NOx
emission rate from a mixed fuel curve or via heat input apportionment, you should
report the MonitoringSystemID of the NOXE system for the curve. If you
determined the NOx emission rate from one or more individual fuel curves, you
should not report an OperatingConditionCode in the NOXR DHV record.

Severity

Non-Critical Error
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 389 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category

2

Process/Category

3

Process/Category

4

Process/Category

5

Process/Category

6

Process/Category

7

Process/Category

8

Process/Category

9

Process/Category

10

Process/Category

11

Process/Category

12

Process/Category

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 390 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-19

Check Name:	Check System Designation Code for System in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (Derived Hourly Mode Status == true AND Derived Hourly System Status == true AND Current DHV Mon Sys Record is not

null)

case (Current DHV Record. ModcC ode )

01: If (Current DHV Mon Sys Record. SystemDesignationCode NOT in set {P, PB})
return result A

02: If (Current DHV Mon Sys Record. SystemDesignationCode NOT in set {B, RB, DB}
return result B

04: If (Current DHV Mon Sys Record. SystemDesignationCode o "RM")
return result C

22: If (Current DHV Mon Sys Record. SystemDesignationCode o "CI")
return result D

Results:

Result
A

B
C
D

Usage:

1

2

3

Response

You reported an MODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a primary system.

You reported an MODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a backup system.

You reported an MODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a reference method system.

You reported an MODCCode of 22 in the DHV record for NOXR, but
MonitoringSystemID [ID] is not a certified inlet system.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Process/Category:
Process/Category:
Process/Category:

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 391 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-24

Check Name:	Check Formula in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Derived Hourly Formula Status = false
Derived Hourly Equation Status = false
Current DHV Multiple Fuel Equation Code == null
Current DHV Formula Record = null

If (Current DHV7?ecw1)

case {Current DHV Parameter)

NOXR: Current DHV Multiple Fuel Equation Code = "E-2"

S02: Current DHV Multiple Fuel Equation Code = "D-12"

C02: Current DHV Multiple Fuel Equation Code = "G-4A"

HI: Current DHV Multiple Fuel Equation Code = "D-l 5A"

Locate active Formula Record for location WHERE

ParameterCode == Current DHV Parameter AND
EquationCode == Current DHV Multiple Fuel Equation Code

If found,

If (Legacy Data Evaluation == true)
return result A

else

return result B

else if {Current DHV Method = nPEM")

Derived Hourly Formula Status = true

else if {Current DHV Parameter == "NOX" AND Current NOx Rate Method Code == " AE" AND Hourly Fuel Flow
Count for Gas + Hourly Fuel Flow Countfor Oil > 1 AND Legacy Data Evaluation == true)

Derived Hourly Formula Status = true

else if {Current DHV Parameter in set {NOXR, H20, C02C})
If {Derived Hourly Mode Status == true)

Environmental Protection Agency

Page 392 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

If (Current DHVRecord.ModcCode in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
return result C

else

Derived Hourly Formula Status = true

else

return result C

else

If (Current DHV Parameter in set {S02R, H20} AND Current DHV Record.MODCCode == "40")
return result D

else if (LME HI Method is not null)
return result J

else

Current DHV Formula Record= Find MonitoringFormulaData record where

MonitoringFormulaData,MonitoringFormulalDKey = Current DHV7?ecw 1 AND Current DHV Formula Record ParamctcrCodc ==
"HIT" AND Current DHV Formula Record.EquationCode == "D-15" AND Legacy Data Evaluation ==

true)

return result I

else

return result F

else

Derived Hourly Formula Status = true

if Current DHV Parameter == "HI" AND Current DHV Method = "ADCALC" and Current DHV Formula
7?ecw
-------
Draft ECMPS Emissions Check Specifications

return result G

3/7/2012 12:00:00AM

Results:

Result
A

B

C
D

E

F

G

H

I

Response

You did not report a FormulalD in the DHV record for [param]. While this is

acceptable for legacy EDR data, the FormulalD will be required for ECMPS.

You did not report a FormulalD in the DHV record for [param]. This formula is

required when you burn multiple fuels during the hour.

You did not report a FormulalD in the DHV record for [param].

You reported an MODC of 40, but you reported a FormulalD in the DHV record for

[param]. This field should be blank when reporting a default value.

You reported FormulalD [ID] in the DHV record for [param], but there is no active

Formula record for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for [param], but this is not a

[param] formula.

You reported a FormulalD in the DHV record for [param]. This field should be
blank when using missing data substitution.

You reported a FormulalD in the DHV record for NOXR. This field should be blank
unless you determine the NOX emission rate using multiple Appendix E curves.
You reported FormulalD [ID] in the DHV record for HI, but FormulaCode D-15 will
no longer be appropriate for calculating HI from multiple fuels. For ECMPS, the
ParameterCode should be for this formula should be HI and the FormulaCode
should be "D-15A".

You reported a FormulalD in the DHV record for [param]. This field should be
blank when reporting emissions for LME units.

Severity

Informational Message

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Informational Message

Critical Error Level 1

Environmental Protection Agency

Page 394 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category

2

Process/Category

3

Process/Category

4

Process/Category

5

Process/Category

6

Process/Category

7

Process/Category

8

Process/Category

9

Process/Category

10

Process/Category

11

Process/Category

12

Process/Category

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 395 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-25

Check Name:	Check Heat Input Equation Code

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

C02 Cone Checks Needed for Heat Input = false
02 Wet Checks Needed for Heat Input = false
02 Dry Checks Needed for Heat Input = false

if (Heat Input App D Method Active For Hour == true)

Hourly Fuel Flow Checks needed for Heat Input = true

else

Hourly Fuel Flow Checks needed for Heat Input = false

Heat Input Equation Code = null

if (Derived Hourly Formula Status == true)

if {Current DHV Formula Record is not null)

Heat Input Equation Code = Current DHV Formula 7?ec
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

true OR Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor Oil == 1))
Derived Hourly Equation Status = true
return result C
else if {Heat Input Equation Code is null)
return result A

else

return result B

else if (Current DHVMethod in set {CALC, ADCALC})

if (Heat Input Equation Code inset {F-21A, F-21B, F-21C, F-25})

Derived Hourly Equation Status = true
else if (Heat Input Equation Code== "SS-3B")

Derived Hourly Equation Status = true

Apportionment HI Method Array for the location = "COMPLEX"
else if (Heat Input Equation Code== "F-21D" OR Current DHV Method == "ADCALC")
Derived Hourly Equation Status = true

Apportionment HI Method Array for the location = "NOCALC"
else if (Heat Input Equation Code is null)
return result A

else

return result B

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true

Results:

Result
A

Response

You reported FormulalD [ID] in the DHV record for [param], but you did not report
a FormulaCode for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for HI, but the FormulaCode of this
formula is not appropriate for calculating HI.

You reported FormulalD [ID] in the DHV record for HI, but a formula with a
FormulaCode [EQCODE] is no longer appropriate in this record. For ECMPS, if you
are calculating heat input from multiple fuels using Appendix D, you should report
a formula with a FormulaCode of D-15A in the DHV record; otherwise, do not
report a FormulalD.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Informational Message

Usage:

Process/Category: Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Environmental Protection Agency

Page 397 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-26

Check Name:	Check NOX Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

NOx Rate Checks Needed for NOx Mass Calc = false
Heat Input Checks Needed for NOx Mass Calc = false

NOx Mass Equation Code = null

if (Derived Hourly Formula Status == true)

if {Current DHV Formula Record is not null)

NOx Mass Equation Code = Current DHV Formula 7?ec 1 AND Legacy Data Evaluation == true)

NOx Mass Equation Code = "F-24A"

Environmental Protection Agency

Page 398 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

Usage:

1

Response

You reported FormulalD [ID] in the DHV record for [param], but you did not report
a FormulaCode for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for NOX, but the FormulaCode of
this formula is not appropriate for calculating NOX from a NOXC system.
You reported FormulalD [ID] in the DHV record for NOX, but the FormulaCode of
this formula is not appropriate for calculating NOX from a NOx-diluent system.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 399 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-27

Check Name:	Check NOXR Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

02 Dry Checks Neededfor NOx Rate Calc = false
02 Wet Checks Needed for NOx Rate Calc = false
CO 2 Diluent Checks Needed for NOx Rate Calc = false

if (Current DHVMethod == "AE")

Hourly Fuel Flow Needed for NOx Rate Calc = true

else

Hourly Fuel Flow Needed for NOx Rate Calc = false

NOx Rate Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

if (Current DHV Formula Record is not null)

NOx Rate Equation Code = Current DHV Formula 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (NOx Rate Equation Code in set {19-5, 19-9}
Moisture Needed = true
append "MIN" to H20 Missing Data Approach

else (if
else

(NOx Rate Equation Code is null)
return result A

return result B

else if (Current NOx Rate Method Code == "AE")
if (NOx Rate Equation Code == 'E-2')

Derived Hourly Equation Status = true
else if (NOx Rate Equation Code is null)
return result A

else

return result C

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true

Results:

Result
A

B

C

Response

You reported FormulalD [ID] in the DHV record for [param], but you did not report
a FormulaCode for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for NOXR, but the FormulaCode of
this formula is not appropriate for calculating NOXR.

You reported FormulalD [ID] in the DHV record for NOXR, but the FormulaCode of
this formula is not appropriate for calculating NOXR from multiple fuels. The
FormulaCode should be E-2.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 401 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-28

Check Name:

Check C02C Equation Code

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

C02 Cone CEM Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

if (Current DHV Formula Record is not null)

CO2 Cone CEM Equation Code = Current DHV Formula Record Form ill aC ode
if (CO2 Cone CEM Equation Code in set {F-14A, F-14B})

Derived Hourly Equation Status = true

else

return result A

else

Derived Hourly Equation Status = true

Results:

Result
A

Response

You reported FormulalD [ID] in the DHV record for C02C, but the FormulaCode of
this formula is not appropriate for calculating C02C.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Environmental Protection Agency

Page 402 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-29

Check Name:

Check C02 Equation Code

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

C02 Cone Checks Neededfor C02 Mass Calc = false
Use C02 Diluent Cap for Co2 Mass Calc = false
Use 02 Diluent Cap for Co2 Cone Calc = false
if (CO 2 App D Method Active For Hour == true)

Hourly Fuel Flow Checks Neededfor C02= true

else

Hourly Fuel Flow Checks Neededfor C02 = false

CO2 Mass Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

if (Current DHV Formula Record is not null)

CO2 Mass Equation Code = Current DHV Formula 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You reported FormulalD [ID] in the DHV record for C02, but the FormulaCode of Critical Error Level 1

this formula is not appropriate for calculating C02.

B	You reported FormulalD [ID] in the DHV record for C02, but a formula with a	Informational Message

FormulaCode [EQCODE] is no longer appropriate in this record. For ECMPS, if you
are calculating C02 from multiple fuels using Appendix D, you should report a
formula with a FormulaCode of G-4A in the DHV record; otherwise, do not report a
FormulalD.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 404 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-30

Check Name:	Check S02 Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

SO2 Monitor Hourly Checks Needed = false
if (S02 App D Method Active For Hour == true)

Hourly Fuel Flow Checks Needed forSQ2 = true

else

Hourly Fuel Flow Checks Needed forSQ2 = false

SO2 Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

If (Current DHV Formula Record is not null)

SO2 Equation Code = Current DHV Formula Record.FormulaCode

if {SO2 CEM Method Active For Hour == true)

if (SO2 Equation Code== "F-l" OR S02 Equation Code == "F-2")
Derived Hourly Equation Status = true

Flow Monitor Hourly Checks Needed = true

If (S02 Equation Code== "F-2")

Moisture Needed = true
append "MIN" to H20 Missing Data Approach

if (S02 Monitor Hourly Count == 0)

return result A

else

S02 Monitor Hourly Checks Needed = true

else if (S02 Equation Code== "F-23" AND S02 F23 Method Active For Hour == true)
Derived Hourly Equation Status = true

else

return result B

else if (S02 F23 Method Active For Hour == true)
if (SO2 Equation Code== "F-23")

Derived Hourly Equation Status = true

else

return result B

else if (S02 App D Method Active For Hour == true)
if (SO2 Equation Code = "D-12")

Derived Hourly Equation Status = true
else if (S02 Equation Code in {D-2, D-4, D-5} AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow
Countfor Oil == 1))

Derived Hourly Equation Status = true
return result C

Environmental Protection Agency

Page 405 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result B

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true

Results:

Result

A

B

Response

You did not report an MHV record for [param] for the hour.

You reported FormulalD [ID] in the DHV record for S02, but the FormulaCode of

this formula is not appropriate for calculating S02.

You reported FormulalD [ID] in the DHV record for S02, but a formula with a
FormulaCode [EQCODE] is not appropriate in this record. If you are calculating
S02 from multiple fuels using Appendix D, you should report a formula with a
FormulaCode of D-12 in the DHV record; otherwise, do not report a FormulalD.

Severity

Critical Error Level 1
Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Environmental Protection Agency

Page 406 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-31

Check Name:

Check H20 Equation Code

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

H20 CEM Equation Code = "" //null string
if (Derived Hourly Formula Status == true)

If (Current DHV Formula Record is not null)

H20 CEM Equation Code = Current DHV Formula 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-32

Check Name:	Verify Correct Reporting of NOXC MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (Current DHVMethod in set {CEM, CEMNOXR})

If (Current DHV Parameter == "NOXR")

Nox Cone Neededfor NOx Rate Calc = false

If Current DHVRecord.ModcCode in set {01, 02, 03, 04, 14, 21, 22, 53, 54} // only need cone for measured data
If (NOx Cone Monitor Hourly Count == 0)
return result A

else

Nox Cone Neededfor NOx Rate Calc = true

else

If (NOx Cone Monitor Hourly Count == 1 AND Nox Cone Needed for NOx Mass Calc == false)
return result B

Else if (Current DHV Parameter == "NOX")

Nox Cone Needed for NOx Mass Calc = false

If (DerivedHourly Equation Status == true AND NOx Mass Equation Code begins with "F-26")
if (NOx Cone Monitor Hourly Count == 0)

return result A

else

Nox Cone Needed for NOx Mass Calc = true

Results:

Result	Response	Severity

A	You did not report an MHV record for NOXC for the hour.	Critical Error Level 1

B	You reported an MHV record for NOXC, but you reported a MODCCode of [mode] Non-Critical Error

in the DHV record for NOXR. You should not report an MHV record for NOXC
when you use substitute data to determine the NOx emission rate.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 408 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-33

Check Name:

Determine Default Value for MODC 40

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Derived Hourly Default Status == true

If (Derived Hourly Mode Status == true AND Current DHVRecord.ModcCode == 40)
If {Current DHV Parameter == "H20")

If Current /)//K/?et'w= 100
Derived Hourly Default Status == false
return result A

If H20 Default Max Value is null

If (H20 Default Value > 0 AND H20 Default Value < 100)

if (Current DHV Record Adj ustcdHourly Value o H20 Default Value)

Derived Hourly Default Status == false
return result B

else if (H20 Default Max Value > 0 AND H20 Default Max Value < 100 AND H20 Default Min Value > 0 AND
H20 Default Min Value < 100)

If Current 1)H V Record Ad j ustcdHourly Val lie < H20 Default Min Value OR

Else if {Current DHV Parameter == "S02R")

If Current	Adj ustcdHourly Value is null OR

Current DH V Record Ad j ustcdHourly Val lie <= 0
Derived Hourly Default Status == false
return result D

If F23 Default Max Value is null
If (F23 Default Value > 0)

if (Current DHV Record Adj ustcdHourly Value <> F23 Default Value)

Derived Hourly Default Status == false
return result B

else if (F23 Default Max Value > 0 AND F23 Default Min Value > 0)

If Current DHV Record. AdjustedHourlyValue < F23 Default Min Value OR

Current DH V Record Ad j ustcdHourly Val lie > F23 Default Max Value)
Derived Hourly Default Status == false
return result C

Environmental Protection Agency	Page 409 of 703

Current DHV Record. Adj ustedHourlyValue > H20 Default Max Value)
Derived Hourly Default Status == false
return result C

Else

H20 Default Value = Current DHV Record Adj ustcdHourly Value


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Else

F23 Default Value = Current DHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-34

Check Name:

Determine Derived Hourly Record Status

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

If {Current DHVParameter == "NOXR")

Current NOX System Status = Derived Hourly System Status
Current NOXR HBHA Value = Current DHV HBHA Value
else if {Current DHV Parameter == "C02C")

Current C02C DHV HBHA Value = Current DHV HBHA Value
else if {Current DHV Parameter == "H20")

Current H20 DHV HBHA Value = Current DHV HBHA Value

If {Derived Hourly Mode Status == false OR Derived Hourly Equation Status == false OR Derived Hourly Missing Data Status ==

false

OR {Current DHV Record. MODCCode in set {06, 07, 08, 09, 10, 11) AND Derived Hourly Pma Status == false))
Case {Current DHV Parameter)

C02C:	C02C Derived Hourly Status = false

H20:	H20 Derived Hourly Status = false

S02R:	S02R Derived Hourly Status = false

S 02M:	S02M Derived Hourly Status = fal se

NOXM:	NOXM Derived Hourly Status = f al se

C02M:	C02M Derived Hourly Status = false

HIT:	HIT Derived Hourly Status = false

S02:	SO2 Derived Hourly Status = false

NOXR:	NOXR Derived Hourly Status = false

NOX:	NOX Derived Hourly Status = false

C02:	CO2 Derived Hourly Status = false

HI:	HI Derived Hourly Status = false

Results:

Result

Response

Severity

Environmental Protection Agency

Page 411 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

8

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
S02 Derived Hourly Evaluation
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 412 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-36

Check Name:

NOx Rate DHV Extraneous Fields Check

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Hourly Extraneous Fields = null

if (Current DHV Method <> " AE" OR (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor Oil > 0 AND App E
Constant Fuel Mix == false)

if (Current DHV Record.ScgmcntNumbcr is not null)

append " SegmentNumber" to Hourly Extraneous Fields

if {Current DHVRecw "LME")

if (Current DHV Record.FuelCode is not null)

append "FuelCode" to Hourly Extraneous Fields

if (Hourly Extraneous Fields is not null),
return result A

Results:

Result	Response	Severity

A	You reported [fieldnames] in the DHV record for [param]. This data should be	Non-Critical Error

append "OperatingConditionCode" to Hourly Extraneous Fields

blank.

Usage:

Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 413 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-37

Check Name:

Calculate Heat Input for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

HIT Calculated Adjusted Value = null

If (Derived Hourly Mode Status == true)

if (LME HI Method is equal to "MHHI" OR Current DH V Record MODC Code = "45")

Locate all Monitor Default records for the hour and location where the ParameterCode is equal to "MHHI".

If (one record is found, AND Monitor Default. Dcfaul t Vallie is greater than 0, AND Monitor
Z)e/awft.DefaultUnitsOfMeasureCode is equal to "MMBTUHR")

If i Current Hourly Op Record. O^TimQ is greater than 0 and less than or equal to 1)

Calculate HIT Calculated Adjusted Value = DefaultValue * Current Hourly Op Record. OpTime,
rounded to one decimal place.

else

return result A

else if (LME HI Method is equal to "LTFF")

If (LME CP Total Heat Input is greater than or equal to 0, AND LME Total Heat Input Array for the location is
greater than or equal to 0, AND Current Hourly Op Record.HourLoad is greater than or equal to 0, AND Current
Hourly Op7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

If (LME Total Load is greater than 0)

If (HourLoad is equal to 0)

Set HIT Calculated Adjusted Value = 0

else

Calculate HIT Calculated Adjusted Value = ({LME CP Total Heat Input -
LME CP April Heat Input) * Current Hourly Op Record. HourLoad *
Current Hourly Op Record	/ (LME Total Load - LME April

Load)) + ((LME Total Heat Input Array for the location - LME April Heat
Input Array for the location) * Current Hourly Op Record. HowLoaA *
Current Hourly Op Record. Op Time / (LME Total Load Array for the
location - LME April Load Array for the location)), and round the result to 1
decimal place.

else if (LME Total Optime is greater than 0)

Calculate HIT Calculated Adjusted Value = ((LME CP Total Heat Input - LME
CP April Heat Input) * Current Hourly Op Record. OpTime / (LME Total Optime -
LME April Optime)) + ({LME Total Heat Input Array for the location - LME April
Heat Input Array for the location) * Current Hourly Op Record. OpTime / (LME
Total OpTime Array for the location - LME April OpTime Array for the location)),
and round the result to 1 decimal place.

Calculate HIT Calculated Adjusted Value = (LME CP Total Heat Input * Current
Hourly Op	HourLoad * Current Hourly Op Record. OpTime / LME Total

Load) + (LME Total Heat Input Array for the location * Current Hourly Op
Record. HourLoad * Current Hourly Op Record. OpTime I LME Total Load Array

for the location), and round the result to 1 decimal place.

else if (LME Total Optime is greater than 0)

Calculate HIT Calculated Adjusted Value = (LME CP Total Heat Input * Current Hourly
Op Record. OpTime / LME Total Optime) + (LME Total Heat Input Array for the location *
Current Hourly Op Record. OpTime / LME Total OpTime Array for the location), and
round the result to 1 decimal place.

Otherwise,

If (LME Total Load is greater than 0)

If (HourLoad is equal to 0)

Set HIT Calculated Adjusted Value = 0

else

Results:

Result
A

Response

You did not report a single, active, valid default record for MHHI in your

monitoring plan.

This check result is obsolete.

Severity

Critical Error Level 1

B

Critical Error Level 1

Environmental Protection Agency

Page 415 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 416 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-38

Check Name:	Check Reported Heat Input for LME Unit

Related Former Checks:

Applicability:	LME Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

If (Current I)HVRecord AdjustcdHourly Value is null or is less than 0)

Rpt Period HI Reported Accumulator Array for this location = -1
return result A

else if (Current DHVRecordA&iusiQdRomlyVahxQ is not rounded to one decimal place)

Rpt Period HI Reported Accumulator Array for this location = -1
return result C

else

if (Current Month is not April OR LME Annual == true)

if (Rpt Period HI Reported Accumulator Array for this location is not null)
if (Rpt Period HI Reported Accumulator Array >= 0)

Rpt Period HI Reported Accumulator Array for this location = Rpt Period HI Reported
Accumulator Array for this location + Current DHV 7?ecw Heat Input
Tolerance)

return result B.

Environmental Protection Agency

Page 417 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

Usage:

Response

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 418 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-39

Check Name:

Calculate S02 Mass for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

S02M Calculated Adjusted Value = null

If Current DH V Record Fucl Code is null,

Rpt Period S02 Mass Calculated Accumulator Array fox this location = -1
return result A.

Otherwise,

Locate MonitorDefault record for the hour and location where ParameterCd = "S02R", DefaultPurposeCd = "LM", and
FuelCode is equal to Current DHVRecord.FuelCode.

If not found, or if more than one record is found, or if DefaultValue is less than or equal to 0, or DefaultValueUnitsOfMeasure
is not equal to "LBMMBTU".

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result B.

S02R Default Value = Mon itorDefau It.Dc fa ill t V a 1 lie

Locate MonitorDefault record for the hour and location where ParameterCd = "S02R", DefaultPurposeCd = "LM",
FuelCode is in LME Fuel Code List, FuelCode is not equal to Current DHV Record.FuelCode, Default Value is
greater than S02R Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".

If found,

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result C.

Otherwise,

If HIT Calculated Adjusted Value is null,

Rpt Period S02 Mass Calculated Accumulator Array fox this location = -1
return result D.

else

Calculate S02M Calculated Adjusted Value = HIT Calculated Adjusted Value * S02R Default
Value, and round the result to one decimal place.

Otherwise,

if (Rpt Period S02 Mass Calculated Accumulator Array for this location is not null)

if (Rpt Period S02 Mass Calculated Accumulator Array for this location >= 0)

Rpt Period S02 Mass Calculated Accumulator Array fox this location = RptPeriod
S02 Mass Calculated Accumulator Array for this location + S02M Calculated
Adjusted Value

else

RptPeriod S02 Mass Calculated Accumulator Array fox this location = SO2 Mass
Calculated Adjusted Value

Environmental Protection Agency

Page 419 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

Response

The AdjustedHourly Value in the DHV record for [param] could not be recalculated,
because you did not report a FuelCode in this record.

You have not reported one and only one active Monitor Default record with a valid
ParameterCode and DefaultPurposeCode in your monitoring plan to report the
default emission rate for the fuel. The AdjustedHourly Value in the DHV for
[param] could not be recalculated.

You reported [Fuel] as the FuelCode in the DHV record for [param], but, according
to the Monitor Default records in your monitoring plan, this fuel does not have the
highest default emissions rate of the fuels combusted during the hour. The
AdjustedHourly Value could not be recalculated.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 420 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-40

Check Name:	Determine Fuels Burned for LME Unit

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

LME Fuel Code List = null

If (HIT Calculated Adjusted Value is not null)

Locate all DerivedHourlyValue records for the location and hour where ParameterCode in set {S02M, C02M, NOXM}

For each record found,

Append DerivedHourly Value Fucl Code to LME Fuel Code List.

if (Current Month is not April OR LME Annual == true)

if (Rpt Period HI Calculated Accumulator Array for this location is not null)

if (Rpt Period HI Calculated Accumulator Array for this location >= 0)

Rpt Period HI Calculated Accumulator Array fox this location = Rpt Period HI Calculated
Accumulator Array for this location + HIT Calculated Adjusted Value

else

Rpt Period HI Calculated Accumulator Array for this location = HIT Calculated Adjusted Value

if (Current Month is April)

if (April HI Calculated Accumulator Array for this location is not null)

April HI Calculated Accumulator Array for this location = April HI Calculated Accumulator
Array fox this location + HIT Calculated Adjusted Value

else

April HI Calculated Accumulator Array for this location = HIT Calculated Adjusted Value

else

if (Current Month is not April OR LME Annual == true)

Rpt Period HI Calculated Accumulator Array for this location = -1

return result A

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for HIT could not be recalculated due Informational Message

to another error listed in this report.

Usage:

1	Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 421 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-41

Check Name:

Check Reported S02M for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

If (Current I)HVRecord AdjustcdHourly Value is null or is less than 0)

Rpt Period S02 Mass Reported Accumulator Array for this location = -1
return result A

else if (Current DHVRecordA&iusiQdRomlyVahxQ is not rounded to one decimal place)
Rpt Period S02 Reported Accumulator Array for this location = -1
return result C

else

if (Rpt Period S02 Mass Reported Accumulator Array for this location is not null)

if (Rpt Period S02 Mass Reported Accumulator Array >=0)

Rpt Period S02 Mass Reported Accumulator Array for this location = Rpt Period S02 Mass Reported
Accumulator Array for this location + Current I)HV Record Adj ustcdHourly V al lie

Rpt Period S02 Mass Reported Accumulator Array for this location = Current DHV	AdjustedHourly Value

If (S02M Calculated Adjusted Value is not null AND Current DHV	AdjustedHourly Value is not equal to S02M

Calculated Adjusted Value)

S02 Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02M" AND
UOM = "LB"

if (ABS(Current DHV	AdjustedHourly Value - S02M Calculated Adjusted Value) > S02 Mass Tolerance)

return result B

else

Results:

Result
A

Response

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Environmental Protection Agency

Page 422 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 423 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-42

Check Name:

Calculate C02 Mass for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

C02M Calculated Adjusted Value = null

If Current DH V Record Fucl Code is null,

Rpt Period C02 Mass Calculated Accumulator Array fox this location = -1
return result A.

Otherwise,

Locate MonitorDefault record for the hour and location where ParameterCd = "C02R", DefaultPurposeCd = "LM", and
FuelCode is equal to Current DHVRecord.FuelCode.

If not found, or if more than one record is found, or if DefaultValue is less than or equal to 0, or DefaultValueUnitsOfMeasure
is not equal to "TNMMBTU".

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result B.

C02R Default Value = MonitorDefault Dc faul t Val lie

Locate MonitorDefault record for the hour and location where ParameterCd = "C02R", DefaultPurposeCd = "LM",
FuelCode is in LME Fuel Code List, FuelCode is not equal to Current DHV Record.FuelCode, Default Value is
greater than C02R Default Value, and DefaultValueUnitsOfMeasure is equal to "TNMMBTU".

If found,

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result C.

Otherwise,

If HIT Calculated Adjusted Value is null,

Rpt Period C02 Mass Calculated Accumulator Array fox this location = -1
return result D.

else

Calculate C02M Calculated Adjusted Value = HIT Calculated Adjusted Value * C02R Default
Value, and round the result to one decimal place.

Otherwise,

if (Rpt Period C02 Mass Calculated Accumulator Array fox this location is not null)

if (Rpt Period C02 Mass Calculated Accumulator Array fox this location >= 0)

Rpt Period C02 Mass Calculated Accumulator Array for this location = Rpt
Period C02 Mass Calculated Accumulator Array for this location + C02M
Calculated Adjusted Value

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = CO 2 Mass

Calculated Adjusted Value

Environmental Protection Agency

Page 424 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

Response

The AdjustedHourly Value in the DHV record for [param] could not be recalculated,
because you did not report a FuelCode in this record.

You have not reported one and only one active Monitor Default record with a valid
ParameterCode and DefaultPurposeCode in your monitoring plan to report the
default emission rate for the fuel. The AdjustedHourly Value in the DHV for
[param] could not be recalculated.

You reported [Fuel] as the FuelCode in the DHV record for [param], but, according
to the Monitor Default records in your monitoring plan, this fuel does not have the
highest default emissions rate of the fuels combusted during the hour. The
AdjustedHourly Value could not be recalculated.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 425 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-43

Check Name:

Check Reported C02M for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

If (Current I)HVRecord AdjustcdHourly Value is null or is less than 0)

Rpt Period C02 Mass Reported Accumulator Array for this location = -1
return result A

else if (Current DHVRecordA&iusiQdRomlyVahxQ is not rounded to one decimal place)
Rpt Period C02 Reported Accumulator Array for this location = -1
return result C

else

if (Rpt Period C02 Mass Reported Accumulator Array for this location is not null)

if (Rpt Period C02 Mass Reported Accumulator Array >= 0)

Rpt Period C02 Mass Reported Accumulator Array for this location = Rpt Period C02 Mass Reported
Accumulator Array for this location + Current I)HV Record Adj ustcdHourly Value

Rpt Period C02 Mass Reported Accumulator Array for this location = Current	AdjustedHourly Value

If (C02M Calculated Adjusted Value is not null AND Current DHV 7?ecw C02 Mass Tolerance)
return result B

else

Results:

Result
A

Response

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Environmental Protection Agency

Page 426 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 427 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURDHV-44

Check Name:

Calculate NOX Mass for LME Unit

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

NOXM Calculated Adjusted Value = null
UDEFStatus = null.

UDEFExpirationDate = null.

If Current DH V Record Fucl Code is null,

if {Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1

return result A

Default Condition = null

If Current /)//17 /?£?cwy/.OperatingConditionCode is null,

Default Condition = "A"

else if Current DHVRecord. OperatingConditionCode in set {C, U, P, B}

Default Condition = Current DHV Record. OperatingConditionCode

If Default Condition is null,

if {Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array fox this location = -1

return result B

if {Current DHV Record. OperatingConditionCode is equal to "U")

Locate MonitorDefault record for the hour and location where ParameterCd = "NORX", DefaultPurposeCd =
"MD", OperatingConditionCode is equal to Default Condition, and FuelCode is equal to Current DHV
Record. FuelCode.

Locate MonitorDefault record for the hour and location where ParameterCd = "NOXR", DefaultPurposeCd =
"LM", OperatingConditionCode is equal to Default Condition, and FuelCode is equal to Current DHV
Record. FuelCode.

If not found, or if more than one record is found, or if Default Value is less than or equal to 0, or
DefaultValueUnitsOfMeasure is not equal to "LBMMBTU".

if {Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1

Otherwise,

else

else

return result C

Environmental Protection Agency

Page 428 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

NOXR Default Value = Monitor Default Dc faul t V al lie

if (Default Condition is in set {A,C,B,P} AND Monitor Default Dc fa ill t So urce C ode == "TEST")

if (MonitorDefault.Group ID is null)

if (Default Condition == "A" or "C")

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHVRecord.FuelCode and EndDate/EndHour is on or
before the CurrentOperatingDate/Hour.

else if (Default Condition == "B")

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHV Record. FuelCode, OperatingConditionCode == "A"
or "B", and EndDate/EndHour is on or before the CurrentOperatingDate/Hour.

else if (Default Condition == "P")

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHV Record. FuelCode, OperatingConditionCode == "A"
or "P", and EndDate/EndHour is on or before the CurrentOperatingDate/Hour.

If not found,

UDEFStatus = "MISSING"

else

UDEFStatus = "FOUND"

Set UDEFExpiration Date to 5 years after the end of the quarter of the
UnitDefaultTestRecordsByLocationForQAStatusEndD&tQ.

Otherwise,

UDEFStatus = "GROUP"

Set UDEFExpiration Date to 5 years after the end of the quarter of the
Mon itorDefau /?. B e g i n D a te.

if (Current DHV Record. OperatingConditionCode is equal to "U")

Locate MonitorDefault record for the hour and location where ParameterCd = "NORX",
DefaultPurposeCd = "MD", OperatingConditionCode is equal to Default Condition, FuelCode is in
LME Fuel Code List, FuelCode is not equal to Current DHV Record FuclCodc. Default Value is
greater than NOXR Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".

else

Locate MonitorDefault record for the hour and location where ParameterCd = "NOXR",
DefaultPurposeCd = "LM", OperatingConditionCode is equal to Default Condition, FuelCode is in
LME Fuel Code List, FuelCode is not equal to Current DHV Record FuclCodc. Default Value is
greater than NOXR Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".

If found,

Environmental Protection Agency

Page 429 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (Current Month is not April OR LMEAnnual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1

return result D

Otherwise,

If HIT Calculated Adjusted Value is null,

if (Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1

return result E

else

Calculate NOXM Calculated Adjusted Value = HIT Calculated Adjusted Value * NOXR
Default Value, and round the result to one decimal place.

if (Current Month is not April OR LME Annual == true)

if (Rpt Period NOx Mass Calculated Accumulator Array for this location is not
null)

if (Rpt Period NOx Mass Calculated Accumulator Array for this location

>= 0)

Rpt Period NOx Mass Calculated Accumulator Array for this
location = Rpt Period NOx Mass Calculated Accumulator Array
for this location + NOXM Calculated Adjusted Value

else

Rpt Period NOx Mass Calculated Accumulator Array for this location =
NOx Mass Calculated Adjusted Value

if (Current Month is April)

if (April NOx Mass Calculated Accumulator Array for this location is not
null)

April NOx Mass Calculated Accumulator Array for this location =
April NOx Mass Calculated Accumulator Array for this location +
NOXM Calculated Adjusted Value

else

April NOx Mass Calculated Accumulator Array fox this location =
NOXM Calculated Adjusted Value

Environmental Protection Agency

Page 430 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

Usage:

1

Response

The AdjustedHourly Value in the DHV record for [param] could not be recalculated,
because you did not report a FuelCode in this record.

You reported an invalid OperatingConditionCode in the DHV record for [param].
The AdjustedHourly Value could not be recalculated.

You have not reported one and only one active Monitor Default record with a valid
ParameterCode, DefaultPurposeCode, and OperatingConditionCode in your
monitoring plan to report the default emission rate for the fuel. The
AdjustedHourly Value in the DHV for [param] could not be recalculated.
You reported [Fuel] as the FuelCode in the DHV record for [param], but, according
to the Monitor Default records in your monitoring plan, this fuel does not have the
highest default emissions rate of the fuels combusted during the hour. The
AdjustedHourly Value could not be recalculated.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Informational Message

Process/Category:

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 431 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-45

Check Name:	Check Reported NOXM for LME Unit

Related Former Checks:

Applicability:	LME Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

If (Current I)HVRecord AdjustcdHourly Value is null or is less than 0)

Rpt Period NOx Mass Reported Accumulator Array for this location = -1
return result A

else if (Current DHVRecordA&iusiQdRomlyVahxQ is not rounded to one decimal place)

Rpt Period NOx Mass Reported Accumulator Array for this location = -1
return result C

else

if (Current Month is not April OR LME Annual == true)

if (Rpt Period NOx Mass Reported Accumulator Array for this location is not null)
if (Rpt Period NOx Mass Reported Accumulator Array >= 0)

Rpt Period NOx Mass Reported Accumulator Array for this location = Rpt Period NOx Mass
Reported Accumulator Array for this location + Current I) HV Record Adj ustcdHourly Value

else

Rpt Period NOx Mass Reported Accumulator Array for this location = CurrentDHV
Record. Adj ustedHourly Value

If (NOXM Calculated Adjusted Value is not null AND Current I)H V Record Ad j ustcdHourly Val lie is not equal to NOXM
Calculated Adjusted Value)

NOX Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOXM" AND
UOM = "LB"

if (ABS( Current A>//K/?e6Wf/. AdjustedHourly Value - NOXM Calculated Adjusted Value) > NOX Mass Tolerance)
return result B

Results:

Result
A

B

C

Response

The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

The AdjustedHourly Value reported in the DHV record for [param] is inconsistent
with the recalculated value.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 432 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 433 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-46

Check Name:	Equation Code Consistent with Moisture Basis

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 434 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURDHV-47

Check Name:	Unit Default Test Expiration Check

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

If UDEF Status is not null,

If {UDEFStatus == "MISSING")
return result A.

else if {UDEF Status == "FOUND")

if {Current Operating Date is after the UDEF Expiration Date)
return result B.

else

Append CurrentDHV. F ucl Code to the LME Fuel Array for the location.

else if {UDEF Status == "GROUP")

if {Current Operating Date is after the UDEF Expiration Date)

return result C.

Results:

Result

A

B

Response

You did not report an applicable prior LME Unit Default Test for Fuel Code [FUEL],
The applicable prior LME Unit Default Test for Fuel Code [FUEL] has expired. You
need to use a Part 75 default NOx emissions rate until you perform a new
unit-and-fuel-specific default test. You will need to put an end date on your
existing NOXR default records in your monitoring plan, and add a new NOXR
default record based on the Part 75 default value.

Warning: Based on the BeginDate in your NOXR Default record in your monitoring
plan, the LME Unit Default Test(s) that established the default NOx emission rate
for Fuel Code [FUEL] may have expired. Unit Default Tests must be performed
every five years. If your test has expired, you need to use a Part 75 default NOx
emissions rate until you perform a new unit-and-fuel-specific default test. You will
need to put an end date on your existing NOXR default records in your monitoring
plan, and add a new NOXR default record based on the Part 75 default value.

Severity

Critical Error Level 1
Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 435 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly General

Environmental Protection Agency

Page 436 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-1

Check Name:

Initialize Accumulators for Summary Value Data

Related Former Checks: HOUROP-27

Applicability:

General Check

Description:

Specifications:

For each location in Monitoring Plan, initialize arrays with size Current Location Count
Rpt Period C02 Mass Reported Accumulator Array for the location = 0
Rpt Period C02 Mass Calculated Accumulator Array for the location = 0
Expected Summary Value C02 Array fox the location = false

Rpt Period HI Reported Accumulator Array for the location =0
Rpt Period HI Calculated Accumulator Array for the location = 0
Expected Summary Value HI Array for the location = false

Rpt Period NOx Rate Reported Accumulator Array for the location = 0
Rpt Period NOx Rate Calculated Accumulator Array for the location = 0
Rpt Period NOx Rate Hours Accumulator Array for the location = 0
Expected Summary Value NOx Array for the location = false

Rpt Period S02 Mass Reported Accumulator Array for the location = 0
Rpt Period S02 Mass Calculated Accumulator Array for the location = 0
Expected Summary Value S02 Array for the location = false

Rpt Period NOx Mass Reported Accumulator Array for the location = 0
Rpt Period NOx Mass Calculated Accumulator Array for the location = 0
Expected Summary Value NOx Mass Array for the location = false

Rpt Period Op Time Accumulator Array for the location = 0
Rpt Period Op Hours Accumulator Array for the location = 0
Rpt Period Op Days Accumulator Array for the location = 0
Rpt Period Load Accumulator Array for the location = 0

Daily Op Time Accumulator Array for this location = 0

April HI Calculated Accumulator Array for the location = 0
April NOx Mass Calculated Accumulator Array for the location = 0
April Op Time Accumulator Array for the location = 0
April Op Hours Accumulator Array for the location = 0
April Op Days Accumulator Array for the location = 0

LME Total Load Array for the location = 0
LME April Load Array for the location = 0
LME Total Heat Input Array for the location = 0
LME April Heat Input Array for the location = 0
LME Total OpTime Array for the location = 0
LME April OpTime Array for the location = 0

Last Day of Operation Array for the location = null
First Day of Operation = null

Environmental Protection Agency

Page 437 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

First Hour of Operation = null

FLOW System ID Array for the location = null
NOXE System ID Array for the location = null
LME Fuel Array for the location = null

Count the number of unique location + FuelCode in the Hourly Fuel Flow records for the monitoring configuration and reporting
period. Initialize an array with this number of elements:

Fuel Op Hours Accumulator Array for the location and FuelCode = 0

Initialize F2LStatusSystemResultDictionary as a dictionary with both a string key and lookup value
Initialize F2LStatusSystemCheckDictionary as a dictionary with a string key and a data row value
Initialize F2LStatusSystemMissingOpDictionary as a dictionary with both a string key and lookup value

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 438 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-2

Check Name:

Reporting Period Details

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Abort Hourly Checks = false
Legacy Data Evaluation = false
LME HI Method = null
LME HI Substitute Data Code = null
Annual Reporting Requirement = false
OS Reporting Requirement = false
LME Annual = false
LME OS = false

Reported Emissions Value = null
Multiple Stack Configuration = false
Ignored Daily Calibration Tests = false
Ignored Daily Interference Tests = false

if ({Current Reporting Period < Current Monitoring Plan 7?ecw
-------
Draft ECMPS Emissions Check Specifications

Abort Hourly Checks = true
return result B

3/7/2012 12:00:00AM

If (Abort Hourly Checks == false)

If (the associated First ECMPS Reporting Period for the monitoring plan is null)

If Current Reporting Period is on or prior to 2008)

Legacy Data Evaluation = true

Else

If Current Reporting Period is prior to the First ECMPS Reporting Period)

Legacy Data Evaluation = true

Locate a Hourly Op Data record for the configuration and reporting period where OperatingTime is greater than 0,

If found,

Reporting Period Operating = true

else,

Reporting Period Operating = false

Locate MonitorMethod record for ANY location in the file where ParameterCode in set {S02M, NOXM, C02M},
MethodCode = "LME"

BeginDate is on or before the first day of the Current Reporting Period, and the EndDate is null or is on or after the last day
of the Current Reporting Period.

If found,

Locate all MonitorQualification records for all units in the monitoring configuration where the
QualificationTypeCode is equal to "LMEA" or "LMES", BeginDate is on or before the last day of the reporting
period, and the EndDate is null or is on or after December 31 of the year prior to the Current Reporting Period.

If a record with QualificationTypeCode equal to "LMEA" is found,
set LME Annual to true.

If a record with QualificationTypeCode equal to "LMES" is found,
set LME OS to true.

If (LME Annual == true and Annual Reporting Requirement == false)
Abort Hourly Checks = true
return result D

else if (LME OS == true and OS Reporting Requirement == false)
Abort Hourly Checks = true
return result E

else if (LME Annual == false and LME OS == false)
Abort Hourly Checks = true
return result F

Otherwise,

Locate MonitorMethod records for all locations in the file where ParameterCode = "HIT", BeginDate is on or
before the first day of the Current Reporting Period, and the EndDate is null or is on or after the last day of
the Current Reporting Period.

Environmental Protection Agency

Page 440 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If not found for any location,

Abort Hourly Checks = true
return result G

If MethodCode = "MHHI" for all locations,

LME HI Method = "MHHI"

If MethodCode in set {LTFF, CALC, LTFCALC} for all locations,

LME HI Method = "LTFF"

If SubstituteDataCode is equal to "MHHI" for any location,

LME HI Substitute Data Code = "MHHI".

Otherwise,

Abort Hourly Checks = true
return result H

If {Abort Hourly Checks == false)

Locate all Unit Program records for all units in the configuration where the UnitMonitorCertBeginDate is on or prior to the
Current Reporting Period and the EndDate is null or is on or after the Current Reporting Period.

If the ProgramCode in all the retrieved Location Program records are only equal to "NBP", "OTC", "NHNOX", or "SIPNOX",

Locate all Unit Operating Status records for all units in the configuration where the Op Status Code is equal to
"RET", the year of the Begin Date is prior to Current Reporting Period, and the End Date is null or is on or after the
last day of the Current Reporting Period.

If found,

return result I

Otherwise,

For each Unit Program record retrieved above where the ProgramCode is not equal to "NBP", "OTC", "NHNOX", or
"SIPNOX",

If Program Code is equal to "CAIROS" and the Current Reporting Period is in the first or second quarter,

Locate a Unit Program Exemption record for the unit program where the Exempt Type is equal to
"RUE", the Exemption Begin Date is on or prior to May 1 of the year of the Current Reporting
Period, and the Exemption End Date is null or is on or after the last day of the Current Reporting
Period.

Otherwise,

Locate a Unit Program Exemption record for the unit program where the Exempt Type is equal to
"RUE", the Exemption Begin Date is on or prior to the first day of the Current Reporting Period, and
the Exemption End Date is null or is on or after the last day of the Current Reporting Period.

If a Unit Program Exemption record was found for all unit programs,
return result I

Environmental Protection Agency

Page 441 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

G
H
I

Usage:

1

Response

The locations in the file do not represent a valid monitoring configuration during
the reporting period. The file will not be evaluated.

The active Reporting Frequency records for this configuration are missing or
invalid. The file will not be evaluated. Please contact ECMPS technical support for
assistance with this matter.

According to the Reporting Frequency records, this monitoring configuration is an
ozone-season-only reporter, however the reporting period is not within the ozone
season. The file will not be evaluated.

You have reported an LME Annual Qualification record in your monitoring plan,
but, according to the Reporting Frequency records, this configuration is not an
annual reporter. The file will not be evaluated.

You have reported an LME Ozone Season Qualification record in your monitoring
plan, but, according to the Unit Program records, this configuration does not report
ozone season totals. The file will not be evaluated.

You have reported an LME method in your monitoring plan for one or more units in
this configuration, but you have not reported an LME qualification record. The file
will not be evaluated.

You did not report an active heat input method for one or more locations in the file.
The file will not be evaluated.

The active heat input methods reported for the locations in the file are inconsistent.
The file will not be evaluated.

This file contains at least one unit that is retired. Please contact EPA if you believe
that all units in this configuration should report emissions data during this
reporting period.

Severity
Fatal

Fatal

Fatal

Fatal

Fatal

Fatal

Fatal
Fatal

Critical Error Level 2

Process/Category:

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 442 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

LME Total Load = 0
LME April Load = 0
LME CP Total Heat Input = 0
LME CP April Heat Input = 0
LME Total Optime = 0
LME April Optime = 0

If (LME HI Method is not null)

If (LME HI Method == "MHHI")

Locate an LTFF record for any location in the monitoring configuration during the reporting period.

If found,

set Abort Hourly Checks to true, and return result A.

else

For each Hourly Op Data record for every unit in the monitoring configuration.

If Hourly Op Data OpTime is not equal to 0 or Hourly Op Data.HourLoad is not null,

If Hourly Op Data HourLoad is greater than or equal to 0 and Hourly Op Data. OpTime is between 0
and 1 (inclusive),

Locate the DerivedHourlyValue record for the unit and the hour where ParameterCode is
equal to "HIT".

If found, AND Derived Hourly Value. M O DC C ode is null,

Add HourLoad * OpTime to LME Total Load Array for the location
Add HourLoad * OpTime to LME Total Load.

Add OpTime to LME Total OpTime Array for the location
Add OpTime to LME Total Optime.

If the month of Hourly Op Data. Date is "April" AND LME OS is equal to true ,
Add HourLoad * OpTime to IME April Load Array for the location
Add HourLoad * OpTime to LME April Load.

Add OpTime to LME April OpTime Array for the location
Add OpTime to LME April Optime.

If not found, AND Hourly Op DafaHourLoad is greater than 0,
set LME Total Load to -1.
exit for.

Otherwise,

set LME Total Load to -1.

HOURGEN-3

Calculate Total Load for LME Configuration for Reporting Period
LME Check

Environmental Protection Agency

Page 443 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

exit for.

If LME Total Load is equal to 0 and LME Total Optime is equal to 0,

Locate an LTFF record for any location in the monitoring configuration during the reporting period.
If found,

set Abort Hourly Checks to true, and return result B.

Results:

Result	Response	Severity

A	You have reported MHHI as the heat input method for this configuration, but you	Fatal

have reported a long-term fuel flow record.

B	You have reported a long-term fuel flow record for this reporting period, but the	Fatal

sum of the load and operating time values in the hourly records (where
MHHIIndicator is not equal to 1) are equal to 0.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 444 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-7

Check Name:

Related Former Checks:

Validate LME Eligibility

Applicability:

Description:

Specifications:

LME Check

If (LME HI Method is not null)

Set LME Exceeding Parameter to null.
Set Final LME Year to false.

For each unit in the monitoring configuration:

If (LME Annual == true)

Locate the latest MonitorQualification record where location is the unit being evaluated, the
QualificationTypeCode is equal to "LMEA", BeginDate is on or before the first day of the Current
Reporting Period, and the EndDate is null or is on or after December 31 of the year prior to the Current
Reporting Period.

If (not found)

return result A.

If (found and the BeginDate of the retrieved qualification record is prior to the Current Reporting Period
Year)

For each year from three years prior to the Current Reporting Period Year until the year prior to the
Current Reporting Year '.

Set AnnualNOx to 0.

Set AnnualS02 to 0.

For quarter 1 until quarter 4:

Locate an Op Supp Data record for the location and quarter/year being checked
where the OpTypeCode = "NOXM".

If (found)

add Op Value to Annual NOx.

Locate an Op Supp Data record for the location and quarter/year being checked
where the OpTypeCode = "S02M".

If (found)

add Op Value to Annual S02.

If (the year being evaluated is the year prior to the Current Reporting Period Year)

If (AnnualNOx is greater than 100 or AnnualS02 is greater than 25)
set Final LME Year to true.

Environmental Protection Agency

Page 445 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else

If {Annual NOx is greater than 100)

append "Annual NOx" to LME Exceeding Parameter.

If {Annual S02 is greater than 25)

append "Annual S02" to LME Exceeding Parameter.

If {LME OS == true)

Locate the latest MonitorQualification record where the location is the unit being evaluated,
QualificationTypeCode is equal to "LMES", BeginDate is on or before the later of the first day of the
Current Reporting Period and May 1 of the year of the Current Reporting Period, and the EndDate is null
or is on or after December 31 of the year prior to the Current Reporting Period.

If (not found)

return result B.

If (found and the BeginDate of the retrieved qualification record is prior to the Current Reporting Period
Year)

For each year from three years prior to the Current Reporting Period Year until the year prior to the
Current Reporting Period Year '.

Set OS NOx to 0.

Locate an Op Supp Data record for the location and quarter 2 of the year being checked
where the OpTypeCode = "NOXMOS".

If found,

add OpValue to OS NOx.

Locate an Op Supp Data record for the location and quarter 3 of the year being checked
where the OpTypeCode = "NOXM".

If found,

add OpValue to OS NOx.

If (the year being evaluated is the year prior to the Current Reporting Period Year)

If (OS NOx is greater than 50)

set Final LME Year to true.

Else

If (OS NOx is greater than 50)

append "Ozone Season NOx" to LME Exceeding Parameter.

if (LME Exceeding Parameter is not null)
return result C.

else if (Final LME Year == true)
return result D.

Environmental Protection Agency

Page 446 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

Response

You have reported an active LMEA qualification record for this configuration in
your monitoring plan, but you have not reported an active LMEA qualification
record for at least one unit in the configuration.

You have reported an active LMES qualification record for this configuration in
your monitoring plan, but you have not reported an active LMES qualification
record for at least one unit in the configuration.

You have reported that this configuration has an active LME qualification, but this
configuration is no longer eligible to qualify for an LME methodology, because at
least one unit in the configuration has exceeded the eligibility limit for [param] in a
prior year.

The emissions from at least one unit in this configuration exceeded the applicable
number of tons necessary to qualify as an LME unit in the previous reporting year.
According to Part 75.19(b), you must install the appropriate monitoring systems by
December 31 of this reporting year.

Severity
Fatal

Fatal

Critical Error Level 2

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 447 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-8

Check Name:

Monitor Plan Evaluation Check

Related Former Checks:

Applicability:

General Check

Description:

Specifications:

Set MpSuccessfullyEvaluated = false.

If the SeverityLevelCd of the monitoring plan record for this configuration is equal to "CRIT1" or "FATAL",
return result A.

Otherwise,

If the NeedsEvalFlag and MustSubmitFlag of the monitoring plan record for this configuration are equal to " Y",

return result B.

Otherwise,

Set MpSuccessfullyEvaluated = true.

Results:

Result
A

Response

The Monitoring Plan associated with this quarterly emissions file has critical errors.
You must correct the Monitoring Plan for this monitoring configuration in order to
submit this emissions file to be loaded on EPA's host system.

The Monitoring Plan associated with this quarterly emissions file has not been
evaluated. You must evaluate the Monitoring Plan for this monitoring
configuration in order to complete the evaluation of this emissions file.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 448 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURGEN-9

Check Name:	QA/Cert Test Evaluation Check

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Locate any Q A/Cert Test record for the monitoring configuration where the EndDate is on or before the last day of the Current
Reporting Period, MustSubmitFlag is equal to 'Y' or CanSubmitFlag and UpdatedStatusFlag are equal to " Y", and the SeverityCd is
equal to "CRIT1" or "FATAL".

If found,

return result A.

Otherwise,

Locate any Q A/Cert Test record for the monitoring configuration where the EndDate is on or before the last day of the
Current Reporting Period, MustSubmitFlag is equal to 'Y' or CanSubmitFlag and UpdatedStatusFlag are equal to "Y", and
the NeedsEvalFlag are equal to "Y".

If found,

return result B.

Otherwise,

Locate any QA Supp Data record for the monitoring configuration without any associated Test Summary record
where the EndDate is on or before the last day of the Current Reporting Period and MustSubmitFlag is equal to 'Y'.

If found,

return result C.

Results:

Result
A

B

Response

At least one QA/certification test associated with this monitoring configuration
has critical errors. You must correct all prior or concurrent QA/certification tests in
order to submit this quarterly emissions file to be loaded on EPA's host system.
At least one QA/certification test associated with this monitoring configuration
has not been evaluated. You must evaluate all prior or concurrent QA/certification
tests in order to complete the evaluation of this quarterly emissions file.
The emissions quarterly reported cannot be submitted, because EPA has required
the resubmission of a QA/certification test that is not present in the Client Tool.
Please review the Submission Access report for more information about what
needs to be submitted.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 449 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-10

Check Name:

QA/Cert Event Evaluation Check

Related Former Checks:

Applicability:

General Check

Description:

Specifications:

Locate any QA/Certification Event record for the monitoring configuration where the QACertEventDate is on or before the last day
of the Current Reporting Period, the MustSubmitFlag is equal to "Y", and the Severity Cd is equal to "CRIT1" or "FATAL".

If found,

return result A.

Otherwise,

Locate any QA/Certification Event record for the monitoring configuration where the QACertEventDate is on or before the
last day of the Current Reporting Period and the MustSubmitFlag and NeedsEvalFlag are equal to " Y".

If found,

return result B.

Results:

Result
A

Response

At least one QA/certification event associated with this monitoring configuration
has critical errors. You must correct all prior or concurrent QA/certification events
in order to submit this quarterly emissions file to be loaded on EPA's host system.
At least one QA/certification event associated with this monitoring configuration
has not been evaluated. You must evaluate all prior or concurrent QA/certification
event in order to complete the evaluation of this quarterly emissions file.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 450 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-11

Check Name:

Related Former Checks:

Test Extension/Exemption Evaluation Check

Applicability:

Description:

Specifications:

General Check

Locate any Test Extension/Exemption record for the monitoring configuration where the ReportingPeriod is on or before the Current
Reporting Period, the MustSubmitFlag is equal to "Y", and the SeverityCd is equal to "CRIT1" or "FATAL".

If found,

return result A.

Otherwise,

Locate any Test Extension/Exemption record for the monitoring configuration where the ReportingPeriod is on or before the
Current Reporting Period and the MustSubmitFlag and NeedsEvalFlag are equal to " Y".

If found,

return result B.

Results:

Result
A

Response

At least one test extension/exemption associated with this monitoring
configuration has critical errors. You must correct all prior or concurrent test
extension/exemption records in order to submit this quarterly emissions file to be
loaded on EPA's host system.

At least one test extension/exemption associated with this monitoring
configuration has not been evaluated. You must evaluate all prior or concurrent
test extension/exemption records in order to complete the evaluation of this
quarterly emissions file.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 451 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURGEN-12

Check Name:	Prior Emissions File Evaluation Check

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Locate any Emissions File for any location in the current monitoring configuration where the ReportingPeriod is prior to the Current
Reporting Period, and either the Submission Availability Code = 'CRITERR' or (CAN_SUBMIT = ' Y' and SeverityCd is equal to
"CRIT1" or "FATAL").

If found,

return result A.

Otherwise,

Locate any Emissions File for any location in the current monitoring configuration where CAN_SUBMIT = 'Y', the
ReportingPeriod is prior to the Current Reporting Period, and the NeedsEvalFlag is equal to " Y".

If found,

return result B.

If not found,

Locate any Emissions File for any location in the current monitoring configuration where the ReportingPeriod is prior
to the Current Reporting Period, and either the Submission Availability Code = 'NOTSUB' or (CAN_SUBMIT = ' Y'
and UpdatedStatusFlag = 'NOD AT A').

If found,

return result C.

Results:

Result
A

B

Response

At least one prior quarterly emissions file for at least one location in this
monitoring configuration has critical errors. You must correct all prior quarterly
emissions files in order to submit this quarterly emissions file to be loaded on
EPA's host system.

At least one prior quarterly emissions file for at least one location in this
monitoring configuration has not been evaluated. You must evaluate all prior
quarterly emissions files in order to complete the evaluation for this quarterly
emissions file.

At least one prior quarterly emissions file for at least one location in this
monitoring configuration has not been submitted and has been authorized for
resubmission. You must submit all prior quarterly emissions files in order to submit
this quarterly emissions file to be loaded on EPA's host system.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 452 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-13

Check Name:

Determine If File Can Be Submitted

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Locate the Emission Submission Access record for the configuration and reporting period.

If not found, or the Submission Availability Code is null,
return result A.

else if the Submission Availability Code is not equal to "GRANTED" or "REQUIRE",
return result B.

Results:

Result
A

Response

The emissions quarterly report cannot be submitted, either because the EPA has
not yet opened the submission window, you have not logged into the EPA host
system, or you are no longer a representative or agent for this facility. If you are a
representative or agent for this facility, when EPA opens the submission window
you should log in to the EPA host system to receive automatic permission to
submit. You will then need to reevaluate this file prior to submitting.

The emissions quarterly report cannot be resubmitted until you contact the EPA
for permission. After the EPA grants permission, you will need to log in to the EPA
host system to retrieve the permission record. You will then need to reevaluate this
file prior to submitting.

Severity

Informational Message

B

Informational Message

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 453 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURGEN-14

Check Name:	Ignored Offline Daily Calibration Check

Related Former Checks:

Applicability:

Description:

Specifications:

If (Ignored Daily Calibration Tests == true)

set Ignored Daily Calibration Tests to false
return result A.

Results:

Result	Response	Severity

A	You reported one or more daily calibration tests that will not fulfill your daily	Informational Message

calibration testing requirement, because these tests were performed while the unit
was not operating and you have not reported a prior online-offline calibration
demonstration. These tests have been assigned a CalculatedTestResult of
"IGNORED", and they can be viewed on the Daily Calibration tab of the View
Detailed Emissions Screen. If you intend to use offline tests to fulfill your daily
calibration testing requirement, you must conduct an online-offline calibration
demonstration.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 454 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-15

Check Name:

Expiring Test Check

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Set Expired Systems and Expiring Systems to null.

Set Expiration Text to "have expired"

If FLOW System ID Array for the location is not null,

For each SystemID in the FLOW System ID Array for the location:

Locate the latest RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
SystemID being checked and the number of operating levels the OpLevelCodeList is equal to 3,

If found,

Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecordsByL ocationFor QAStatus. EndD ate.

If ExpirationDate is prior to the current calendar date,

Append the Systemldentifier being checked to Expired Systems.

else if ExpirationDate is on or before the last day of the Current Reporting Period,

Set Expiration Text to "will be expiring at the end of the reporting period".

Append the Systemldenitifier being checked to Expired Systems.

else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the Systemldentifier being checked to Expiring Systems.

If both Expired Systems and Expiring Systems are not null,

return result A
else if Expired Systems is not null,

return result B
else if Expiring Systems is not null,
return result C

else if NOXE System ID Array for the location is not null,

For each SystemID in the NOXE System ID Array for the location:

Locate the latest AppendixETestRecordsByLocationForQAStatusfor the location where the SystemID is equal to
the SystemID being checked,

If found,

Set ExpirationDate to five years after the end of the quarter of the
AppendixE TestRecordsByL ocationFor QAStatus. EndD ate.

If ExpirationDate is prior to the current calendar date,

Append the Systemldentifier being checked to Expired Systems.

Environmental Protection Agency

Page 455 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if ExpirationDate is on or before the last day of the Current Reporting Period,

Set Expiration Text to "will be expiring at the end of the reporting period".

Append the Systemldentifier being checked to Expired Systems.

else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the Systemldentifier being checked to Expiring Systems.

If both Expired Systems and Expiring Systems are not null,

return result D
else if Expired Systems is not null,

return result E
else if Expiring Systems is not null,
return result F

else if LME Fuel Array for the location is not null,

For each FuelCode in the LME Fuel Array for the location:

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location where the FuelCode is equal to
the FuelCode being checked,

If found,

Set ExpirationDate to five years after the end of the quarter of the
UnitDefaultTestRecordsIiy Location ForQAStatusYL\vlD'A[c

If ExpirationDate is prior to the current calendar date,

Append the FuelCode being checked to Expired Systems.

else if ExpirationDate is on or before the last day of the Current Reporting Period,

Set Expiration Text to "will be expiring at the end of the reporting period".

Append the FuelCode being checked to Expired Systems.

else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the FuelCode being checked to Expiring Systems.

If both Expired Systems and Expiring Systems are not null,

return result G
else if Expired Systems is not null,

return result H
else if Expiring Systems is not null,
return result I

Environmental Protection Agency

Page 456 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

H

Response

Warning: The three-level RATA conducted for each of the following monitoring
systems [TEXT]: System ID(s) [EXPIRED], Except for a 720 operating-hour grace
period extension, you will need monitor stack flow with another FLOW system or
report substitute data until you perform another three-level RATA. In addition, the
three-level RATA conducted for each of the following monitoring systems will
expire at the end of the next reporting period: System ID(s) [EXPIRING].
Three-level RAT As expire after five years.

Warning: The three-level RATA conducted for each of the following monitoring
systems [TEXT]: System ID(s) [EXPIRED], Except for a 720 operating-hour grace
period extension, you will need monitor stack flow with another FLOW system or
report substitute data until you perform another three-level RATA. Three-level
RAT As expire after five years.

Prior Notice: The three-level RATA conducted for each of the following
monitoring systems will expire at the end of the next reporting period: System ID(s)
[EXPIRING]. Three-level RAT As expire after five years.

Warning: The Appendix E test conducted to determine the NOx correlation curve
for each of the following monitoring systems [TEXT]: System ID(s) [EXPIRED], In
subsequent reporting periods, you will need report substitute data until you
perform another Appendix E test. In addition, the Appendix E test conducted for
each of the following monitoring systems will expire at the end of the next reporting
period: System ID(s) [EXPIRING]. Appendix E tests expire after five years.
Warning: The Appendix E test conducted to determine the NOx correlation curve
for each of the following monitoring systems [TEXT]: System ID(s) [EXPIRED], In
subsequent reporting periods, you will need report substitute data until you
perform another Appendix E test. Appendix E tests expire after five years.

Prior Notice: The Appendix E test conducted to determine the NOx correlation
curve for each of the following monitoring systems will expire at the end of the next
reporting period: System ID(s) [EXPIRING]. Appendix E tests expire after five
years.

Warning: The LME Unit Default Test conducted to determine the default NOx
emission rate for each of the following fuels [TEXT]: Fuel Code(s) [EXPIRED], In
subsequent reporting periods, you will need report substitute data until you
perform another Unit Default Test. In addition, the Unit Default Test conducted for
each of the following fuels will expire at the end of the next reporting period: Fuel
Code(s) [EXPIRING]. LME Unit Default Tests expire after five years.

Warning: The LME Unit Default Test conducted to determine the default NOx
emission rate for each of the following fuels [TEXT]: Fuel Code(s) [EXPIRED], In
subsequent reporting periods, you will need report substitute data until you
perform another Unit Default Test. LME Unit Default Tests expire after five years.
Prior Notice: The LME Unit Default Test conducted to determine the default NOx
emission rate for each of the following fuels will expire at the end of the next
reporting period: Fuel Code(s) [EXPIRING]. LME Unit Default Tests expire after
five years.

Severity

Informational Message

Informational Message

Informational Message
Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 457 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURGEN-16

Check Name:	Ignored Offline Daily Interference Check

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (Ignored Daily Interference Tests == true)
return result A.

Results:

Result	Response	Severity

A	You reported one or more daily interference checks that will not fulfill your daily	Informational Message

testing requirement for your stack flow monitors, because these tests were
performed while the unit was not operating. These tests have been assigned a
CalculatedTestResult of "IGNORED". They can be viewed on the Other Daily
Tests tab of the View Detailed Emissions Screen.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 458 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-17

Check Name:

Missing Peaking Qualification Percent Check

Related Former Checks:

Applicability:

General Check

Description:

Specifications:

If Mp Successfully Evaluated equals true,

Set Peeking Qualification Percent Missing List = null.

For each QualificationRecord record in MpOualificationRecords where QualificationTypeCode is equal to "PK" or "SK",
BeginDate is on or before Current Reporting Period End Hour, and EndDate is null or or is on or after Current Reporting
Period Begin Hour.

Locate the record in MpQualificationPercentRecords where MonitorQualificationld is equal to
QualificationRecord.MonitorQualificationld, and QualificationDataYear is equal to CurrentReportingPeriodYear.

If not found,

Add Mp(Quedification Records Location Id to Peeking Qualification Percent Missing List.

If Peeking Qualification Percent Missing List is not null,
return result A.

Results:

Result
A

Response

You did not report a current year peaking qualification percent record.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 459 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-4

Check Name:

Emission Comment Reporting Period Valid

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

For a Emission Comment record:

If ReportingPeriod is null,
return result A.

Results:

Result	Response	Severity

A	You did not provide [fieldname], which is required, for [key].	Fatal

Usage:

Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Environmental Protection Agency

Page 460 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURGEN-5

Check Name:

Submission Comment Valid

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

For the Emission Comment record:

If SubmissionComment is null,
return result A.

Results:

Result	Response	Severity

A	You did not provide [fieldname], which is required, for [key].	Fatal

Usage:

Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Environmental Protection Agency

Page 461 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURGEN-6

Check Name:	Duplicate Emission Comment Records

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

For a Emission Comment record:

Locate another EmissionComment record for the monitoring plan with a ReportingPeriod equal to the ReportingPeriod in the
current record.

If found,

return result A.

Results:

Result	Response	Severity

A	Another [recordtype] record already exists with the same [fieldnames].	Fatal

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Environmental Protection Agency

Page 462 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Monitor Data

Environmental Protection Agency

Page 463 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-1

Check Name:

Initialize S02C Hourly Monitor Data

Related Former Checks:

Applicability:

CEM Check

Description:

Specifications:

Current MHV Parameter = "S02C"
S02C Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 464 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-2

Check Name:	Initialize H20 Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Parameter = "H20"

H20 MHV Calculated Adjusted Value = null

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

H20 Monitor Hourly Evaluation

Environmental Protection Agency

Page 465 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-3

Check Name:	Initialize NOXC Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Parameter = "NOXC"

NOXC Calculated Adjusted Value = null

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

NOx Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 466 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-4

Check Name:

Initialize Flow Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current MHV Parameter = "FLOW"

FLOW Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Environmental Protection Agency

Page 467 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-5

Check Name:	Initialize C02C Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Parameter = "C02C"

C02C MHV Calculated Adjusted Value = null

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

C02 Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 468 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-6

Check Name:

Initialize 02 Dry Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current MHV Parameter = "02D"

02 Dry Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Environmental Protection Agency

Page 469 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-7

Check Name:

Initialize 02 Wet Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current MHV Parameter = "02 W"

02 Wet Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

Process/Category: Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Environmental Protection Agency

Page 470 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-8

Check Name:

Check MODC in MHV Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Monitor Hourly Mode Status = false

Current MHV Parameter Description = Current MHV Parameter
Complete MHV Record Needed = true

case (Current MHV Parameter)

S02C: Current MHV Record = Current S02 Monitor Hourly Record
Current MHV Component Type = 'S02'

Current MHV System Type = 'S02'

Current MHV Default Parameter = 'S02X'

else if (S02 Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If (Current MHV Record. ModcCodc not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22,
23, 53, 54, 55})

return result A

Else

Monitor Hourly Mode Status = true

NOXC: Current MHV Record = Current NOx Cone Monitor Hourly Record
Current MHV System Type = 'NOXC'

Current MHV Component Type = 'NOX'

Current MHV Default Parameter = 'NOCX'

NOx Cone MODC = null

If (Current MHV Record.ModcCode in set {23, 24})

If (NOx Mass Bypass Code == "BYMAXFS")

If (Current MHV Record.ModcCode == "23")

If (S02 Bypass Code == "BYMAXFS")

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

else if (NOx Mass Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

Environmental Protection Agency

Page 471 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (NOx Cone Needed for Nox Mass Calc == true)

If (Current MHVRecord.ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 15, 17, 18, 19,
20,21, 22, 23, 24, 53, 54, 55})
return result A

Else

Monitor Hourly Mode Status = true

Else

Complete MHV Record Needed = false

If (Current MHVRecord.ModcCode not in set {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54})
return result B

Else

Monitor Hourly Mode Status = true

NOx Cone MODC = Current MHV Record.ModcCode

FLOW: Current MHV Record = Current Stack Flow Hourly Record
Current MHV Component Type = 'FLOW'

Current MHV System Type = 'FLOW'

Current MHV Default Parameter = 'FLOX'

If {SO2 Fuel Specific Missing Data == true OR CO2 Fuel Specific Missing Data == true OR NOx Mass Fuel
Specific Missing Data == true OR Heat Input Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 20, 53, 54, 55})
return result A

Else

Monitor Hourly Mode Status = true

C02C: Current MHV Record = Current C02 Cone Monitor Hourly Record
Current MHV Component Type = 'C02'

Current MHV System Type = 'C02'

Current MHV Default Parameter = 'C02X'

If ((C02 Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for C02 Mass Calc == true) OR
(Heat Input Fuel Specific Missing Data == true AND CO 2 Cone Checks Neededfor Heat Input == true))

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If (CO 2 Cone Checks Needed for Heat Input == true OR C02 Cone Checks Needed for C02 Mass Calc == true)

If (Current MHVRecord.ModcCode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 17, 18, 20, 21, 53, 54, 55})
return result A

Else

Monitor Hourly Mode Status = true

If (C02 Diluent Checks Needed for NOx Rate Calc == true AND Current MHV Record. ModcCode
not in set {01, 02, 03, 04, 17, 20, 21, 53, 54}
return result E

Else

Environmental Protection Agency

Page 472 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Complete MHVRecord Needed = false

If Current MHV Record. ModcCode not in set {01, 02, 03, 04, 17, 18, 20, 21, 53, 54}
return result C

Else

Monitor Hourly Mode Status = true

02D: Current MHV Record = Current 02 Dry Monitor Hourly Record
Current MHV Component Type = '02'

Current MHV System Type = null
Current MHV Default Parameter = '02N'

If (Current MHV Record.MoistureBasis is null)

Current MHV Parameter Description = "02C"

else

Current MHV Parameter Description = "02C with a MoistureBasis of " + Current MHV
Record. MoistureB asis

If (Heat Input Fuel Specific Missing Data == true AND 02 Dry Checks Neededfor Heat Input == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If (02 Dry Checks Needed for Heat Input == true)

If (Current MHV Record.ModcCode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 17, 20, 53, 54, 55})
return result A

Else

Monitor Hourly Mode Status = true

If (02 Dry Checks Needed for NOx Rate Calc == true AND Current MHV Record.ModcCode not

in set {01, 02, 03, 04, 17, 20, 53, 54}
return result E

Else

Complete MHV Record Needed = false

If Current MHV Record. ModcCode not in set {01, 02, 03, 04, 17, 20, 53, 54}
return result D

Else

Monitor Hourly Mode Status = true

02 W: Current MHV Record = Current 02 Wet Monitor Hourly Record
Current MHV Component Type = '02'

Current MHV System Type = null
Current MHV Default Parameter = '02N'

If (Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Current MHV Fuel Specific Hour = false

If (02 Wet Checks Needed for Heat Input == true)

If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 17, 20, 53, 54, 55})
return result A

Else

Monitor Hourly Mode Status = true

If (02 Wet Checks Needed for NOx Rate Calc == true AND Current MHV Record. ModcC ode not

in set {01, 02, 03, 04, 17, 20, 53, 54}
return result E

Else

Complete MHV Record Needed = false

If Current MHVRecord.ModcCode not in set {01, 02, 03, 04, 17, 20, 53, 54}
return result D

Else

Monitor Hourly Mode Status = true

H20: Current MHV Record = Current H20 Monitor Hourly Record
Current MHV Parameter = 'H20'

If {H20 Method Code == "MMS")

Current MHV Component Type = "H20"

else

Current MHV Component Type = "DAHS"

Current MHV System Type = null
Current MHV Default Parameter = null'

If (H20 Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
return result A

else

Monitor Hourly Mode Status = true

C02CSD:

Current MHV Record = Current C02 Cone Missing Data Monitor Hourly Record

Current MHV Component Type = 'C02'

Current MHV System Type = null

Current MHV Default Parameter = 'C02X'

Current MHV Parameter Description = "C02C (Substitute Data)"

If {{C02 Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for C02 Mass Calc == true) OR
{Heat Input Fuel Specific Missing Data == true AND CO 2 Cone Checks Neededfor Heat Input == true))

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

Environmental Protection Agency

Page 474 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current MHV Record.ModcCode not in set {06, 07, 08, 09, 10, 12, 55})
return result A

Else

Monitor Hourly Mode Status = true

02CSD:

if (Current 02 Dry Missing Data Monitor Hourly Record is not null)

Current MHV Record = Current 02 Dry Missing Data Monitor Hourly Record

else

Current MHV Record = Current 02 Wet Missing Data Monitor Hourly Record

Current MHV Component Type = '02'

Current MHV System Type = null

Current MHV Default Parameter = '02N'

Current MHV Parameter Description = "02C (Substitute Data)"

If (Heat Input Fuel Specific Missing Data == true AND 02 Dry Checks Needed for Heat Input == true)
Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If (Current MHV Record. ModcCode not in set {06, 07, 08, 09, 10, 12, 55})
return result A

Else

Monitor Hourly Mode Status = true

Results:

Result

A

B

Response

The MODCCode reported in the MHV record for [param] is invalid.
You reported a MODCCode of [MODC] in the MHV record for NOXC, but this
MODC is not appropriate when NOX concentration is used in a NOx-diluent
system to calculate the NOx emission rate.

You reported a MODCCode of [MODC] in the MHV record for C02C, but this
MODC is not appropriate when C02 concentration is only used to calculate the
NOx emission rate.

You reported a MODCCode of [MODC] in the MHV record for [param], but this
MODC is not appropriate when 02 concentration is not used to calculate the heat
input rate.

You reported a MODCCode of [MODC] in the MHV record for [param], but this
MODC is not appropriate when this value is used in a NOx-diluent system to
calculate the NOx emission rate.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

D

Critical Error Level 1

E

Critical Error Level 1

Environmental Protection Agency

Page 475 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

8

Process/Category:

Emissions Data Evaluation Report

9

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Monitor Hourly Evaluation

C02C Monitor Hourly Evaluation for Substitute Data

FLOW Monitor Hourly Evaluation

H20 Monitor Hourly Evaluation

NOx Concentration Monitor Hourly Evaluation

02 Dry Monitor Hourly Evaluation

02 Wet Monitor Hourly Evaluation

02C Monitor Hourly Evaluation for Substitute Data

S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 476 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-9

Check Name:

Related Former Checks:

Check Percent Monitor Availability in MHV Record

Applicability:

Description:

Specifications:

CEM Check

Monitor Hourly Pma Status = false
Monitor Hourly Missing Data Status = true

If (Monitor Hourly Mode Status == true)

If ( Current MHV Record Percent Available is NULL)
if (Complete MHV Record Needed == false)
Monitor Hourly Pma Status = true

else

if (Current MHV Record.ModcCode not in set {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54} AND Legacy
Data Evaluation == true)

Monitor Hourly Pma Status = true
return result A

else

return result B

else

if (Complete MHV Record Needed == false)
return result C

else if (Current MHV Record.PercentAvailable> 100.0 OR

Current MHV Record Percent Available < 0.0)
return result D

Else

case ( Current MHV RecordModcCodo,)

= 06:

If Current MHVRecord. Percent Available >= 90.0
Monitor Hourly Pma Status = true

Else

return result E

= 08:

If Current MHV Record PcrccntAvai 1 ab 1 c >= 95.0
Monitor Hourly Pma Status = true

Else

return result E

= 09:

If Current MHV7?ecw= 90.0 AND Current MHV7?ecw=80.0 AND Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

90.0

Monitor Hourly Pma Status = true
Else if Current MHV Parameter in {FLOW,NOXC} and Current MHV Record Percent Available

>= 90.0

Monitor Hourly Pma Status = true
return result F

Else

return result E

= 11:

If Current MHV7?ecw=90.0
Monitor Hourly Pma Status = true

Else

return result E

All other MODC Codes:

Monitor Hourly Pma Status = true

Results:

Result
A

B
C

D

E
F

Response

You reported an MODCCode of [ModcCode] in the MHV record for [param], but
you did not report a value for PercentAvailable. While this is not required for
legacy EDR data, it is required in all MHV records for ECMPS.

You did not report PercentAvailable in the MHV record for [param].

You reported PercentAvailable in the MHV record for [param], but this value
should not be reported when the monitoring system is only being used to calculate
the NOX emission rate, moisture, and/or C02 concentration. In that case, the
percent monitor availability should be reported in the appropriate DHV record.
The PercentAvailable reported in the MHV record for [param] is invalid. This value
must be between 0 and 100.

You reported an MODCCode of [modcCode] in the MHV record for [param], but
the PercentAvailable is not appropriate for this MODC.

You reported an MODCCode of 10 in the [type] record for [param], but the
PercentAvailability is greater than or equal to 90. When the PMA is greater than or
equal to 90, you should only report an MODC of 10 to indicate that you used the
maximum hourly value in the lookback period for the next available higher load bin,
because there were no quality-assured data in the bin corresponding to the current
load range. (See Part 75.33(c)(5).)

Severity

Informational Message

Critical Error Level 1
Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Informational Message

Environmental Protection Agency

Page 478 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

8

Process/Category:

Emissions Data Evaluation Report

9

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Monitor Hourly Evaluation

C02C Monitor Hourly Evaluation for Substitute Data

FLOW Monitor Hourly Evaluation

H20 Monitor Hourly Evaluation

NOx Concentration Monitor Hourly Evaluation

02 Dry Monitor Hourly Evaluation

02 Wet Monitor Hourly Evaluation

02C Monitor Hourly Evaluation for Substitute Data

S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 479 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-10

Check Name:

Related Former Checks:

Check Prior QA'd Hours for MODC 07

Applicability:

Description:

Specifications:

CEM Check

if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if (Current MHV Record.ModcCode == 07)

if (Current MHV Parameter in set {02D, 02 W, 02CSD})

Prior QA Hours = count MonitorHourly ValueData records where

MonitorHourlyValueData.ModcCode in set {01, 02, 04, 17, 20, 53} AND
MonitorHourlyValueData.ParameterCode = "02C" AND

(MonitorHourly ValueData.MoistureBasis = Current MHVRecord.MoistureBasis OR
MonitorHourly ValueData.MoistureBasis is null) AND
(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour <
Current Hour))

else if (Current MHV Parameter == "C02CSD")

Prior QA Hours = count MonitorHourly ValueData records where

MonitorHourly ValueData.ModcCode in set {01, 02, 04, 17, 20, 21, 53} AND
MonitorHourlyValueData.ParameterCode = "C02C" AND
(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour <
Current Hour))

else

case (Current MHV Parameter)

S02C:	MODC Set ={01, 02, 04, 16, 17, 19, 20, 21, 22, 53}

NOXC: MODC Set = {01, 02, 04, 17, 19, 20, 21, 22, 53}

C02C:	MODC Set = {01, 02, 04, 17, 20, 21, 53}

FLOW: MODC Set = {01, 02, 04, 20, 53}

H20:	MODC Set = {01, 02, 04, 21, 53}

Prior QA Hours = count MonitorHourly ValueData records where

MonitorHourly ValueData.ModcCode in set MODC Set AND

MonitorHourly ValueData.ParameterCode = Current MHV Record arameterCode AND
(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour <
Current Hour))

if (Current MHV Parameter in set {NOXC, FLOW})
if (Prior QA Hours >2160)

Monitor Hourly Missing Data Status = false
return result A

else

if (Prior QA Hours > 720)

Monitor Hourly Missing Data Status = false
return result A

Environmental Protection Agency

Page 480 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You reported an MODCCode of 07 in the MHV record for [param], but too many	Critical Error Level 1

prior quality assured hours exist in evaluation period for use of this missing data
approach.

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 481 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Check Code:	HOURMHV-11

Check Name:	Check Extraneous Data in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Monitor Hourly Null Status = false
Hourly Extraneous Fields = null

if (Current MHV Record Adj ustcdHourly V al lie is not null AND Current MHV Parameter not in set {S02C, NOXC, FLOW})
append "AdjustedHourly Value" to Hourly Extraneous Fields

if {Current MHV Record.MoisiwoBasis is not null AND Current MHV Parameter not in set {02D, 02W, 02CSD})
append "MoistureBasis" to Hourly Extraneous Fields

if (Hourly Extraneous Fields is not null)
return result A

else

Monitor Hourly Null Status = true
Results:

Result	Response	Severity

A	You reported [fieldnames] in the MHV record for [param]. This data should be	Non-Critical Error

blank.

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 482 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-12

Check Name:

Related Former Checks:

Check For Correct Use of MODCs

Applicability:

Description:

Specifications:

CEM Check

CurrentMHVHBHA Value = null

if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)

if {Current MHV Record. ModcCode in set {06, 08, 09})

if {Current MHV Parameter in set {02D, 02 W, 02CSD})

Prior MHV Record = latest MonitorHourlyValueData record where

MonitorHourlyValueData.ModcCode in set {01, 02, 03, 04, 17, 20, 53, 54} AND
MonitorHourlyValueData.ParameterCode = "02C" AND

(MonitorHourly ValueData.MoistureBasis = Current MHV Record.MoistureBasis OR
MonitorHourly ValueData.MoistureBasis is null) AND
[MonitorHourly ValueData.Date < Current Date OR

(MonitorHourly ValueData.Date = Current Date AND MonitorHourly ValueData.Hour < Current
Hour)]

If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourlyValueData record where

MonitorHourlyValueData.ModcCode in set {01, 02, 03, 04, 17, 20, 53, 54} AND
MonitorHourlyValueData.ParameterCode = "02C" AND

(MonitorHourly ValueData.MoistureBasis = Current MHV Record.MoistureBasis OR
MonitorHourly ValueData.MoistureBasis is null) AND
[MonitorHourly ValueData.Date > Current Date OR

(MonitorHourly ValueData.Date = Current Date AND MonitorHourly ValueData.Hour >
Current Hour)]

If Next MHVRecord is not null and is in current reporting period

If Pn'orMffFi?ecor^.UnadjustedHourlyValue >= 0 AND Next MHV
i?ecordUnadjustedHourly Value >= 0

Current MHV HBHA Value = (Pn'orMffFi?ecor^.UnadjustedHourlyValue + Next
M/fFifeconi.UnadjustedHourly Value) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A

else

case {Current MHV Parameter)

S02C:

MODC Set = {01, 02, 03, 04, 16, 17, 19, 20, 21, 22, 53, 54}

Environmental Protection Agency

Page 483 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

NOXC:
FLOW:

MODC Set = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}
MODC Set = {01, 02, 03, 04, 20, 53, 54}

C02C OR C02CSD: MODC Set = {01, 02, 03, 04, 17, 20, 21, 53, 54}

H20:

MODC Set = {01, 02, 03, 04, 21, 53, 54}

if {Current MHVParameter in set {H20, C02C})

Prior Record = latest MonitorHourly ValueData record or DerivedHourly ValueData record where
ParameterCode = Current MHV Parameter AND
ModcCode in set MODC Set AND
(Date < Current Date OR

(Date = Current Date AND Hour < Current Hour ))

If Prior Record is not null and is in current reporting period

Next Record = earliest MonitorHourly ValueData record or DerivedHourly ValueData record
where

ParameterCode = Current MHV Parameter AND
ModcCode in set MODC Set AND
(Date > Current Date OR

(Date = Current Date AND Hour > Current Hour ))

If Next Record is not null and is in current reporting period

If Priorifecord.UnadjustedHourlyValue >= 0 AND Next
i?ecordUnadjustedHourly Value >= 0

Current MHVHBHA Value = (Priorifecord.UnadjustedHourlyValue +
Nexti?econi.UnadjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A

else if (Current MHV Parameter == "C02CSD")

Prior MHV Record = latest MonitorHourly ValueData record where
MonitorHourlyValueData.ParameterCode = "C02C" AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourly ValueData.Date < Current Date OR

(MonitorHourly ValueData.Date = Current Date AND MonitorHourly ValueData.Hour <
Current Hour)]

If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourly ValueData record where
MonitorHourly ValueData.ParameterCode = "C02C" AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourly ValueData.Date > Current Date OR

(MonitorHourly ValueData.Date = Current Date AND MonitorHourly ValueData.Hour >
Current Hour)]

Environmental Protection Agency

Page 484 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If Next MHVRecord is not null and is in current reporting period

If /'nor M/fFifeconi.UnadjustedHourly Value >= 0 AND AND Next MHV
i?ecordUnadjustedHourly Value >= 0

Current MHVHBHA Value = (Pn'orMffFi?ecor^.UnadjustedHourlyValue
+ TVex/M/fFifeconi.UnadjustedHourly Value) / 2, ROUNDED to a single
decimal.

else

Monitor Hourly Missing Data Status = false
return result A

else

Prior MHV Record = latest MonitorHourlyValueData record where

MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date < Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour <
Current Hour)]

If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourlyValueData record where

MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date > Current Date OR
(MonitorHourlyValueData.Date = Current Date AND
MonitorHourly ValueData.Hour > Current Hour)]

If Next MHVRecord is not null and is in current reporting period

If Prior MHV Record. AdjustedHourly Value >= 0 AND Next MHV
Record. AdjustedHourlyValue >= 0

if (Current MHV Parameter == "FLOW")

Current MHV HBHA Value = (Prior MHV

Record. AdjustedHourlyValue + Next MHV

Record. AdjustedHourlyValue) / 2, ROUNDED to the nearest 1000.

else

Current MHV HBHA Value = (Prior MHV

Record. AdjustedHourlyValue + Next MHV

Record. AdjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result B

else if (Current MHV Record.ModcCodc =="11")

case (Current MHV Parameter)

Environmental Protection Agency

Page 485 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

NOXC: MODCSet = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}

FLOW: MODC Set = {01, 02, 03, 04, 20, 53, 54}

Prior Measured MHVRecord = MonitorHourly ValueData record at latest time for the location where
MonitorHourlyValueData.ModcCode in set MODC Set AND
MonitorHourly ValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour< Current
Hour))

If Prior Measured MHV Record is not null and is in the current reporting period
PriorDate = Prior Measured MHVRecord .BeginDate
PriorHour = Prior Measured MHV Record. BeginHour

else

PriorDate = the day prior to the beginning of the current reporting period
PriorHour = 23

Next Measured MHV Record = MonitorHourly ValueData record at earliest time for the location where
MonitorHourly ValueData.ModcCode in set MODC Set AND
MonitorHourly ValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourly ValueData.BeginDate > Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour> Current
Hour))

If Next Measured MHV Record is not null and is in the current reporting period
NextDate = Next Measured MHV Record. BeginDate
NextHour = Next Measured MHV Record. BeginHour

else

NextDate = the day after the end of the current reporting period
NextHour = 0

Missing Data Period Length = Count of MonitorHourly ValueData records for the location where
MonitorHourly ValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourly ValueData.BeginDate > PriorDate OR

(MonitorHourly ValueData.BeginDate = PriorDate AND MonitorHourly ValueData. BeginHour >
PriorHour)) AND

(MonitorHourly ValueData.BeginDate < NextDate OR

(MonitorHourly ValueData.BeginDate = NextDate AND MonitorHourly ValueData.BeginHour <

NextHour))

if (Current MH V Record. P crccn t A va i 1 ab 1 c is null OR Current MHV Record. Percent Available >= 95.0)
if (Missing Data Period Length > 24)

Monitor Hourly Missing Data Status = false
return result C

else

if (Missing Data Period Length > 8)

Monitor Hourly Missing Data Status = false
return result C

else if (Current MHV Record. ModcCode == " 17" AND Monitor Hourly System Status == true)

Hours of Use of Like Kind Analyzer = Count of MonitorHourly ValueData records for the location and reporting

Environmental Protection Agency

Page 486 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

period where

MonitorHourlyValueData.ParameterCode = Current MHVParameter AND

MonitorHourlyValueData.ModcCode == "17" AND

(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour< Current

Hour))

If Hours of Use of Like Kind Analyzer >= 720

First Use of Like Kind Analyzer Record = MonitorHourly ValueData record at earliest time for the location

and

and reporting period where

MonitorHourly ValueData.ParameterCode = Current MHV Parameter AND

MonitorHourly ValueData.ModcCode == "17" AND

(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.BeginDate = Current Date AND MonitorHourly ValueData.BeginHour<

Current Hour))

If Current MH V Record Moni tori ng Sy stem ID is not null,

Locate a RATATestRecordsByLocationForQAStatus for the location

where the MonitoringSystemID is equal to Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The UnadjustedHourly Value reported in the MHV record for [param] either before Critical Error Level 1

or after the current hour is invalid.

B	The AdjustedHourly Value reported in the MHV record for [param] either before or Critical Error Level 1

after the current hour is invalid.

C	You reported an MODCCode of 11 in the MHV record for [param], but the length of Critical Error Level 1

the missing data period exceeds the allowable value for use of this missing data
procedure.

D	You reported an MODCCode of 17 in the MHV record for [param], indicating the	Critical Error Level 1

use of a like-kind analyzer, but you have used a like-kind analyzer to monitor this
parameter for more than 720 hours during this reporting period. You are not
allowed to use a like-kind analyzer for more than 720 hours during a calendar year,
unless the analyzer is identified as a non-redundant backup and a RATA is
performed.

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 488 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-13

Check Name:	Check System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Mon Sys Record = null
Monitor Hourly System Status = false

If (Current MHV Parameter == "NOXC" AND NOx Cone Checks Neededfor Nox Mass == false)

if (Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current MHV Record.Mo&cQo&c in set MODC Set)

if Current MHVitecorrf.MonitoringSystemID is null
return result C

else

Current MHVMon .S'y.v Record = find active MonitoringSystemData record for location where

MonitoringSystemData.MonitoringSystemID = Current MHV7?ecw Current MHV System Type)

If (Current MHV Parameter == "C02C" AND Legacy Data Evaluation == true
AND

Current MHV Mon Sys Record. SystemTypeCode == "NOX")
Monitor Hourly System Status = true

else

return result E

else

Monitor Hourly System Status = true

else if (Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You reported a MonitoringSystemID in the MHV record for NOXC, but this field	Critical Error Level 1

should be blank when the NOX concentration is used to calculate the NOX
emission rate as part of a NOX-diluent system.

B	You reported a MonitoringSystemID in the MHV record for C02C, but this field	Critical Error Level 1

should be left blank when C02 concentration is not used to calculate C02 mass or
heat input.

C	You did not report a MonitoringSystemID in the MHV record for [param]. This	Critical Error Level 1

information is required when you report measured data.

D	You reported MonitoringSystemID [ID] in the MHV record for [param], but there is Critical Error Level 1

no Monitoring System record for this system in your monitoring plan that was
active during the hour.

E	You reported MonitoringSystemID [ID] in the MHV record for [param], but this	Critical Error Level 1

SystemTypeCode for this monitoring system is not appropriate.

F	You reported a MonitoringSystemID in the MHV record for [param], but this is not Non-Critical Error

appropriate when substitute data is used.

G	You reported a MonitoringSystemID in the MHV record for [param], but this field Critical Error Level 1

should be left blank when 02 concentration is not used to calculate C02
concentration or heat input.

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 491 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-14

Check Name:	Check System Designation Code for System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (Monitor Hourly Mode Status == true AND Monitor Hourly System Status == true ANDCurrent MHVMon Sys Record is not

null)

case {Current MHV Record. ModcCode)

01 OR 17: If (Current MHV Mon Sys Record. SystemDesignationCode NOT in set {P, PB})
return result A

02: If (Current MHV Mon Sys Record. SystemDesignationCode NOT in set {B, RB, DB}
return result B

04: If (Current MHV Mon Sys Record. SystemDesignationCode o "RM")
return result C

22: If (Current MHV Mon Sys Record. SystemDesignationCode <> "CI")
return result D

Results:

Result
A

B

C

D

Usage:

Response

You reported an MODCCode of [modcCode] in the MHV record for [param], but

MonitoringSystemID [ID] is not a primary system.

You reported an MODCCode of 02 in the MHV record for [param], but

MonitoringSystemID [ID] is not a backup system.

You reported an MODCCode of 04 in the MHV record for [param], but

MonitoringSystemID [ID] is not a reference method system.

You reported an MODCCode of 22 in the MHV record for [param], but

MonitoringSystemID [ID] is not a certified inlet system.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

3

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 492 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-15

Check Name:

Related Former Checks:

Check Component in MHV Record

Applicability:

Description:

Specifications:

CEM Check

Monitor Hourly Component Status = false

if (Current MHV Parameter NOT in set {C02CSD, 02CSD})

case (Current MHV Parameter)

S02C:
NOXC:

MODC Set = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53}
MODC Set = {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53}

C02C, 02D, 02W: MODC Set ={01, 02, 03, 04, 17, 18, 20, 21, 53}

FLOW:
H20:

MODC Set = {01, 02, 03, 04, 20, 53}
MODC Set = {01, 02, 03, 04, 21, 53}

If (Current MHV Record. ModcCode in set MODC Set)
if Current MHV Record. ComponentID is null

If (Current MHV Parameter == "FLOW" and Current MHV Record MonitoringSystemlD is not null)

Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location
where

MonitoringSystemComponentData .ComponentTypeCode = "FLOW" AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHV
7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

AND

MonitoringSystemComponentData.MonitoringSystemID = Current MHV
7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

8

Process/Category:

Emissions Data Evaluation Report

9

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Monitor Hourly Evaluation

C02C Monitor Hourly Evaluation for Substitute Data

FLOW Monitor Hourly Evaluation

H20 Monitor Hourly Evaluation

NOx Concentration Monitor Hourly Evaluation

02 Dry Monitor Hourly Evaluation

02 Wet Monitor Hourly Evaluation

02C Monitor Hourly Evaluation for Substitute Data

S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 495 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMHV-16

Check Name:

Check Pre-Bias-Adjusted Value

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Monitor Hourly Preadjusted Value Status = false

S02C: MODC Set = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54}

NOXC: MODC Set = {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54}

FLOW: MODC Set = {01, 02, 03, 04, 20, 53, 54}

If (Current MHV Record.Mo&cQo&c in set MODC Set)

If (Current MHV Record.UnadjustedHourly Value is null AND

Current MHV Record. ModcCode not in set {04, 19, 20, 53, 54})
return result A

else if (Current MHV Record \]md)uslQdi\ow\yValue < 0.0 AND

Current MHV Record. ModcCode not in set {16, 21})
return result A

else if (Current MHV Record XJn&diwstQdilovxlyYahiQ > 2 AND
Current MHV Record. ModcCode == 16)
return result B

else if (CMfTe«£M//f/./?ecw 0 AND
Current MHVRecord.ModcCode == 21)
return result C

else if (Current MHV Parameter in set {S02C, NOXC} and Current	UnadjustedHourly Value is not rounded

to 1 decimal place)

return result F

else if (Current MHV Parameter == "FLOW" and Current	UnadjustedHourly Value is not rounded to the

nearest 1000)

return result F

else

Monitor Hourly Preadjusted Value Status = true

if (Current MHV Max Min Value is not null)

if (Current MHV Record.Unad}ustedHow:\yVa\ue> Current MHV Max Min Value)
return result D

else if (Monitor Hourly Mode Status == true)

If (Current MHV Record .UnadjustedHourly Value is not null)
return result E

Else

Monitor Hourly Preadjusted Value Status = true

Environmental Protection Agency

Page 496 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

E
F

Response

The UnadjustedHourly Value reported in the MHV record for [param] is missing or
invalid.

You reported an MODCCode of 16 in the MHV record for [param], but the
UnadjustedHourlyValue exceeds 2.

You reported an MODCCode of 21 in the MHV record for [param], but the
UnadjustedHourlyValue is greater than 0.

Warning: The UnadjustedHourlyValue reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.
You reported an MODCCode of [modcCode] in the MHV record for [param], so you
should not have reported a value for the UnadjustedHourlyValue.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message

Critical Error Level 1

Critical Error Level 1

Usage:

1

2

3

Process/Category:
Process/Category:
Process/Category:

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 497 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-17

Check Name:	Verify Consistency Between NOx Emission Rate and NOx Concentration

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (NOx Cone Needed for NOx Rate Calc == true AND Monitor Hourly Mode Status == true)

if (Current MHVRecord .MODCCode not in set {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53} )
return result A

else if (Current MHV Record MODCCode == 21 AND NOx Emission Rate MODC not in set {14, 21})
return result A

else if (Current MHV Record.MODCCode == 22 AND NOx Emission Rate MODC not in set{14, 22})
return result A

Results:

Result	Response	Severity

A	You reported an MODCCode of [MODC] in the MHV record for NOXC that is	Critical Error Level 1

inconsistent with MODCCode of [NOX ER MODC] reported in the DHV record for
NOXR.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 498 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-18

Check Name:	Determine Maximum or Minimum Value for Parameter in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Max Min Value = null

If {Current MHV Parameter == "H20")

If (H20 Missing Data Approach == "MAX")

Current MHV Default Parameter = "H20X"

Else If (H20 Missing Data Approach == "MIN")

Current MHV Default Parameter = "H20N"
else if {Current MHV Record.ModcCode== 12)
return result A

If (Monitor Hourly Mode Status == true AND Current MHV Default Parameter is not null)

If (Current MHV Record. ModcCode in set {12, 23} AND Current MHV Fuel Specific Hour = true)

If Current Hourly Op Record .¥ vic\Qo&c is not null

Current MHV Missing Data Fuel = Current Hourly Op Record F ucl Code

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = Current Hourly Op Record .¥ vic\Qo&c
DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set {A,U} // Not Controlled

if (count > 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ > 0)

Current MHV Max Min Value = Default Record. DefaultValue

else

return result D

else if (Current MHV Record.Mo&cQo&c in set {13, 24} AND Current MHV Fuel Specific Hour == true)

If Current Hourly Op Record .¥ uc\Qo&c is not null

Current MHV Missing Data Fuel = Current Hourly Op Record F ucl Code

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = Current Hourly Op Record.FuelCode

Environmental Protection Agency

Page 499 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in == "C" // Controlled

if (count > 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record

if (DefaultRecordDzfaulNsAuQ > 0)

Current MHV Max Min Value = Default Record. DefaultValue

else

return result D

else if (Current MHV Record.ModcCodc <> 15)

If (Current MHV Parameter in set {H20, 02W, 02D, 02CSD})
if (Current MHV Default Parameter is not null)

Current MHV Missing Data Fuel = "NFS"

if (Current MHV Parameter in set {02W, 02D} AND Current MHV RecordMo&cCo&c == 20)
Current MHV Default Parameter = "02X"

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = "NFS"

DefaultPurposeCode = "DC" //diluent cap

else

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = "NFS"

DefaultPurposeCode = "MD" //missing data

if (count > 1)

return result B

else if ((Current MHV Parameter == "02D" AND 02 Dry Checks Neededfor Heat Input == false)
OR (Current MHV Parameter == "02 W" AND 02 Wet Checks Needed for Heat Input == false))
Current MHV Max Min Value = 0

else if (count == 0)

return result C

else

Default Record = the single matched record
if (DefaultRecordDzfaulNsAuQ > 0)

Environmental Protection Agency

Page 500 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Current MHVMax Min Value = Default Record.DefwltValue

else

return result D

else

If {Current MHV Component Type == "FLOW")

Current MHV Span Description = "FLOW"

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "FLOW"

else

Current MHV Span Description = Current MHV Component Type + " with a SpanScale of H"
Monitor Span Record Count = Find active MonitoringSpanData records for location where

MonitoringSpanData .ComponentTypeCode = Current MHV Component Type AND
MonitoringSpanData. SpanScaleCode = "H"

if (Monitor Span Record Count > 1)

return result E
else if (.Monitor Span Record Count = 0)
return result F

else

Current Monitor Span Record = the single matched record

If (Current MHV Record.ModcCode == 19)

if Current Monitor Span Record.DefaultHighRange > 0)

Current MHV Max Min Value = Current Monitor Span ifecord.DefaultHighRange

else

return result G

else if ((Current Monitor Span Record. DefaultHighRange is null AND Current MHV
Record. ModcCode not in set {13, 24}) or Current MHV Record.ModcCode == 12)

if (Current MHV Record.ModcCode == 20)

if (Current MHV Parameter == "FLOW")

if Current Monitor Span Record.FlowFullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
ifecord.FlowFullScaleRange * 2

else

return result G

else

if Current Monitor Span Record.FullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
ifecord.FullScaleRange * 2

else

return result G

else

if (Current MHV Parameter == "FLOW")

if Current Monitor Span Record.MP¥ Value >0)

Current MHV Max Min Value = Current Monitor Span
Record.MPYVahxQ

Environmental Protection Agency

Page 501 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result G

if Current Monitor Span Record.MFC Value > 0)

Current MHVMax Min Value = Current Monitor Span
Record.MPCVahxQ

else

return result G

else if (Current MHV Parameter in set {S02C, NOXC})

Current MHV Span Description = Current MHV Component Type + " with a SpanScale of
L"

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = Current MHV Component Type
AND

MonitoringSpanData. SpanScaleCode = "L"

if (Monitor Span Record Count > 1)
return result E

else if (Monitor Span Record Count = 0)
return result F

else

Current Monitor Span Record = the single matched record
if (CurrentMHVRecord.ModcCode == 20)

if Current Monitor Span Record.FullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
Record.FullScaleRange * 2

else

return result G

else if (Current MHV Record. ModcCode in set {13, 24})
if Current Monitor Span Record.MEC Value > 0)

Current MHV Max Min Value = Current Monitor Span
Record .MEC Value

else

return result G

else

if Current Monitor Span Record .SpanValue > 0)

Current MHV Max Min Value = Current Monitor Span
Record. SpanValue

else

return result G

Environmental Protection Agency

Page 502 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C
D
E
F
G

Usage:

Response

The missing data default parameter for H20 could not be determined, because you
used both Standard and Inverse Part 75 missing data approaches during the hour.
You reported more than one applicable [param] Default record with a FuelCode of
[FuelCode] in your monitoring plan for the hour.

You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].

The values reported in the applicable [param] Default record with a FuelCode of
[FuelCode] are invalid.

You reported more than one active span record for [key] in your monitoring plan
for the hour.

You did not report an active span record for [key] in your monitoring plan for the
hour.

The values reported in the applicable span record for [key] are invalid.

Severity

Critical Error Level 2
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 503 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-19

Check Name:	Check Adjusted Hourly Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Monitor Hourly Adjusted Value Status = false

if (Monitor Hourly Mode Status == true AND Monitor Hourly Missing Data Status == true AND

(.Monitor Hourly Pma Status == true OR Current MHV Record. ModcCode NOT in set {06, 07, 08, 09, 10, 11}))

If (Current MHV Parameter <> "NOXC" OR NOx Cone Neededfor Nox Mass Calc == true)

If (Current MHV Parameter == "FLOW")
set Current MHV Precision to -3.

else

set Current MHV Precision to 1.

case (Current MHV7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current MH V Record. A dj listed H o urly Va 1 lie >= 0)

if ( Current MH V Record Adj ustcdHoutiy Val lie == Current MHV Calculated Adjusted
Value)

Monitor Hourly Adjusted Value Status = true

else

return result G

else

return result H

else

If (Current	AdjustcdHourly Value >= 0)

If (Current MHV itecorrf. AdjustedHourly Value is not rounded to Current MHV Precision)
return result L

else

Current MHV Calculated Adjusted Value = Current MHV

itecorrf.AdjustedHourlyValue

Monitor Hourly Adjusted Value Status = true

If (Current MHV Max Min Value is not null)

if (Current MH V Record Adj ustcdHourly V al lie > Current MHV Max Min
Value)

If {Current MHV Parameter == "S02C" and Current MHV
7?ecw Current MHV Max Min Value * 2)

return result 0
Otherwise,

return result K

Else

return result H

= 08 OR 09:

If (Current MHV Record Adj ustcdHourly V al lie >= 0)

If (Current MHV HBHA Value is not null AND Current MHV HBHA Value > Current MHV
7?ecw

"NOXC")

Current MHV Calculated Adjusted Value = Current MHV HBHA Value

return result I

else

If (Current MHV	Adj ustedHourlyValue is not rounded to Current MHV Precision)

return result L

else

Current MHV Calculated Adjusted Value = Current MHV

Record. Adj ustedHourly Value

Monitor Hourly Adjusted Value Status = true

If (Current MHV Max Min Value is not null)

if (Current MHV Record Adj ustedHourly V alue > Current MHV Max Min
Value)

If (Current MHV Parameter == "S02C" and Current MHV

Environmental Protection Agency

Page 505 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Adj ustedHourly Value > Current MHV Max Min Value * 2)
return result 0
Otherwise,

return result K

Else

return result H

= 04, 05, 07, 10, 11, 15, 53, 54, OR 55:

If (Current	Adj ustedHourly Value >= 0)

If (Current MHV 7?ecw Current MHV Max Min Value)
If (Current MHV Parameter == "S02C" and Current MHV
7?ecw Current MHV Max Min Value * 2)

If the Current MHV Record.ModcCode == 10

return result P
Otherwise,

return result 0

Otherwise,

return result K

Else

return result H

= All Other Codes:

If (Current /W/K/?«.wy/. Adj ustedHourly Value >= 0)

]f (Current MHV Record. ModcCode in set {19, 20} AND Current MHV
itecorrf.UnadjustedHourly Value is null)

If (Current MHV Max Min Value is not null)

if i Current MHI Record AdjustedHourly Value == Current MHI Max Min Value )
Current MHV Calculated Adjusted Value = Current MHV
Record. Adj ustedHourly Value
Monitor Hourly Adjusted Value Status = true

else

if (Current MHV Record. ModcCode == "19")
return result M

else

return result N

else if (Current MHV Record Adj ustedHourly V al lie is not rounded to Current MHV Precision)
return result L

else

Monitor Hourly Adjusted Value Status = true

Environmental Protection Agency

Page 506 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Else

return result H

else

If (Current MHVitecorrf. AdjustedHourlyValue is not null)
return result J

Environmental Protection Agency

Page 507 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

D

H
I

K

L
M

N

0

Response

You reported an MODCCode of 21 in the MHV record for [param], but the
AdjustedHourly Value does not equal 0.

You reported an MODCCode of 16 in the MHV record for [param], but the
AdjustedHourly Value does not equal 2.

You reported an MODCCode of [modcCode] in the MHV record for [param], but
the AdjustedHourly Value does not equal the maximum potential value reported in
the [comptype] span or fuel-specific default record in your monitoring plan.
You reported an MODCCode of 13 or 24 in the MHV record for [param], but the
AdjustedHourly Value does not equal the maximum expected value reported in the
[comptype] span or fuel-specific default record in your monitoring plan.
You reported an MODCCode of 06 in the MHV record for [param], but the
AdjustedHourly Value does not equal average of measured hour before and
measured hour after.

The AdjustedHourly Value reported in the MHV record for [param] is invalid.
You reported an MODCCode of [MODCCode] in the MHV record for [param], but
you reported an AdjustedHourly Value that is less than the average of the
measured hour before and measured hour after.

You reported an AdjustedHourly Value in the MHV record for NOXC. This field
should be blank when the NOX concentration is used to calculate the NOX
emission rate as part of a NOX system.

Warning: The AdjustedHourly Value reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported an MODCCode of 19 in the MHV record for [param], but the
AdjustedHourly Value does not equal the DefaultHighRange reported in the
[comptype] span record in your monitoring plan.

You reported an MODCCode of 20 in the MHV record for [param], but the
AdjustedHourly Value does not equal 200 percent of the FullScaleRange reported in
the [comptype] span record in your monitoring plan.

The AdjustedHourly Value reported in the MHV record for [param] is in excess of
the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.
The AdjustedHourly Value reported in the MHV record for [param] is in excess of
the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Informational Message

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Informational Message

Environmental Protection Agency

Page 508 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1	Process/Category:

2	Process/Category:

3	Process/Category:

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

FLOW Monitor Hourly Evaluation

NOx Concentration Monitor Hourly Evaluation

S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 509 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMH V-20

Check Name:

Check Unadjusted Hourly Value in MHV Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Monitor Hourly Unadjusted Value Status = false

if (Monitor Hourly Mode Status == true AND Monitor Hourly Missing Data Status == true AND

(.Monitor Hourly Pma Status == true OR Current MHV Record. ModcCode NOT in set {06, 07, 08, 09, 10, 11}))

Calculated Unadjusted Value = null

case (Current MHV Record.ModcCode)

= 21: Calculated Unadjusted Value = 0

if (Current MHV Record. UnadjustedHourly Value == 0)

If (Current MHV Parameter == "C02C" and Current Hourly Op Record. LoadRange is greater than 1,
return result L

else

Monitor Hourly Unadjusted Value Status = true

Calculated Unadjusted Value = Current MHV Max Min Value
if (CwireM£M//f/./?ec0i,= 0)

If (Current MHV Max Min Value is not null)

If (Current MHV Parameter begins with "02" AND Current A/Z/Kfiecwn/. UnadjustedHourly Value

>20.9)

Calculated Unadjusted Value = Current MHV Max Min Value
return result K

else if Current MHV Parameter == "C02C" AND Current MH V Record U n adj listed Hourly V al lie >
Current MHV Max Min Value)

Calculated Unadjusted Value = Current MHV Max Min Value
return result C

elseif (Current MHV Record. UnadjustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current	UnadjustedHourly Value

Monitor Hourly Unadjusted Value Status = true

else

return result A

= 12 OR = 23:

If (Current MHV Max Min Value is not null)

else

return result E

Environmental Protection Agency

Page 510 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

= 06: If (Current MHVHBHA Value is not null)

Calculated Unadjusted Value = Current MHVHBHA Value

If (CMfreMf M//f/7?ec0n/.UnadjustedHourlyValue >= 0)

if ( Current /W//K/?et'w= 0)

If {Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current	UnadjustedHourly Value

Monitor Hourly Unadjusted Value Status = true

if (Current MHV Max Min Value is not null)

If {(Current MHV Parameter == "H20" AND H2() Missing Data Approach ==
"MIN") OR Current MHV Parameter begins with "02")

if (CMfTe«£M//f/./?ecw Current MHV Max
Min Value)

return result F

Else

return result E

= 08 OR = 09:

If (Current MHV Record. UnadjustedHourly Value >= 0)

If (Current MHV HBHA Value is not null AND ((Current MHV Parameter == "H20" AND H20 Missing
Data Approach == "MIN") OR Current MHV Parameter begins with "02") AND Current MHV HBHA
Value < Current MHV Record .UnadjustedHourly Value)

Calculated Unadjusted Value = Current MHV HBHA Value
return result J

else if (Current MHV HBHA Value is not null AND ((Current MHV Parameter == "H20" AND H20
Missing Data Approach == "MAX") OR Current MHV Parameter does not begin with "02" or "H20")
AND Current MHV HBHA Value > Current MHV Record .UnadjustedHourly Value)

Calculated Unadjusted Value = Current MHV HBHA Value
return result G

else

if (Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

Environmental Protection Agency

Page 511 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Calculated Unadjusted Value = Current A///K/Jecwf/. UnadjustedHourly Value
Monitor Hourly Unadjusted Value Status = true

if (Current MHV Max Min Value is not null)

If {{Current MHV Parameter == "H20" AND H2() Missing Data Approach ==
"MIN") OR Current MHV Parameter begins with "02")

if {Current MHV Record Unadj ustcdHourly Value < Current MHV Max
Min Value)

return result H

else

if {Current M//f/./?ecw Current MHV Max
Min Value)

return result F

Else

return result E

= All Other Codes:

If {Current MHV Record. UnadjustedHourly Value >= 0)

If {Current MHV Parameter in set {"H20", "C02C", "02D", "02W", "C02CSD", "02CSD"} AND Current
M//f/7?ecw 100)
return result E

else if {Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

else if {Current MHV Record .UnadjustedHourlyValue == 0 AND Current MHV Parameter == "C02C" and
Current Hourly Op Record LoadRmgQ is greater than 1,
return result L

else

Calculated Unadjusted Value = Current	Unadj ustedHourly Value

Monitor Hourly Unadjusted Value Status = true

if {Current MHV Max Min Value is not null)

If {{Current MHV Parameter == "H20" AND H20 Missing Data Approach == "MIN") OR
Current MHV Parameter begins with "02")

if {Current MHV Record.UnadjustedHovirly Value < Current MHV Max Min Value)
return result H

else

if {Current MHV Record.Unad}ustedHour\yVa\ue> Current MHV Max Min Value)
return result F

Else

return result E

Whether or not there is a result returned:

If {Calculated Unadjusted Value is not null)

case {Current MHV Parameter)

Environmental Protection Agency

Page 512 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

C02C:	C02C MHV Calculated Adjusted Value = Calculated Unadjusted Value

02W:	02 Wet Calculated Adjusted Value = Calculated Unadjusted Value

02D:	02 Dry Calculated Adjusted Value = Calculated Unadjusted Value

H20:	H20 MHVCalculatedAdjusted Value = Calculated Unadjusted Value

C02CSD:	C02C SD Calculated Adjusted Value = Calculated Unadjusted Value

02C SD:	02C SD Calculated Adjusted Value = Calculated Unadjusted Value

Results:

Result
A

B

D

E
F

H

I
J

K

Response

You reported an MODCCode of 21 in the MHV record for [param], but the
UnadjustedHourly Value does not equal 0.

You reported an MODCCode of [mode] in the MHV record for [param], but the
UnadjustedHourly Value does not equal the maximum potential value reported in
the [comptype] span or default record in your monitoring plan.

You reported an MODCCode of 20 in the MHV record for [param], but the
UnadjustedHourly Value does not equal 200 percent of the FullScaleRange reported
in the C02 span record in your monitoring plan.

You reported an MODCCode of 06 in the MHV record for [param], but the
UnadjustedHourly Value does not equal average of measured hour before and
measured hour after.

The UnadjustedHourly Value reported in the MHV record for [param] is missing or
invalid.

Warning: The UnadjustedHourly Value reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You
should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.
You reported an MODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourly Value that is less than the average of the measured
hour before and measured hour after.

Warning: The UnadjustedHourly Value reported in the MHV record for [param] is
lower than the minimum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these minimum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Default values. You should
investigate the cause of these low values and determine whether adjustments to
your monitoring systems or monitoring plan are necessary.

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

You reported an MODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourly Value that is greater than the average of the
measured hour before and measured hour after.

You reported an MODCCode of 20 in the MHV record for [param], but the
UnadjustedHourly Value does not equal the default value reported in the 02X
default record in your monitoring plan.

You have reported an UnadjustedHourly Value of 0 in the MHV record for [param],
but the LoadRange is greater than 1. Emissions for [param] should be greater than
0 when the unit (or stack) is operating at this load level.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Informational Message

Critical Error Level 1

Informational Message

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 513 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Monitor Hourly Evaluation

C02C Monitor Hourly Evaluation for Substitute Data

H20 Monitor Hourly Evaluation

02 Dry Monitor Hourly Evaluation

02 Wet Monitor Hourly Evaluation

02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency

Page 514 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-21

Check Name:	Determine BAF Value for Monitoring System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current S02 System BAF = null
Current NOXC System BAF = null
Current FLOW System BAF = null

Continue = true

If (Current MHV Parameter == "NOXC")

If (NOx Cone Neededfor Nox Mass Calc == false)

Continue == false

If (Continue == true AND Monitor Hourly System Status == true AND Monitor Hourly Preadjusted Value Status == true AND
{Current MHV Record. ModcCode in set {01, 02, 03, 17, 18, 22, 53} OR (Current MHV Record.ModcCode in set {19, 20} AND
Current MH V Record. U n ad j listed Hourly V al lie is not null AND Current MHV Max Min Value is not null)))

If (RATA Status BAF is not null)

case (Current MHV Parameter)

S02C: Current S02 System BAF = RA TA Status BAF
NOXC: Current NOXC System BAF = RATA Status BAF
FLOW: Current FLOW System BAF = RATA Status BAF

else

return result A

Results:

Result	Response	Severity

A	The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined,	Critical Error Level 1

because the prior RATA had critical errors or because of a RATA Status error
listed on this report.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOXC RATA Status Evaluation

2	Process/Category: Emissions Data Evaluation Report	S02 RATA Status Evaluation

3	Process/Category: Emissions Data Evaluation Report	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 515 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-22

Check Name:	Calculate Bias Adjusted Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

case (Current MHV Parameter)

S02C: Current BAF = Current S02 System BAF
NOXC: Current BAF = Current NOXC System BAF
FLOW: Current BAF = Current FLOW System BAF

if (Current BAF is not null)

If (Current MHV Parameter == "FLOW")

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = Current MHV Parameter AND
UOM = "SCFH"

Calculated Adjusted Value = Current /W//K/?et'w Current MHV Max Min Value)

case (Current MHV Parameter)

S02C: S02C Calculated Adjusted Value = Current MHV Max Min Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Max Min Value
FLOW: FLOW Calculated Adjusted Value = Current MHV Max Min Value

if (Monitor Hourly Adjusted Value Status == true)

if i Current MHI Record AdjustedHourlv Value <> Current MHI Max Min Value)
If (Current MHV Record .ModcCode == 20)
return result A

else

return result C

else

case (Current MHV Parameter)

S02C: S02C Calculated Adjusted Value = Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Calculated Adjusted Value

if (Monitor Hourly Adjusted Value Status == true)

if ABS(Calculated Adjusted Value - Current MHV Record. AdjustedHourly Value) > Tolerance
return result B

else

Environmental Protection Agency

Page 516 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

case (Current MHVParameter)

S02C: S02C Calculated Adjusted Value = Current MHV Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Current MHV Calculated Adjusted Value

Results:

Result
A

B

Usage:

1

2

3

Response

You reported an MODCCode of 20 in the MHV record for [param], but the
AdjustedHourly Value does not equal 200 percent of the FullScaleRange reported in
the [comptype] span record in your monitoring plan.

The AdjustedHourly Value reported in the MHV record for [param] is not equal to
the UnadjustedHourly Value times the BAF for the [systype] MonitoringSystemID
[ID].

You reported an MODCCode of 19 in the MHV record for [param], but the
AdjustedHourly Value does not equal the DefaultHighRange reported in the
[comptype] span record in your monitoring plan.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Process/Category:
Process/Category:
Process/Category:

Emissions Data Evaluation Report	NOXC RATA Status Evaluation

Emissions Data Evaluation Report	S02 RATA Status Evaluation

Emissions Data Evaluation Report	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 517 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-23

Check Name:	Initialize C02C Hourly Monitor for Substitute Data

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Parameter = "C02CSD"

C02C SD Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency

Page 518 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-24

Check Name:	Initialize 02C Hourly Monitor for Substitute Data

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHV Parameter = "02CSD"

02C SD Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency

Page 519 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOURMH V-26

Check Name:

Determine if MHV Record Needs QA Status Evaluation

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set LinearityStatusRequired = false.

Set Current Linearity Status = null.

Set RATAStatusRequired = false.

Set Current RATA Status = null.

Set RATA Status BAF = null.

Set DailyCalStatusRequired = false
Set Current Daily Cat Status = null.

Set F2L Status Required = false.

if (Monitor Hourly Mode Status == true AND

(CurrentMHVRecord ModcCode in set {01, 02, 03, 17, 18, 21, 22, 53} OR

(CurrentMHVRecord ModcCode in set {19, 20} AND CwfreM£M//F7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

case (Current MHVParameter)

S02C: S02C Calculated Adjusted Value = Current MHV Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Current MHV Calculated Adjusted Value

if (LinearityStatusRequired == true OR DailyCalStatusRequired == true)

Set DualRangeStatus = false.

Set CurrentAnalyzerRangeUsed = null.

Set ApplicableSystemlDs = null.

Set HighRangeComponentID = null.

Set LowRangeComponentID = null.

if (CurrentMHVParameter == "FLOW")

Set A pplicableComponentll) = Current MHV Record.ComponentlD

else

Set ApplicableComponentID = null.

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the ComponentID is
equal to the CurrentMHVRecord Componcn11D.

if (AnalyzerRangeRecordsByHourLocation is not found OR if more than one
AnalyzerRangeRecordsByHourLocation is found)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result A

else

if (AnalyzerRangeRecordsByHourLocation.DualRangelndicator = 1)

Set DualRangeStatus = true.

if (Analyzer Range Record.AnalyzerRangeCode = "A")

Locate the record in MonitorSpanRecordsByHourLocation for the hour and location where
the ComponentTypeCode is equal to the CuirentMHVRecord.ComponcnlTypcCodc and
the SpanScaleCode is equal to "L".

if (MonitorSpanRecordsByHourLocation is not found OR if more than one
MonitorSpanRecordsByHourLocation is found OR if the
MonitorSpanRecordsByHourLocation.ScaleTransitionPomt is null or <=0)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result B

else if (MonitorSpanRecordsByHourLocation is found AND
CurrentMH I Record Unadj ustedHourly Value >

Environmental Protection Agency

Page 521 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

MonitorSpanRecordsByHourLocation. ScaleTransitionPoint AND
CurrentMHVRecord.ModcCode <> "18")

Set CurrentAnalyzerRangeUsed = "H".

Set HighRangeComponentID = CurrentMHVRecord.Componcnt ID.
Set LowRangeComponentID = CurrentMHVRecord.Componcnt ID.

Set CurrentAnalyzerRangeUsed = "L".

Set HighRangeComponentID = CurrentMHVRecord.Componcnt ID.
Set LowRangeComponentID = CurrentMHVRecord.Componcnt ID.

Set CurrentAnalyzerRangeUsed =

AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode.
if (AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode = "H")

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and
location where the ComponentTypeCode is equal to the

CurrentMH VRecord.ComponcnlTypcCodc and the AnalyzerRangeCode is equal to
"L" AND the ComponentSerialNumber is equal to the

CurrentMH VRecord. ComponcntScri al Number (removing the phrases "HIGH", "HI",
"LOW", and "LO").

if (AnalyzerRangeRecordsByHourLocation is not found OR if more than one
AnalyzerRangeRecordsByHourLocation is found)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result C

else If (AnalyzerRangeRecordsByHourLocation is found)

Set HighRangeComponentID = CurrentMHVRecord.Componcnt ID.
Set LowRangeComponentID =

AnalyzerRangeRecordsIiyHourLocationQompowcwi ID.
else if (CurrentMHVRecord. AnalyzerRangeCode = "L")

Locate a record in AnalyzerRangeRecordsByHourLocation for the

CurrentMHVRecord.Hour where the ComponentTypeCode is equal to the
CurrentMHVRecord. ComponentTypeCode and the AnalyzerRangeCode is equal to
"H" AND the ComponentSerialNumber is equal to the

CurrentMHVRecord.ComponentSerialNumber (removing the phrases "HIGH", "HI",
"LOW", and "LO").

if (AnalyzerRangeRecordsByHourLocation is not found OR if more than one
AnalyzerRangeRecordsByHourLocation is found)

Environmental Protection Agency

Page 522 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result C

else If (AnalyzerRangeRecordsByHourLocation is found)

Set LowRangeComponentID = CurrentMHVRecord.Componcnt ID.
Set HighRangeComponentID =

AnalyzerRangeRecordsIiyHourLocation.Qom"powc\\{ ID.

Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation. An&lyzerRmgeCode.

if {CurrentAnalyzerRangeUsed = "H")

Set HighRangeComponentID = CurrentMHVRecord.Componcnt ID.

else

Set LowRangeComponentID = CurrentMHVRecord.Componcnt ID.

if {CurrentAnalyzerRangeUsed = "H")

Set ApplicableComponentID = HighRangeComponentID.

else

Set ApplicableComponentID = LowRangeComponentID.

For each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to
the ApplicableComponentID

Append MonitorSystemComponentRecordsliyHourL ocation Sy stem ID to ApplicableSystemlDs.

if {MonitorSystemComponentRecordsByHourLocation is not found)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result D

Environmental Protection Agency

Page 523 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

D

Response

You did not report one (and only one) valid Analyzer Range record in your
monitoring plan for ComponentID [COMPID] for this hour. The QA Status of the
linearity and/or daily calibration tests for this component will not be evaluated.
You reported that ComponentID [COMPID] is a dual-range analyzer, but you did
not report one (and only one) active low-scale [COMPT YPE] span record with a
valid ScaleTransitionPoint in your monitoring plan for this hour. The QA Status of
the linearity and/or daily calibration tests for this component will not be evaluated.
You reported that ComponentID [COMPID] is a dual-range analyzer, but the
program could not identify the alternate range component in your monitoring plan.
The QA Status of the linearity and/or daily calibration tests for this component will
not be evaluated.

You did not report any System Component records for ComponentID [compid] in
your monitoring plan for the hour. The QA Status of the linearity and/or daily
calibration tests for this component will not be evaluated.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

3

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 524 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOURMHV-27

Check Name:	Determine MHV Measure Code

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If {Current MHV Parameter == "C02CSD")

Set Monitor Measure Code Array for "C02C" to "SUB"

else If {Current MHV Parameter == "02CSD")

Set Monitor Measure Code Array for "02D" to "SUB"

Set Monitor Measure Code Array for "02W" to "SUB"

else if {Current MHV Parameter in set {S02C, NOXC, C02C, 02D, 02W, FLOW, H20} AND Monitor Measure Code Array for
the Current MHV Parameter is null)

If (Current MHV Record.ModcCodc in set {01, 02, 03, 04, 05, 16, 17, 19, 20, 21, 22, 53, 54})

Set Monitor Measure Code Array for the Current MHV Parameter to "MEASURE"
else if {Current MHV Record. ModcCode in set {06, 07, 08, 09, 10, 11, 12, 13, 15, 23, 24, 55})

Set Monitor Measure Code Array for the Current MHV Parameter to " SUB"
else if {Current MHV Record. ModcC ode == " 18"

Set Monitor Measure Code Array for the Current MHV Parameter to "MEASSUB"

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 525 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Hourly Operating Data

Environmental Protection Agency

Page 526 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-1

Check Name:	Validate Single Operating Data record for hour

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current Hourly Op Record = null
Unit Hourly Operational Status = false
Hourly Extraneous Fields = null

Count all HourlyOperatingData records with current MonitoringLocationID where
BeginHour = Current Hour AND
BeginDate = Current Date

If count == 0

Derived Hourly Checks Needed = false

if {Current Month is not April OR Annual Reporting Requirement == true)

If {Current Entity Type == "Unit" OR LME HI Method is null)

If {Reporting Period Operating == false AND Legacy Data Evaluation == true)
return result E

else

Locate Monitor Method records where the BeginDate/BeginHour is on or before the Current Date
and Hour, and the EndDate/EndHour is null or is on or after the Current Date and Hour.

If found

return result A

else if count > 1

if {Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location = -1
Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array fox the location = -1
Rpt Period NOx Rate Reported Accumulator Array for the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Rpt Period Op Time Accumulator Array for the location = -1
Rpt Period Op Hours Accumulator Array for the location = -1
Daily Op Time Accumulator Array for the location = -1

Derived Hourly Checks Needed = false
return result B

else if {Current Entity Type o "Unit" AND LME HI Method is not null)

Derived Hourly Checks Needed = false
return result D

Environmental Protection Agency

Page 527 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Current Hourly Op Record = Unique HourlyOperatingData record
Current Operating Time = Current Hourly Op 7?ecw1.0 OR Current Operating Time <0.0
Derived Hourly Checks Needed = false

if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period Op Time Accumulator Array for the location = -1
Rpt Period Op Hours Accumulator Array for the location = -1
Daily Op Time Accumulator Array for the location = -1

if (CurrentEntity Type = "Unit")

Unit OpTime Accumulator = -1

else

Stack OpTime Accumulator = -1

return result C

else

Derived Hourly Checks Needed = true
if Current Operating Time >0.0

Unit Hourly Operational Status = true

if (Current Month is not April OR Annual Reporting Requirement == true)

if (Rpt Period Op Hours Accumulator Array for this location is not null)

if (Rpt Period Op Hours Accumulator Array for this location >= 0)

Rpt Period Op Hours Accumulator Array fox this location = Rpt Period Op Hours
Accumulator + 1

else

Rpt Period Op Hours Accumulator Array for this location = 1

if (Rpt Period Op Time Accumulator Array for this location is not null)

if (Rpt Period Op Time Accumulator Array for this location >= 0)

Rpt Period Op Time Accumulator Array for this location = Rpt Period Op Time
Accumulator + Current Hourly Op Record OpcratingTimc

else

Rpt Period Op Time Accumulator Array for this location = Current Hourly Op
Record. OperatingT ime

If (Current Month is April)

if (April Op Hours Accumulator Array for this location is not null)

April Op Hours Accumulator Array for this location = April Op Hours
Accumulator + 1

else

April Op Hours Accumulator Array for this location = 1
if (April Op Time Accumulator Array for this location is not null)

Environmental Protection Agency

Page 528 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

April Op Time Accumulator Array for this location = April Op Time Accumulator
+ Current Hourly Op Record OpcratingTimc

else

April Op Time Accumulator Array for this location = Current Hourly Op
Record. OperatingT ime

if (Daily Op Time Accumulator Array for this location is not null)

if (Daily Op Time Accumulator Array for this location >= 0)

Daily Op Time Accumulator Array for this location = Daily Op Time Accumulator +

Current Hourly Op 7?ecw=0)

Rpt Period Op Days Accumulator Array for this location = Rpt Period Op Days
Accumulator + 1

else

Rpt Period Op Days Accumulator Array for this location = 1

If (Current Month is April)

if (April Op Days Accumulator Array for this location is not null)

April Op Days Accumulator Array for this location = April Op Days Accumulator +

1

else

April Op Days Accumulator Array for this location = 1

if (CurrentEntity Type = "Unit")

if (Unit OpTime Accumulator >= 0)

Unit OpTime Accumulator = Unit OpTime Accumulator + Current Hourly Op
Record. OperatingT ime

if Current Hourly Op Record. OperatingT ime > Max Unit OpTime

Max Unit OpTime = Current Hourly Op 7?ecw=0)

Stack OpTime Accumulator = Stack OpTime Accumulator + Current Hourly Op
Record. OperatingT ime

if Current Hourly Op Record. OperatingT ime > Max Stack OpTime

Max Stack OpTime = Current Hourly Op Record. OperatingT ime

Environmental Protection Agency

Page 529 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

D

Response

You did not report an Hourly Operating record for the hour.

You reported more than one Hourly Operating records for the hour. There will be

no further evaluation of the reported emissions data for this hour.

The OperatingTime reported in the Hourly Operating record is invalid. This value

must be between 0 and 1. There will be no further evaluation of the reported

emissions data for this hour.

You reported an invalid Hourly Operating record. Only the units in an LME
monitoring configuration should report this record. There will be no further
evaluation of the reported emissions data for this hour.

You did not report an Hourly Operating record for the hour. Although this was
acceptable for legacy data during a non-operating quarter, it is not allowed in
ECMPS.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Fatal

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 530 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-2

Check Name:

Count Flow, 02, and Heat Input records

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Flow Monitor Hourly Count = count of MonitorHourly ValueData records with parameter FLOW where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

02 Wet Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND MoistureBasis =

02 Dry Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND MoistureBasis =

02 Null Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND MoistureBasis is
NULL where

if 02 Null Monitor Hourly Count == 1

Current 02 Null Monitor Hourly Record = the single matching record

Heat Input Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode equal to "HI" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

// 02 Needed To Support Heat Input = false

W" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

D" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 531 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-3

Check Name:

Initialize Location Variables for the Hour

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Current Unit Is Peaking = false

Current Unit Is ARP = false

Special Fuel Burned = false

FC Factor Needed = false

FD Factor Needed = false

FWFactor Needed = false

Moisture Needed = false

H20 Missing Data Approach = null

Flow Monitor Hourly Checks Needed = false

Current MHV Parameter = null

Current DHV Parameter = null

Current DHV Record Valid = false

Current DHV Record = null

Current DHV Method = null

Current DHV System Type = null

Current DHV HBHA Value = null

CO2 Cone Checks Neededfor C02 Mass Calc = false

CO2 Cone Checks Needed for Heat Input = false

CO2 Diluent Checks Neededfor NOx Rate Calc = false

02 Dry Checks Needed for Heat Input = false

02 Dry Checks Neededfor NOx Rate Calc = false

02 Wet Checks Needed for Heat Input = false

02 Wet Checks Needed for NOx Rate Calc = false

Linearity Status Required = false

AppendixEStatusRequired = false

RATAStatusRequired = false

Current RATA Status = null

CurrentHourlyRecordforRA TA Status = null

RATAStatusBAF = null

Daily Cal Status Required = false

CO2 RATA Required = false

HI Measure Code = null.

NOXR Measure Code = null.

F2L Status Required = false

If the StackPipelD of the monitoring location begins with "CS",
set Current Entity Type = "CS"

else if the StackPipelD of the monitoring location begins with "CP",
set Current Entity Type = "CP"

else if the StackPipelD of the monitoring location begins with "MS",
set Current Entity Type = "MS"

Environmental Protection Agency

Page 532 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if the StackPipelD of the monitoring location begins with "MP",
set Current Entity Type = "MP"

else

set Current Entity Type = "Unit"

if Current Entity Type = "Unit"

Mon Qual Record Count = Find Monitor Qualification Records by Hour where
MonitoringLocationld = Current Location

Mon Qual Record. QualTypecode == "PK" OR Mon Qual Record. QualTypecode == "SK"
if Mon Qual Record Count > 0

else if Current Entity Type = "CP"

find all entries in UnitStackConfiguration table where

UnitStackConfiguration.StackPipeld = the StackPipeld for this pipe
for each matching record

set Assoc Unit = UnitStackConfiguration.Unitld

Mon Qual Record Count = Find MonitorQualification Records by Hour where
MonitoringLocationld = Assoc Unit

Mon Qual Record. QualTypecode == "PK" OR Mon Qual Record. QualTypecode == "SK"
if Mon Qual Record Count is not null

Current Unit Is Peaking = true

locate records in the UnitProgram Table where

either (a) for a unit there is a record with the location identifier for that unit, OR

(b) for a non-unit there is a record with the location identifier for a unit associated with that entity

if any records from UnitProgram table meeting these conditions exist and within those records:

PRG_CD = "ARP", CLASS <> "NA", EndDate is on or after the Current Operating Date

and either a) the EmissionsRecordingDate is not null and is on or prior to the Current Operating Date or b) the

EmissionsRecordingDate is null and the UnitMonitorCertBeginDate is not null and is on or prior to the Current Operating

Date.

Current Unit Is ARP = true
Set EarliestLocationReportDate = CurrentMonitor Plan Location Record.EdrUcslRcporlD'dlc

Current Unit Is Peaking = true

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 533 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-4

Check Name:	Verify S02 Monitor Method Active During Current Hour

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

If (Derived Hourly Checks Needed)

S02 Monitor Method Record = null

SO2 CEM Method Active For Hour = false

S02 App D Method Active For Hour = false

SO2 F23 Method Active For Hour = false

SO2 Method Code = null

S02 Fuel Specific Missing Data = false

S02 Bypass Code = null

S02 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "S02" or "S02M"

if (S02 Method Count > 1)

return result A
else if S02 Method Count == 1

SO2 Monitor Method Record = the single matched record
SO2 Method Code = S02 Monitor Method 7?ecw "LME")
return result B

else

if (S02 Monitor Method Record. SubDataC'odc begins with "FSP75")

S02 Fuel Specific Missing Data = true
SO2 Bypass Code = S02 Monitor Method Record. BypassApproachCodc

Expected Summary Value S02 Array fox this location = true

if (SO2 Monitor MethodRecord.MethodCode == "CEM")

SO2 CEM Method Active For Hour = true
else if S02 Monitor MethodRecord.MethodCode == "F23")

SO2 F23 Method Active For Hour = true
else if (S02 Monitor MethodRecord.MQthodCods == "AD")

S02 App D Method Active For Hour = true

Environmental Protection Agency

Page 534 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You have reported more than one active S02 Method record in your monitoring	Critical Error Level 1

plan for this hour.

B	You reported an invalid [param] method for a location that is part of a configuration Critical Error Level 1

of LME units.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 535 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-5

Check Name:	Determine H20 Method

Related Former Checks:

Applicability:

Description:

Specifications:

if Derived Hourly Checks Needed
H20 Method Code = null
H20 Default Value = null
H20 Default Max Value = null
H20 Default Mitt Value = null
Current Hourly H20 Table Reference = null
H20 Fuel Specific Missing Data = false

H20 Reported Value = null

H20 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "H20"

H20 Derived Hourly Count = count of DerivedHourly ValueData where ParameterCode = "H20" for current hour
H20 Monitor Hourly Count = count of MonitorHourly ValueData where ParameterCode = "H20" for current hour
if (H20 Method Count > 2

return result A
else if (H20 Method Count == 2)

If (H20 Derived Hourly Count + H20 Monitor Hourly Count > 0)

If (H20 Derived Hourly Count == 1 AND H20 Monitor Hourly Count == 0 AND the MethodCode in one
of the matched records is equal to "MWD")

Current Hourly H20 Table Reference = DerivedHourly ValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Table TJe/erewce.AdjustedHourly Value
H20 Method Code = "MWD"

else if (H20 Derived Hourly Count == 0 AND H20 Monitor Hourly Count == 1 AND the MethodCode in
one (but not both) of the matched records is equal to "MTB" or "MMS")

Current Hourly H20 Table Reference = MonitorHourly ValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Table ./?e/efe«ce.UnadjustedHourly^Value
if the MethodCode in the matched record == "MMS"

H20 Method Code = "MMS"

else

H20 Method Code = "MTB"

else

return result A
else if H20 Method Count == 1

H20 Monitor Method Record = the single matched record
H20 Method Code = H20 Monitor Method	MethodCode

if (H20 Monitor Method Record. SubDataCode begins with "FSP75")

H20 Fuel Specific Missing Data = true

if {H20 Method Code == 'MDF')

H20 Default Record Count = count active MonitoringDefaultData Records for the location where

Environmental Protection Agency

Page 536 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

ParameterCd = 'H20'

if (H20 Default Record Count == 0)

return result B
else if (H20 Default Record Count >1)

if (H20 Derived Hourly Count == 1)

Current Hourly H20 Table Reference = DerivedHourly ValueData where ParameterCode =

H20 Default Max Value = Highest DefaultValue field from active MonitoringDefaultData record for
location where ParameterCd = 'H20'

H20 Default Min Value = Lowest DefaultValue field from active MonitoringDefaultData record for
location where ParameterCd = 'H20'

If (H20 Default Max Value <= 0 OR H20 Default Min Value <= 0 OR H20 Default Max Value >=
100 OR H20 Default Min Value >= 100)

return result C

H20 Default Value = DefaultValue field from active MonitoringDefaultData record for location
where

ParameterCd = 'H20'

If (H20 Default Value <= 0 OR H20 Default Value >= 100)

return result C

else if (H20 Method Code == "MWD")

if (H20 Derived Hourly Count == 1)

Current Hourly H20 Table Reference = DerivedHourly ValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Table Reference Ad j ustcdHourly Val lie

else if (H20 Method Code == "MMS" OR H20 Method Code == "MTB")
if (H20 Monitor Hourly Count == 1)

Current Hourly H20 Table Reference = MonitorHourly ValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Table 7?e/efeMce.UnadjustedHourly^Value

H20'

else

Results:

Result
A

Response

You have reported more than one active H20 Method record in your monitoring
plan for this hour.

You reported an H20 MethodCode of MDF, but you did not report an active H20
default record in your monitoring plan for the hour.

The DefaultValue reported in the active H20 default record in your monitoring plan
is invalid.

Severity

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 537 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-6

Check Name:

Verify NOx Rate Monitor Method

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

If (Derived Hourly Checks Needed)

NOx Rate Bypass Code = null
NOx Rate Fuel Specific Missing Data = false
Current NOx Rate Monitor Method Record = null
Current NOx Rate Method Code = null

NOx Rate Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "NOXR"

if (NOx Rate Method Count > 1)

return result A
else if NOx Rate Method Count == 1

if (LME HI Method is not null)

Current NOx Rate Monitor Method Record = the single matched record
Current NOx Rate Method Code = Current NOx Rate Monitor Method 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-7

Check Name:

Verify NOx Mass Monitor Method Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed)

Current NOx Mass Monitor Method Record = null

NOx Mass Method Active For Hour = false

NOx Mass Monitor Method Code = null

NOx Mass Bypass Code = null

NOx Mass Fuel Specific Missing Data = false

NOx Mass Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "NOX" or "NOXM"

if (NOx Mass Method Count > 1)

return result A
else if NOx Mass Method Count == 1

Current NOx Mass Monitor Method Record = the single matched record

NOx Mass Monitor Method Code = NOx Mass Monitor Method	McthodC'odc

if (LME HI Method is not null AND NOx Mass Monitor Method Code <> "LME")
return result B

else

Expected Summary Value NOx Mass Array for this location = true

NOx Mass Bypass Code = Current NOx Mass Monitor Method 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

You reported more than one active NOX Method record in your monitoring plan for
this hour.

You reported an invalid [param] method for a location that is part of a configuration
of LME units.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 540 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-8

Check Name:

Verify C02 Method Active During Current Hour

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed)

C02 Monitor Method Record = null
C02 CEM Method Active For Hour = false
CO 2 App D Method Active For Hour = false
CO2 Fuel Specific Missing Data = false
CO2 Method Code = null

// AD and CEMs are possible method codes

C02 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "C02" or "C02M"

if (CO2 Method Count > 1)

return result A
else if C02 Method Count == 1

CO2 Monitor Method Record = the single matched record
CO2 Method Code = C02 Monitor Method 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-9

Check Name:

Verify Heat Input Method Active During Current hour

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

If (Derived Hourly Checks Needed)

Heat Input Monitor Method Record = null
Heat Input Fuel Specific Missing Data = false
Heat Input Method Code = null
Heat Input CEM Method Active For Hour = false
Heat Input App D Method Active For Hour = false

Heat Input Method Count = Active records in MonitoringMethodData for the location where
ParameterCode begins with "HI"

if (Heat Input Method Count >1)

return result A

else if (LME HI Method is not null AND (Heat Input Method Count == 0 OR ParameterCode in the matched record is not
equal to "HIT"))

return result B

else if (Heat Input Method Count ==1)

Heat Input Monitor Method Record = the single matched record

Heat Input Method Code = Heat Input Monitor Method 7?ecw "EXP")

Expected Summary Value HI Array for this location = true

if (Heat Input Monitor Method Records arameterCode == "HI")

Apportionment HI Method Array for this location = Heat Input Method Code

Environmental Protection Agency

Page 542 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You have reported more than one active HI Method record in your monitoring plan Critical Error Level 1

for this hour.

B	You did not report an HIT Method record for this location in your monitoring plan, Critical Error Level 1

which is required for all locations that are part of a configuration of LME units.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 543 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-17

Check Name:

Verify Single S02 Derived Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

S02 Derived Checks Needed = false
S02M Derived Checks Needed = false
Current S02 Derived Hourly Record = null
F23 Default Max Value = null
F23 Default Mitt Value = null
F23 Default Value = null

S02 Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "S02" or " S02M" where

Else if (S02 Derived Hourly Count > 0 AND S02 Method Code is null)

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result B
Else if {SO2 Derived Hourly Count > 1)

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array fox the location = -1
return result C

Else if (S02 Derived Hourly Count > 0 AND S02 Method Code == "AD" AND Hourly Fuel Flow Count for Gas
+ Hourly Fuel Flow Count for Oil == 0)

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array fox the location = -1
return result G
Else if (S02 Derived Hourly Count == 1)

Current S02 Derived Hourly Record = DerivedHourly ValueData rec matching with param S02 or S02M
where Current Date = DerivedHourly ValueData.Date and Current Houx = DerivedHourly ValueData.Hour

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If (LME HI Method is not null)

If (SO2 Method Code == "LME")

If (Current S02 Derived Hourly Record ParameterCode == "S02M")
S02M Derived Checks Needed = true

else

Rpt Period S02 Mass Reported Accumulator Array for the location = -1

Environmental Protection Agency

Page 544 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Rpt Period S02 Mass Calculated Accumulator Array fox the location = -1
return result H

else

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1

else

If (Current S02 Derived Hourly Record ParamctcrCodc == "S02M")

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result H

else

SO2 Derived Checks Needed = true

If (S02 Method Code in set {CEMF23,AMS})

if (S()2 Method Code == "CEMF23")

SO2 CEM Method Active For Hour = true

if (Current S02 Derived Hourly 7?ecw 1)

F23 Default Max Value = Highest DefaultValue field from active
MonitoringDefaultData record for location where ParameterCd = 'S02R' and

Environmental Protection Agency

Page 545 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

DefaultPurposeCd = 'F23'

F23 Default Min Value = Lowest DefaultValue field from active
MonitoringDefaultData record for location where ParameterCd = 'S02R' and
DefaultPurposeCd = 'F23'

If (F23 Default Max Value <= 0 OR F23 Default Min Value <= 0)

return result E

else

F23 Default Value = DefaultValue field from active MonitoringDefaultData
record for location where ParameterCd = 'S02R' and DefaultPurposeCd = 'F23'

If (F23 Default Value <= 0)

return result E

else

If SO2 Derived Hourly Count > 0

Return result F

Results:

Result

A

B

C
D

E

F

G

H

Response

You did not report a DHV record for S02 (or S02M) for the hour.

You reported a DHV record for S02 (or S02M), but you did not report an active

S02 method record in your monitoring plan for the hour.

You reported more than one DHV records for S02 (or S02M) for the hour.

You did not report an active S02R default record in your monitoring plan for use in

F23 calculation for the hour.

The DefaultValue reported in the active S02R F23 default record in your monitoring
plan is invalid.

You reported a DHV record for S02 (or S02M), but this is not appropriate for a
non-operating hour.

You reported a DHV record for [param], but you did not report any Hourly Fuel
Flow records at the location.

The ParameterCode reported in the DHV record does not match the ParameterCode
in the Method record in your monitoring plan used to determine [eparam].

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 546 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-18

Check Name:	Verify Single S02 Concentration record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current S02 Monitor Hourly Record = null

SO2 Monitor Hourly Count = count of MonitorHourlyValueDate records with param "S02C" where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
If Unit Hourly Operational Status = true

If (SO2 Monitor Hourly Count >0 AND SO2 CEM Method Active For Hour == false)

Return result A
Else if (SO2 Monitor Hourly Count >1)

Return result B

Else if (SO2 Monitor Hourly Count == 1 AND SO2 CEM Method Active For Hour == true)

Current S02 Monitor Hourly Record = MonitorHourly ValueData rec with param S02C where
CurrentDate = MonitorHourly ValueData.Date and
CurrentHour = MonitorHourly ValueData.Hour

Else

if {SO2 Monitor Hourly Count > 0)

return result C

Results:

Error Level 1

Error Level 1
Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Result	Response	Seventy

A	You reported an MHV record for S02C, but you did not report an active S02	Critical

method record in your monitoring plan for the hour.

B	You reported more than one MHV record for S02C for the hour.	Critical

C	You reported an MHV record for S02C, but this is not appropriate for a	Critical

non-operating hour.

Environmental Protection Agency

Page 547 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-19

Check Name:

Verify Single NOx Concentration Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current NOx Cone Monitor Hourly Record = null

NOx Cone Monitor Hourly Count = count of MonitorHourly ValueDate records with param "NOXC" where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

if Unit Hourly Operational Status = true

if (NOx Cone Monitor Hourly Count >1)

Return result A
Else if (NOx Cone Monitor Hourly Count == 1)

If (NOx Mass Monitor Method Code in {CEM, CEMNOXR, AMS} OR Current NOx Rate Method Code in

{CEM,AMS})

Current NOx Cone Monitor Hourly Record = MonitorHourly ValueData rec with param "NOXC" where

CurrentDate = MonitorHourly ValueData.Date and
CurrentHour = MonitorHourly ValueData.Hour

else

return result B

Else

if (NOx Cone Monitor Hourly Count >0)

return result C

Results:

Result

A

B

Response

You reported more than one MHV record for NOXC for the hour.

You reported an MHV record for NOXC, but you did not report an appropriate
NOXR or NOX method record in your monitoring plan for the hour.
You reported an MHV record for NOXC, but this is not appropriate for a
non-operating hour.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 548 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-20

Check Name:

Related Former Checks:

Verify Single NOx Rate Derived Hourly Record

Applicability:

Description:

Specifications:

CEM Check

If (Derived Hourly Checks Needed == true)

NOx Rate Derived Checks Needed = false

NOx Rate Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "NOXR" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op 7?ecw 0

If (NOx Rate Derived Hourly Count == 0 AND Current NOx Rate Method Code is not null)

Return result A

Else if (NOx Rate Derived Hourly Count > 0 AND Current NOx Rate Method Code is NULL)

Rpt Period NOx Rate Reported Accumulator Array fox the location = -1
Rpt Period NOx Rate Calculated Accumulator Array fox the location = -1
Return result B
Else if (NOx Rate Derived Hourly Count >1)

Rpt Period NOx Rate Reported Accumulator Array fox the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Return result C
Else if (NOx Rate Derived Hourly Count == 1)

Current NOx Rate Derived Hourly Record = DerivedHourly ValueData rec matching param NOXR
NOx Rate Derived Checks Needed = true

Apportionment NOXR Method Array at this location = Current NOx Rate Method Code
If (Current NOx Rate Method Code == "AMS")

if (Current NOx Rate Derived Hourly 7?ecw 0

Return result D

Environmental Protection Agency

Page 549 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

C
D

Response

You did not report a DHV record for NOXR for the hour.

You reported a DHV record for NOXR, but you did not report an active NOXR

method record in your monitoring plan for the hour.

You reported more than one DHV record for NOXR for the hour.

You reported a DHV record for NOXR, but this is not appropriate for a

non-operating hour.

This check result is obsolete.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

No Errors

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 550 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-21

Check Name:

Verify Single NOx Mass Derived Hourly Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

NOx Mass Derived Checks Needed = false
NOXM Derived Checks Needed = false
Current NOx Mass Derived Hourly Record = null

NOx Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "NOX" or "NOXM"

If Current Hourly Op 7?ecw 0

If (NOx Mass Derived Hourly Count == 0 AND (NOx Mass Method Active For Hour == true OR NOx Mass
Monitor Method Code == "LME"))

Return result A

Else if (NOx Mass Derived Hourly Count > 0 AND NOx Mass Method Active For Hour == false AND NOx Mass
Monitor Method Code o "LME")

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Return result B

Else if (NOx Mass Derived Hourly Count >1)

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Return result C

Else if (NOx Mass Derived Hourly Count > 0 AND Current NOx Rate Method Code == "AE" AND Hourly Fuel
Flow Count for Gas + Hourly Fuel Flow Count for Oil == 0)

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Return result E

Else if (NOx Mass Derived Hourly Count == 1)

Current NOX Mass Derived Hourly Record = DerivedHourly ValueData rec matching with param NOX or
NOXM where Current Date = DerivedHourly ValueData.Date and Current Hour =

DerivedHourly ValueData.Hour

If (LME HI Method is not null)

If (NOx Mass Monitor Method Code == "LME")

if (Current NOX Mass Derived Hourly Record.ParameterCode == "NOXM")

NOXM Derived Checks Needed = true

else

where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

Environmental Protection Agency

Page 551 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
retunr result F

else

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1

else

if (Current NOX Mass Derived Hourly Record ParamctcrCodc == "NOXM")

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
retunr result F

else

NOx Mass Derived Checks Needed = true

If (NOx Mass Monitor Method Code in set {AMS, CEMNOXR})

If (NOx Rate Derived Hourly Count >0)

NOx Mass Monitor Method Code = "NOXR"

Else if (NOx Mass Monitor Method Code == "CEMNOXR")
NOx Mass Monitor Method Code == "CEM"

Else if (Current NOx Mass Derived Hourly 7?ecw 0

Return result D

Environmental Protection Agency

Page 552 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

C
D

E

F

Response

You did not report a DHV record for NOX (or NOXM) for the hour.

You reported a DHV record for NOX (or NOXM), but you did not report an active
NOX (or NOXM) method record in your monitoring plan for the hour.

You reported more than one DHV record for NOX (or NOXM) for the hour.
You reported a DHV record for NOX (or NOXM), but this is not appropriate for a
non-operating hour.

You reported a DHV record for [param], but you did not report any Hourly Fuel
Flow records at the location.

The ParameterCode reported in the DHV record does not match the ParameterCode
in the Method record in your monitoring plan used to determine [eparam].

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 553 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-22

Check Name:	Verify Single C02 Mass Derived Hourly Value Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

CO 2 Mass Derived Checks Needed = false
Current C02 Mass Derived Hourly Record = null
C02M Derived Checks Needed = false

C02 Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode beginning with " C02"
where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op 7?ecw 0

If (CO 2 Mass Derived Hourly Count == 0 AND CO 2 Method Code is not null AND CO 2 Method Code <> "FSA")
If (CO2 Method Code == "AD")

If (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil >0)

return result A

else

Return result A

Else if (CO 2 Mass Derived Hourly Count > 0 AND (CO 2 Method Code is null OR CO 2 Method Code == "FSA"))
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
return result B
Else if (CO 2 Mass Derived Hourly Count > 1)

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
Return result C

Else if (CO 2 Mass Derived Hourly Count > 0 AND CO 2 Method Code == "AD" AND Hourly Fuel Flow Count
for Gas+ Hourly Fuel Flow Count for Oil == 0)

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location = -1
Return result E
Else if (CO 2 Mass Derived Hourly Count ==1)

Current C02 Mass Derived Hourly Record = DerivedHourly ValueData rec matching with param C02 or
C02M where Current Date = DerivedHourly ValueData.Date and Current Hour =

DerivedHourly ValueData.Hour

If (LME HI Method is not null)

If (CO2 Method Code == "LME")

if (Current C02 Mass Derived Hourly Record. ParameterCode == "C02M")
C02M Derived Checks Needed = true

else

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1

Environmental Protection Agency

Page 554 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result F

else

Rpt Period C02 Mass Reported Accumulator Array fox the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1

else

if (Current C02 Mass Derived Hourly 7?ecw 0

Return result D

Results:

Result	Response	Severity

A	You did not report a DHV record for C02 (or C02M) for the hour.	Critical Error Level 1

B	You reported a DHV record for C02 (or C02M), but you did not report an active	Critical Error Level 1

C02 (or C02M) method record in your monitoring plan for the hour.

C	You reported more than one DHV records for C02 (or C02M) for the hour.	Critical Error Level 1

D	You reported a DHV record for C02 (or C02M), but this is not appropriate for a	Critical Error Level 1

non-operating hour.

E	You reported a DHV record for [param], but you did not report any Hourly Fuel	Critical Error Level 1

Flow records at the location.

F	The ParameterCode reported in the DHV record does not match the ParameterCode Critical Error Level 1

in the Method record in your monitoring plan used to determine [eparam].

Environmental Protection Agency

Page 555 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 556 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-23

Check Name:

Verify C02 Cone Derived and Monitor Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current C02 Cone Derived Hourly Record = null

Current C02 Cone Monitor Hourly Record = null

Current C02 Cone Missing Data Monitor Hourly Record = null

C02 Cone Derived Checks Needed = false

CO2 Cone Monitor Checks Needed = false

02 Dry Needed to Support C02 Calculation = false

02 Wet Needed to Support C02 Calculation = false

C02 Cone Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "C02C" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

CO2 Cone Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "C02C" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Total C02 Cone Records = C02 Cone Derived Hourly Count + C02 Cone Monitor Hourly Count

If (Current Hourly Op Record. OperatingTime >0)

If (CO2 Cone Checks Neededfor Heat Input == true OR CO2 Diluent Checks Neededfor NOx Rate Calc == true OR C02
Cone Checks Neededfor C02 Mass Calc = true)

If (CO 2 Cone Monitor Hourly Count == 0 AND (CO 2 Cone Checks Neededfor Heat Input == true OR CO 2
Diluent Checks Needed for NOx Rate Calc == true))
return result B

else if (Total C02 Cone Records == 0)
return result A

else if (CO2 Cone Monitor Hourly Count == 2 AND CO2 Cone Derived Hourly Count == 0 AND CO2 Diluent
Checks Neededfor NOx Rate Calc == true AND (CO 2 Cone Checks Needed for Heat Input == true OR C02 Cone
Checks Neededfor C02 Mass Calc = true)

Current C02 Cone Monitor Hourly Record = Find MonitorHourly ValueData records with ParameterCode =
"C02C" and MODCCode in set {01, 02, 03, 04, 53, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Current C02 Cone Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "C02C" and MODCCode not in set {01, 02, 03, 04, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Environmental Protection Agency

Page 557 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (Current C02 Cone Monitor Hourly Record is null OR Current C02 Cone Missing Data Monitor
Hourly Record is null)
return result C

else

CO2 Cone Monitor Checks Needed = true

else if (Total C02 Cone Records >1)
return result C

else if (CO2 Cone Derived Hourly Count == 1)

CO2 Cone Derived Checks Needed = true

Current C02 Cone Derived Hourly Record = matching DerivedHourly ValueData rec

if (Current C02 Cone Derived Hourly Record.MODCCode in set {01, 02, 03, 04, 05, 21, 53, 54}

Fc Factor Needed = true
Fd Factor Needed = true

If (Current C02 Cone Derived Hourly Record.Formula Id Key is not null)

C02C Formula record = Find MonitoringFormulaData record where

MonitoringFormulalDKey = Current C02 Cone Derived Hourly
Record.Formula Id Key

If (C02C Formula record is not null)

If (C02CFormula record.ParameterCode == "C02C")

If (C02C Formula record.EquationCode == "F-14A")

02 Dry Needed to Support C02 Calculation = true

else if (C02C Formula record.EquationCode == "F-14B")
02 Wet Needed to Support C02 Calculation = true
Moisture Needed = true

else if (CO2 Cone Monitor Hourly Count == 1)

CO2 Cone Monitor Checks Needed = true

Current C02 Cone Monitor Hourly Record = matching MonitorHourly ValueData rec

else

If (Total C02 Cone Records > 0)

Return result D

else

If (Total C02 Cone Records > 0)

Return result E

Environmental Protection Agency

Page 558 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

A

B

C

D

Response

You did not report a MHV or DHV record for C02C for the hour.

You did not report an MHV record for C02C for the hour.

You reported more than one MHV and/or DHV records for C02C for the hour.

You reported a MHV or DHV record for C02C, but this record is not required to

calculate emissions.

You reported a MHV or DHV record for C02C, but this is not appropriate for a
non-operating hour.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 559 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-24

Check Name:	Count Hourly Fuel Flow Records

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

Hourly Fuel Flow Count For Oil = 0
Hourly Fuel Flow Count For Gas = 0

Appendix D Method Active = Heat Input App D Method Active For Hour OR

CO 2 App D Method Active For Hour OR
S02 App D Method Active For Hour

Hourly Fuel Flow List = set of all DerivedHourlyValueData records

Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

For each record (Current Hourly Fuel Flow Record) in Hourly Fuel Flow List

Cur Fuel Code = Current Hourly Fuel Flow Record.FuelCode
if (Cur Fuel Code is null)
return result D

Current Fuel Group = select FuelGroupCode from FuelCode Table where FuelCode = Cur Fuel Code
if (Current Fuel Group is null)

return result D
else If Current Fuel Group == "GAS"

Add 1 to Hourly Fuel Flow Count For Gas
else if Current Fuel Group == "OIL"

Add 1 to Hourly Fuel Flow Count For Oil

Hourly Fuel Flow Count = Hourly Fuel Flow Count For Gas + Hourly Fuel Flow Count For Oil

If (CurrentHourly Op 7?ecw 0)

Return result A

else

if (Appendix D Method Active = true AND Hourly Fuel Flow Count == 0 AND MP Pipe Config for Hourly
Checks is null)

Return result B

else if (Appendix D Method Active = false AND Hourly Fuel Flow Count >0)

return result C

Environmental Protection Agency

Page 560 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A
B
C

D

Response

You reported an HFF record, but this is not appropriate for a non-operating hour.
You did not report an HFF record for the hour.

You reported a HFF record, but you did not report an active AD or AE method

record in your monitoring plan for the hour.

The FuelCode reported in the HFF record is missing or invalid.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 561 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

Unit is Load Based = false

Location Name = Current Monitor Plan Location Record LOC'ATION_NAME

if the Location Name begins with "CS" or "CP" or "MS" or "MP"

Locate all Unit Stack Configuration records where the stack/pipe location is the monitoring location, the BeginDate is on or
before the Current Date, and the EndDate is null or is on or after the Current Date.

If the NonLoadBasedlndicator in all of the retrieved records is equal to 1,

Unit is Load Based = false

else

Unit is Load Based = true

else // current location is a unit

if the NonLoadBasedlndicator field for the unit = 1
Unit is Load Based = false

else

Unit is Load Based = true

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

HOUROP-30

Determine Load Based Status of unit
General Check

Severity

Operating Hour Evaluation

Environmental Protection Agency

Page 562 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-32

Check Name:

Related Former Checks:

Perform Load Checks for Operating Hour

Applicability:

Description:

Specifications:

General Check

if (Current Hourly Op Record is not null)

Apportionment OpTime Array for this location = Current Hourly Op Record. OperatingTime
Apportionment Load Array for this Location = Current Hourly Op Record. HourlyLoad

if (Unit is Load Based == true and Current Hourly Op Record. OperatingTime > 0.0)

if (Current Hourly Op Record.HourLoad is null OR Current Hourly Op 7?ecw= 0)

Unit LoadTimesOpTime Accumulator = Unit LoadTimesOpTime Accumulator +
(Current Hourly Op Record.HourLoad * Current Hourly Op
Record. OperatingT ime)

else if (Current Entity Type in set {CP, MP})

if (Pipe LoadTimesOpTime Accumulator >= 0)

Pipe LoadTimesOpTime Accumulator = Pipe LoadTimesOpTime Accumulator +
(Current Hourly Op Record.HourLoad * Current Hourly Op
Record. OperatingT ime)

else

if (Stack LoadTimesOpTime Accumulator >= 0)

Stack LoadTimesOpTime Accumulator = Stack LoadTimesOpTime Accumulator +
(Current Hourly Op Record.HourLoad * Current Hourly Op
Record. OperatingT ime)

if Current Hourly Op 7?ecw "INVALID" AND MP Load UOM <> Current

Hourly Op7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

return result C

else

if (MPLoad UOM is null)

MP Load UOM = Current Hourly Op Ttecon/.LoadUnitsOfMeasureCode

Locate the MonitorLoadRecordsByHourandLocation record for the hour and location.

If (only one record is found AND Monitor I. oadRecordByHourandL ocation. M a \ i m urn Lo ad Va 1 lie is
greater than 0),

If i Current Hourly Op 7?ecw "Unit" OR (MP Stack Config for Hourly
Checks o "CS" AND MP Pipe Config for Hourly Checks <>

"CP"))

return result K

else

return result I

else

return result J

else if (Current Hourly Op Record.OperatingTime ==0.0)
if i Current Hourly Op Record.HourLoad is not null)
return result D

if Current Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B
C

D

E
F
G
H

I
J
K

Usage:

1

Response

The HourLoad reported in the Hourly Operating record is invalid. The value must
be greater than or equal to 0.

The LoadUnitsOfMeasureCode reported in the Hourly Operating record is invalid.
You did not report the same LoadUnitsOfMeasureCode for all locations in the
configuration.

You reported HourLoad in the Hourly Operating record. This field should be blank
for a non-operating hour.

You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This
field should be blank for a non-operating hour.

You reported HourLoad in the Hourly Operating record. This field should be blank
for a non-load-based unit.

You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This
field should be blank for a non-load-based unit.

Warning: The HourLoad reported in the Hourly Operating Data record is higher
than the MaximumLoadValue in the Monitoring Load record reported in your
monitoring plan. Sources are required to periodically (at least once annually)
evaluate the appropriateness of these maximum values in the monitoring plan and
make proper adjustments when necessary. You should investigate the cause of
these exceedances and determine whether an adjustment to the
MaximumLoadValue in your monitoring plan is necessary.

The [fieldname] does not correspond to the MaximumLoadUnitsOfMeasure
reported in the monitoring plan.

You did not have one and only one valid Monitor Load record that was active
during the hour.

The LoadRange or CommonStackLoadRange reported in the Hourly Operating
record is inconsistent with the HourLoad. When no load is generated, the load
range should be less than 2.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Informational Message

Critical Error Level 2

Critical Error Level 1

Informational Message

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 565 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-33

Check Name:

Check reported Fuel Code for Operating Hour

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

if (Current Hourly Op Record is not null)

Fuel Code Validation Needed = false

If (NOx Rate Fuel Specific Missing Data == true OR NOx Mass Fuel Specific Missing Data == true OR S02 Fuel Specific
Missing Data == true OR CO 2 Fuel Specific Missing Data == true OR Heat Input Fuel Specific Missing Data == true OR
H20 Fuel Specific Missing Data == true)

Fuel Code Validation Needed = true

else

if (Current S02 Monitor Hourly Record is not null AND S02 Bypass Code == "B YMAXFS" )
if (Current S02 Monitor Hourly Record.MODCCode == 23)

Fuel Code Validation Needed = true

if (Current NOx Cone Monitor Hourly Record is not null AND NOx Mass Bypass Code == "B YMAXFS" )
if (Current NOx Cone Monitor Hourly Record.MODCCode in set {23,24})

Fuel Code Validation Needed = true

if (Current NOx Rate Derived Hourly Record is not null AND NOx Rate Bypass Code == "B YMAXFS" )
if (Current NOx Rate Derived Hourly Record.MODCCode in set {23,24})

Fuel Code Validation Needed = true

if (Fuel Code Validation Needed == true)

if (Current Hourly Op Record .V \xc\Co6lC is null)

Current Flourly Fuel Group Code = FuelGroupCode from FuelCode table entry where

FuelCode = Current Hourly Op Record.FuelCode
if (Current Hourly Op Record.FuelCode = "NFS" OR

(Current Flourly Fuel Group Code == "COAL" AND Current Hourly Op Record.FuelCode o "C"))
return result B

else if (Current Hourly Op Record .V ac\Qo&c is not null)

if (S02 Bypass Code <> "B YMAXFS" AND NOx Rate Bypass Code <> "B YMAXFS" AND NOx Mass Bypass
Code o "BYMAXFS")
return result C

If (Current Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You did not report a FuelCode in the Hourly Operating record.	Critical Error Level 1

B	The FuelCode reported Hourly Operating record is invalid.	Critical Error Level 1

C	You reported a FuelCode in the Hourly Operating record. This value should only	Critical Error Level 1

be reported if you use fuel-specific missing data or have an unmonitored bypass
stack that reports emissions based on fuel-specific maximum values.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 567 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-34

Check Name:

Validate Reported FC Factor

Related Former Checks:
Applicability:

General Check

Description:

Validation Tables:

F-Factor Range Checks (Cross Check Table)

Specifications:

if FC Factor Needed = true

Valid FC Factor Exists = false

if (Current Hourly Op Record.FcFactor is null)
return result A

else if (Current Hourly Op Record.FcFactor <=0)
return result A

else

Valid FC Factor Exists = true
if (Special Fuel Burned = false)

FC Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor =
"FC"

FC Factor Maximum = Lookup Upper from Cross-Check Table "F-Factor Range Checks" where Factor =
"FC"

if (Current Hourly Op Record.FcF actor > FC Factor Maximum OR Current Hourly Op Record. FcF actor <
FC Factor Minimum)

return result B

Results:

Result

A

B

Response

The [FNAME] reported in the Hourly Operating record is missing or invalid.
The [FNAME] reported in the Hourly Operating record is outside of the expected
range from [MIN] to [MAX],

Severity

Critical Error Level 1
Critical Error Level 2

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 568 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-35

Check Name:

Validate Reported FD Factor

Related Former Checks:

Applicability:

Description:

Validation Tables:

F-Factor Range Checks (Cross Check Table)

Specifications:

if FD Factor Needed = true

Valid FD Factor Exists = false

if (Current Hourly Op Record.FdFactor is null)
return result A

else if (Current Hourly Op Record.FdFactor <=0)
return result A

Valid FD Factor Exists = true

if (Special Fuel Burned = false)

FD Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor =
"FD"

FD Factor Maximum = Lookup Upper from Cross-Check Table "F -Factor Range Checks" where Factor =
"FD"

if (Current Hourly Op Record. FdF actor > FD Factor Maximum OR Current Hourly Op Record.FdF actor <
FD Factor Minimum)

return result B

else

Results:

Result

A

B

Response

The [FNAME] reported in the Hourly Operating record is missing or invalid.
The [FNAME] reported in the Hourly Operating record is outside of the expected
range from [MIN] to [MAX],

Severity

Critical Error Level 1
Critical Error Level 2

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 569 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-36

Check Name:

Validate Reported FW Factor

Related Former Checks:
Applicability:

General Check

Description:

Validation Tables:

F-Factor Range Checks (Cross Check Table)

Specifications:

if FW Factor Needed = true

Valid FW Factor Exists = false

if (Current Hourly Op Record.FwFactor is null)
return result A

else if (Current Hourly Op Record.FwFactor <= 0)
return result A

Valid FW Factor Exists = true

if (Special Fuel Burned = false)

FW Factor Minimum = Lookup Lower from Cross-Check T able "F-F actor Range Checks" where F actor =
"FW"

FWFactor Maximum = Lookup Upper from Cross-Check Table "F-Factor Range Checks" where Factor =
"FW"

if (Current Hourly Op Record. FwFactor > FW Factor Maximum OR Current Hourly Op Record. F\vF actor
< FW Factor Minimum)

return result B

else

Results:

Result

A

B

Response

The [FNAME] reported in the Hourly Operating record is missing or invalid.
The [FNAME] reported in the Hourly Operating record is outside of the expected
range from [MIN] to [MAX],

Severity

Critical Error Level 1
Critical Error Level 2

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 570 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-37

Check Name:

Verify Single Heat Input Derived Hourly Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current Heat Input Derived Hourly Record= null
Heat Input Derived Checks Needed = false
HIT Derived Checks Needed = false

Heat Input Derived Hourly Count = # of DerivedHourlyValueData record with parameter beginning with "HI" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

If Current Hourly Op 7?ecw 0
If (Heat Input Derived Hourly Count == 0)

If {Heat Input Method Code is not null)

Else if (Heat Input Derived Hourly Count > 0 AND

{Heat Input Method Code is null OR
Heat Input Method Code == "EXP" OR

{Heat Input Method Code== "LTFF" AND Current Entity Type == "CP"))

Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result B
Else if (Heat Input Derived Hourly Count >1)

Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result C

Else

Current Heat Input Derived Hourly Record= DerivedHourlyValueData record with parameter "HI" or "HIT" where

If {Heat Input Method Code not in set {EXP, LTFF})
return result A

else if {Heat Input Method Code == "LTFF" AND Current Entity Type== "Unit")
return result A

Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

If {LME HI Method is not null)

if {Current Heat Input Derived Hourly Record.ParameterCode == "HIT")
HIT Derived Checks Needed = true

else

Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result E

else

if {Current Heat Input Derived Hourly Record.ParameterCode == "HIT")
Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result E

Environmental Protection Agency

Page 571 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

Heat Input Derived Checks Needed = true

If (Heat Input Method Code == "AMS")

if (Current Heat Input Derived Hourly 7?ecw 0
return result D

Results:

Result
A

B

C
D

Response

You did not report a DHV record for HI (or HIT) for the hour. If you have entered
LME data via the LME Emissions Data Utility, this error indicates that you have
not yet generated your quarterly emissions data. You must do this by clicking on
the Generate Emissions Data link on the LME Emissions Data Utility submenu.
You reported a DHV record for HI (or HIT), but, according to the monitoring
methods in your monitoring plan, you should not report hourly heat input at this
location.

You reported more than one DHV record for HI (or HIT) for the hour.

You reported a DHV record for HI (or HIT), but this is not appropriate for a
non-operating hour.

The ParameterCode reported in the DHV record does not match the ParameterCode
in the Method record in your monitoring plan used to determine [eparam].

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 572 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-38

Check Name:

Determine Fuel Type

Related Former Checks:

Applicability:

General Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

If Current Hourly Op Record.FcFactor is not null OR Current Hourly Op Record.FdFactor is not null OR Current Hourly
Op Record.FwFactor is not null

If (Hourly Fuel Flow Count For Oil + Hourly Fuel Flow Count For Gas == 0)

If (Current Hourly Op Record.FuelCd is null OR Current Hourly Op Record.FuelCd == "MIX")

Count all active UnitFuel records for the location where
FuelCd in set {OOL, PRG, PRS, OGS}

If count > 0

Special Fuel Burned = true

else if Current Hourly Op Record UnitFlie 1Cd in set {OOL, PRG, PRS, OGS}

Special Fuel Burned = true

Results:

Result

Response

Severity

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 573 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-39

Check Name:

Verify Single H20 Cone Derived or Monitor Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

H20 Monitor Hourly Checks Needed = false
H20 Derived Hourly Checks Needed = false
Current H20 Monitor Hourly Record = null
Current H20 Derived Hourly Record = null
02 Wet Checks Neededfor H20= false
02 Dry Checks Needed for H20= false

If Current Hourly ()p Record OpcratingTimc >0.00

If (Moisture Needed == true)

If H20 Monitor Hourly Count + H20 Derived Hourly Count == 0

If (H20 Method Code == "MWD")
return result A

Else if (H20 Method Code <> "MDF")
return result B

Else if H20 Default Max Value is not null
return result C

Else if (H20 Derived Hourly Count >1)

return result D

Else if (H20 Monitor Hourly Count >1)

return result E

Else if (H20 Derived Hourly Count == 1 AND H20 Method Code in set {MTB, MMS})

return result F

Else if (H20 Monitor Hourly Count == 1 AND H20 Method Code in set {MWD, MDF})

return result G

Else if (H20 Monitor Hourly Count ==1)

Current H20 Monitor Hourly Record = MonitorHourly ValueData record matching with ParameterCode =

"H20" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

H20 Monitor Hourly Checks Needed = true

Else if (H20 Derived Hourly Count == 1)

Environmental Protection Agency

Page 574 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Current H20 Derived Hourly Record = DerivedHourly ValueData rec matching where
DerivedHourly ValueData.ParameterCode = "H20" AND
DerivedHourly ValueData.Date = Current Date AND
DerivedHourly ValueData.Hour = Current Hour

H20 Derived Hourly Checks Needed = true

if (Current H20 Derived Hourly Record.ModcCode in set {01, 02, 03, 04, 05, 21, 53, 54} AND Current H20
Derived Hourly Record. F ormul a I den ti fi cr is not null)

H20 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current H20 Derived Hourly itecorrf.Formulaldentifier

If (.H20 Formula Record is not null)

If (H20 Formula Record.ParameterCode == "H20" AND H20 Formula
Record.EquationCode in set {F-31, M-1K})

02 Wet Checks Needed for H20= true
02 Dry Checks Neededfor H20= true

else

If H20 Monitor Hourly Count + H20 Derived Hourly Count > 0

return result H

else

If H20 Monitor Hourly Count + H20 Derived Hourly Count > 0

return result I

Results:

Result
A
B
C

D

E
F

G

H

I

Response

You did not report a DHV record for H20 for the hour.

You did not report an MHV record for H20 for the hour.

You did not report a DHV record for H20 for the hour. You must report this record

if you have multiple H20 default values for different fuels.

You reported more than one DHV record for H20 for the hour.

You reported more than one MHV record for H20 for the hour.

You reported a DHV record for H20, but the H20 MethodCode is not "MWD" or

"MDF".

You reported a MHV record for H20, but the H20 MethodCode is not "MTB" or
"MMS".

You reported a DHV and/or MHV record for H20, but this record is not required to
calculate emissions.

You reported a DHV and/or MHV record for H20, but this is not appropriate for a
non-operating hour.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 575 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-40

Check Name:	Verify Single 02 Dry Monitor Hourly Value Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current 02 Dry Monitor Hourly Record = null

Current 02 Dry Missing Data Monitor Hourly Record = null

02 Dry Monitor Hourly Checks Needed = false

If Current Hourly Op 7?ecw0.00

If (02 Dry Checks Needed for Heat Input == true OR 02 Dry Checks Needed for NOx Rate Calc == true OR 02 Dry
Checks Needed To Support C02 Calculation == true OR 02 Dry Checks Neededfor H20 == true)

If (02 Dry Monitor Hourly Count == 0 AND (02 Wet Checks Needed for Heat Input == true OR 02 Wet Checks
Needed for NOx Rate Calc == true OR 02 Wet Checks Needed To Support C02 Calculation == true OR 02 Wet
Checks Needed for H20 == true))
return result A

Else if (02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count == 0)

Return result B

Else if ((02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count > 2) OR (02 Dry Monitor Hourly Count
+ 02 Null Monitor Hourly Count == 2 AND 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count ==

2))

Return result C

Else if (02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count == 2)

If (02 Dry Checks Neededfor Heat Input == true AND (02 Dry Checks Needed for NOx Rate Calc == true
OR 02 Dry Checks Needed for H20 == true))

Current 02 Dry Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and MODCCode in
set {01, 02, 03, 04, 53, 54} where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData. Hour

Current 02 Dry Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records
with ParameterCode = "02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and
MODCCode not in set {01, 02, 03, 04, 54} where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData. Hour

If (Current 02 Dry Monitor Hourly Record is null OR Current 02 Dry Missing Data Monitor
Hourly Record is null)
return result C

else

02 Dry Monitor Hourly Checks Needed = true

Environmental Protection Agency

Page 576 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else

return result C
Else if (02 Dry Monitor Hourly Count ==1)

02 Dry Monitor Hourly Checks Needed = true

Current 02 Dry Monitor Hourly Record = MonitorHourly ValueData record with ParameterCode = "02C"
AND MoistureBasis = "D" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Else if (02 Null Monitor Hourly Count == 1)

02 Dry Monitor Hourly Checks Needed = true

Current 02 Dry Monitor Hourly Record = Current 02 Null Monitor Hourly Record

else

If i ()2 Dry Monitor Hourly Count > 0)

Return result D

If (02 Null Monitor Hourly Count > 0 AND 02 Wet Checks Needed for Heat Input == false AND 02 Wet Checks
Neededfor NOx Rate Calc == false AND 02 Wet Checks Needed To Support C02 Calculation == false AND 02
Wet Checks Needed for H20 == false)
return result E

else

If i ()2 Dry Monitor Hourly Count 02 + Null Monitor Hourly Count + 02 Wet Monitor Hourly Count > 0)

Return result F

Results:

Result

A

B

C

D

E

F

Usage:

1

Response

You did not report a MHV record for 02C with a MoistureBasis of D for the hour.
You did not report a MHV record for 02C with a MoistureBasis of D (or blank) for
the hour.

You reported too many MHV records for 02C with a MoistureBasis of D (or blank)
for the hour.

You reported an MHV record for 02C with a MoistureBasis of [basis], but this
record is not required to calculate emissions.

You reported an MHV record for 02C with a blank MoistureBasis, but this record is
not required to calculate emissions.

You reported a MHV record for 02C, but this is not appropriate for a non-operating
hour.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Non-Critical Error

Non-Critical Error

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 577 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	HOUROP-41

Check Name:	Verify Single 02 Wet Monitor Hourly Value Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current 02 Wet Monitor Hourly Record = null
Current 02 Wet Missing Data Monitor Hourly Record = null
02 Wet Monitor Hourly Checks Needed = false
If Current Hourly Op Record. OperatingTime >0.00

If (02 Wet Checks Neededfor Heat Input == true OR 02 Wet Checks Needed for NOx Rate Calc == true OR 02 Wet
Checks Needed To Support C02 Calculation == true OR 02 Wet Checks Needed for H20 == true)

If (02 Wet Monitor Hourly Count == 0 AND (02 Dry Checks Neededfor Heat Input == true OR 02 Dry Checks
Neededfor NOx Rate Calc == true OR 02 Dry Checks Needed To Support C02 Calculation == true OR 02 Dry
Checks Needed for H20 == true))
return result A

Else if (02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 0)

Return result B

Else if (02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count > 2)

Return result C

Else if (02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 2

If (02 Wet Checks Neededfor Heat Input == true AND 02 Dry Monitor Hourly Count + 02 Null Monitor
Hourly Count <> 2 AND (02 Wet Checks Needed for NOx Rate Calc == true OR 02 Wet Checks Needed
forH20 == true))

Current 02 Wet Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and MODCCode in
set {01, 02, 03, 04, 53, 54} where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Current 02 Wet Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records
with ParameterCode = "02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and
MODCCode not in set {01, 02, 03, 04, 54} where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

If (Current 02 Wet Monitor Hourly Record is null OR Current 02 Wet Missing Data Monitor
Hourly Record is null)
return result C

else

02 Wet Monitor Hourly Checks Needed = true

else

Environmental Protection Agency

Page 578 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

return result C

Else if (02 Wet Monitor Hourly Count == 1)

02 Wet Monitor Hourly Checks Needed = true

Current 02 Wet Monitor Hourly Record = MonitorHourly ValueData record with ParameterCode = "02C"
AND MoistureBasis = "W" where

Else if (02 Null Monitor Hourly Count == 1)

02 Wet Monitor Hourly Checks Needed = true

Current 02 Wet Monitor Hourly Record = Current 02 Null Monitor Hourly Record

else

If (()2 Wet Monitor Hourly Count > 0)

Return result D

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Results:

Result

A

B

Response

You did not report a MHV record for 02C with a MoistureBasis of W for the hour.
You did not report a MHV record for 02C with a MoistureBasis of W (or blank) for
the hour.

You reported too many MHV records for 02C with a MoistureBasis of W (or blank)
for the hour.

You reported an MHV record for 02C with a MoistureBasis of [basis], but this
record is not required to calculate emissions.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

D

Non-Critical Error

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 579 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-42

Check Name:

Verify Single S02R Derived Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

If (Derived Hourly Checks Needed == true)

S02R Derived Checks Needed = false

S02R Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "S02R" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op Record. OperatingTime > 0

If (S02R Derived Hourly Count == 0 AND F23 Default Max Value is not null)

Return result A

Else if (S02R Derived Hourly Count > 0 AND SO2 F23 Method Active For Hour == false)

Return result B
Else if (S02R Derived Hourly Count > 1)

Return result C
Else if (S02R Derived Hourly Count == 1)

Current S02R Derived Hourly Record = DerivedHourly ValueData rec matching with param S02R where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

S02R Derived Checks Needed = true

else

If S02R Derived Hourly Count > 0

Return result D

Results:

Result

A

B

Response

You did not report a DHV record for S02R for the hour.

You reported a DHV record for S02R, but this record is not required to calculate

emissions.

You reported more than one DHV record for S02R for the hour.

You reported a DHV record for S02R, but this is not appropriate for a
non-operating hour.

Severity

Critical Error Level 1
Non-Critical Error

C
D

Critical Error Level 1
Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 580 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

HOUROP-43

Check Name:

Validate Single Stack Flow Record

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Current Stack Flow Hourly Record= null

If Flow Monitor Hourly Checks Needed == true)

If (Flow Monitor Hourly Count == 0)

Flow Monitor Hourly Checks Needed = false
return result A
Else if (Flow Monitor Hourly Count >1)
return result B

Current Stack Flow Hourly Record = MonitorHourly ValueData record with parameter FLOW where

Else

Current Date = MonitorHourly ValueData. Date and
Current Hour = MonitorHourly ValueData.Hour

else

If Flow Monitor Hourly Count > 0

return result C

Results:

Result

Response

You did not report an MHV record for FLOW for the hour.

You reported more than one MHV record for FLOW for the hour.

You reported a MHV record for FLOW, but this record is not appropriate for the

hour.

Severity

Critical Error Level 1
Critical Error Level 1
Non-Critical Error

A
B
C

Usage:

Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 581 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Category:
Linearity Status

Environmental Protection Agency

Page 582 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LINSTAT-1

Check Name:	Check Analyzer Range Exemption For Linearity Status

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set CurrentLinearityStatus = null

if i CurrentMHI "Parameter = "S02C" or CurrentMHI "Parameter = "NOXC")

Locate the record in MonitorSpanRecordsByHourLocation for the hour and location where the ComponentTypeCode is
equal to the CurrentMHVRecord.ComponcnlTypcCodc and the SpanScaleCode is equal to the
CurrentAnalyzerRangeUsed.

if (MonitorSpanRecordsByHourLocation is not found OR more than one MonitorSpanRecordsByHourLocation is found
OR if the MonitorSpanRecordsByHourLocation.SpanValue is null or <=0)

Set CurrentLinearityStatus = "Invalid Monitor Span".

else if (MonitorSpan Records By HourLocation is found and MonitorSpan Records By HourLocation Span V al lie <= 30)

Set CurrentLinearityStatus = "IC-Exempt".

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 583 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LINSTAT-2

Check Name:

Locate Most Recent Prior Linearity Test

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set Prior Linearity Record = null.

Set InvalidLinearityRecord = null.

if (CurrentLinearityStatus is null)

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the location where the ComponentID is
equal to the ApplicableComponentID and the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed and the
CalculatedTestResult is not equal to "INVALID" and the EndDate/Hour is either:

a)	prior to the CurrentMHVRecord.Date/Hour OR

b)	equal to the CurrentMHVRecord.Date/Hour and the EndMinute is less than 45 and the CalculatedTestResult is equal to
"PASSED" or "PASSAPS".

if {LinearityTestRecordsByLocationForQAStatus is found)

Set PriorLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the ApplicableComponentID and the SpanScaleCode is equal to the
CurrentAnalyzerRangeUsed and the EndDate/Hour is prior to the CurrentMHVRecord.Date/Hour and the
EndDate/Hour is greater than the PriorTestRecord.EndDsAQ/Rouv and the CalculatedTestResult is equal to
"INVALID".

if (IAnearity TestRecordsIiyLocationForQA Status is found)

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the ApplicableComponentID and the SpanScaleCode is equal to the
CurrentAnalyzerRangeUsed and the CalculatedTestResult is equal to "INVALID" and the EndDate/Hour is prior to
the CurrentMHVRecord.Date/Hour.

if (LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

Set InvalidLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

else

Results:

Result

Response

Severity

Environmental Protection Agency

Page 584 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

C02 Linearity Status Evaluation
NOX Linearity Status Evaluation
02 Dry Linearity Status Evaluation
02 Wet Linearity Status Evaluation
S02 Linearity Status Evaluation

Environmental Protection Agency

Page 585 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LINSTAT-3

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set PriorLinearityEventRecord = null,
if (CurrentLinearityStatus is null)

Locate all records in QACertificationEventRecords where:
the ComponentID is equal to the ApplicableComponentID
AND Linearity Required is equal to " Y";

AND the QACertEventDate/Hour is either:

a)	prior to the CurrentMHVRecord.Date/Hour OR

b)	equal to both the CurrentMHVRecord Date/Hour and the ConditionalBeginDate/Hour;

AND either

a)	Prior Test Record is null OR

b)	QACertEventDate/Hour is after the Prior Test Record E nd D a tc/H o ur OR

c)	QACertEventDate/Hour is equal to the Praw7es£7?ecw LowRangeComponentID OR

c)	QACertEventCode o 20, 25, 26, 30, or 172 and CurrentAnalyzerRangeUsed = "H" OR

d)	QACertEventCode <> 35 or 171 and CurrentAnalyzerRangeUsed = "L"

AND either

a)	Annual Reporting Requirement is equal to true OR

b)	QACertEventDate/Hour is on or after April 1 of the year of the CurrentMHVRecord.Date
if {QACertificationEventRecords is found)

Sort QACertificationEventRecords by QACertEventDate/Hour descending.

For each record in QACertificationEventRecords

Set PriorLinearityEventRecord = the found record in QACertificationEventRecords.
if (Priori.inearityEventRecord. Q ACcrtE vcntCode =170 and DualRangeStatus = true)

Locate the record in MonitorSpan Records By Location where the ComponentTypeCode is equal to

Environmental Protection Agency

Page 586 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

CurrentMHVReconl.ComponcnlJxpcCodc and the SpanScaleCode is equal to the
CurrentAnalyzerRangeUsed and the BeginDate/Hour is equal to the
Priori. inearityE ventRecord. Q A C crt E vcn t D a tc/H o ur.

if (MonitorSpanRecordsByLocation is found)
exit for loop.

else

set PriorLinearityEventRecord = null.

else

exit for loop.

If (PriorLinearityEventRecord is null)

If {PriorLinearity Record is null)

Set CurrentLinearityStatus = "OOC-No Prior Test or Event".

else if (InvalidLinearityRecord is not null ANDPriorLinearityEventRecord.QACertEventDate/Hour is after
InvalidTestRecord. EndD ate/Hour)

Locate the earliest record in LinearityTestRecordsByLocationForQAStatus where the ComponentID is equal to the
ApplicableComponentID, the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed, the
CalculatedTestResult is equal to "INVALID", and the EndDate/Hour is after the
Priori.inearityE««/. Q A C e rt E ve n t D a t e/ H o ur and prior to the CurrentDate/Hour.

if {LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

else

Set InvalidLinearityRecord = null.

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 587 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LINSTAT-4

Check Name:

Determine Expiration Dates For Most Recent Prior Linearity Test

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set LinearityMissingOpDatalnfo = null.

if (CurrentLinearityStatus is blank and PriorLinearity Record is not null and Priori.inearityEventRecord is null)

Set CheckForlgnoredLinearity = true.

Set PriorTestExpirationDate = null
Set PriorTestExpirationDate WithExtension = null
Set MissingOpData = false

if (Priori.ineurity Record QANccdsEva 1 uationF1 ag = "Y")

Set CurrentLinearity Status = "Prior Test Not Yet Evaluated".

else if (Priori.ineurity Record TcstRcsu 11Codc = null or Priori.ineurity Record TcstRcsu 11Codc = "FAILED" or
Priori.inearityRecord TcstRcsu 11Codc = "ABORTED")

Locate the most recent record in QACertificationEventRecords where:
the ComponentID is equal to the ApplicableComponentID
AND Linearity Required is equal to "Y";

AND the ConditionalBeginDate/Hour is:

a)	on or prior to the CurrentMHVRecord.Date/Hour AND

b)	on or after the Prior Test Record E nd D a tc/H o ur:

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode o 20, 25, 26, 30, or 172 and CurrentAnalyzerRangeUsed = "H" OR

d)	QACertEventCode <> 35 or 171 and CurrentAnalyzerRangeUsed = "L"

AND either

a)	Annual Reporting Requirement is equal to true OR

b)	QACertEventDate/Hour is on or after April 1 of the year of the CurrentHourlyRecordforRA TA Status Date
if {QACertificationEventRecords is found)

Set Prior Linearity EventRecord = found record in QACertificationEventRecords.
elseif (Priori, ineurity Record T c s t R c s u 11C o dc = null)

Environmental Protection Agency

Page 588 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentLinearityStatus = "OOC-Test Has Critical Errors",
else if (Priori.inearity Record TcstRcsu 11Codc = "FAILED")

Set CurrentLinearityStatus = "OOC-Test Failed",
else if (Priori, inearity Record T c s t R c s u 11C o dc = "ABORTED")

Set CurrentLinearityStatus = "OOC-Test Aborted".

else

Set PriorTestExpirationDate = PriorLinearityRecord.TestExpirationDate.

Set PriorTestExpirationDate WithExtension = PriorLinearityRecord.TestExpirationDateWithExtension.
if (PriorTestExpirationDate is null)

if (Annual Reporting Requirement == false)

if {Prior Linearity Record T cstEndQuartcr = "2")

Set PriorTestExpirationDate = July 30th following Prior L inearity Record E nd D a tc.

else

Set PriorTestExpirationDate = April 30th following Prior L inearity Record E nd D a tc.

else

Locate the most recent QACertificationEventRecords for the CurrentMH VRe cord C o m p o n c n 11D
where Linearity Required is equal to " Y", and the BeginDate/Hour is prior to the
PriorL inearity Record. B e ginD ate/Hour.

if (QACertificationEventRecords is found AND the LinearityCertEvent is equal to " Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
PriorL inearity Record. EndD ate/Hour)

Set PriorTestExpirationDate = the end of the quarter following the quarter of the
QACertificationEventRecords.Completion! QsiDatQ.

else if (Prior L inearity Record.GraccPcnodA nd = 1)

Set PriorTestExpirationDate = the end of the quarter of the
PriorL inearity Record. EndD ate.

else

Set PriorTestExpirationDate = the end of the quarter following the quarter of the
PriorL inearity Record. EndD ate.

Set Prior Linearity Record T cstExpirationDatc = PriorTestExpirationDate.

if (CurrentMHVRecord.Datc/Hour is ON OR BEFORE the PriorTestExpirationDate)

Environmental Protection Agency

Page 589 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentLinearityStatus = "IC".

else if (Annual Reporting Requirement == false)

Set CurrentLinearityStatus = "OOC-Expired".

else

if (PriorTestExpirationDateWithExtension is null)

Set NumberOJExtensionQuarters = 0;

For each quarter beginning with the quarter of the PriorTestExpirationDate and continuing through
the quarter prior to the quarter of the CurrentDate,

if (NumberOJExtensionQuarters = 3)

Stop looking for extensions.

else

if (EarliestLocationReportDate > the last day of the quarter being checked)
Set NumberOJExtensionQuarters = NumberOJExtensionQuarters + 1.

Locate a record in OperatingSuppDataRecordsByLocation where the
reporting period is equal to the year/quarter being checked and the
OpTypeCode = "OPHOURS".

if (OperatingSuppDataRecordsByLocation is found AND
OperatingSuppDataRecordsByLocation. Op Value <168)

Set NumberOJExtensionQuarters = NumberOJExtensionQuarters +
1.

else

Locate a record in TestExtensionExemptionRecords where the
ComponentID is equal to the ApplicableComponentID and the
ExtensionExemptionCode is equal to "RANGENU", and the
SpanScaleCode is equal to the CurrentAnalyzerRangeUsed and the
Year/Quarter is equal to the year/quarter to check.

if (TestExtensionExemptionRecords is found)

else

Set NumberOJExtensionQuarters ¦
NumberOJExtensionQuarters + 1.

else

Environmental Protection Agency

Page 590 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Locate a record in TestExtensionExemptionRecords where
the ComponentID is equal to the ApplicableComponentID
and the ExtensionExemptionCode is equal to "NONQAPB",
and the Year/Quarter is equal to the year/quarter to check.

if (TestExtensionExemptionRecords is found)

Set NumberOfExtensionQuarters =
NumberOfExtensionQuarters + 1.

else if (OperatingSuppDataRecordsByLocation is not

found)

If (the quarter being checked == 1 or 4)

Locate a LocationReportingFrequency

record for the test location where
ReportingFrequencyCode = "OS", the Begin
Quarter is on or before the quarter being
checked and the EndQuarter is null or is on
or before the quarter being checked.

If (LocationReportingFrequency record is
found)

if (Annual Reporting Requirement

== true and the quarter being
checked == 4 and the year of the
EndQuarter is equal to the year of the
quarter being checked.

Set

NumberOfExtensionQuarters

NumberOfExtensionQuarters
+ 1.

else

Stop looking for extensions.

else

Set Missing Op Data to true.
Set LinearityMissingOpDatalnfo =
"[YEAR] Q[QTR]" (where [YEAR] is
the year of the quarter being checked
and [QTR] is the number of the
quarter being checked.)

Stop looking for extensions.

else

Set Missing Op Data to true.

Environmental Protection Agency

Page 591 of 703


-------
Draft ECMPS Emissions Check Specifications

Set CurrentLinearityStatus = "IC-Grace".

3/7/2012 12:00:00AM

Set LinearityMissingOpDatalnfo = " [YEAR]
Q[QTR]" (where [YEAR] is the year of the
quarter being checked and [QTR] is the
number of the quarter being checked.)

Stop looking for extensions.

else

Stop looking for extensions.

Set PriorTestExpirationDateWithExtension = PriorTestExpirationDate.
Add NumberOfExtensionQuarters to PriorTestExpirationDateWithExtension.
Set	Test Expiration Date With Extension =

PriorTestExpirationDateWithExtension.

else

Set	Test Expiration Date With Extension = PriorTestExpirationDate

If {CurrentMHVRecord.Date/Hour is ON OR BEFORE the PriorTestExpirationDateWithExtension)

Set CurrentLinearity Status = "IC-Extension".

else if (.Missing Op Data == true)

Set CurrentLinearity Status = "Missing Op Data".

Set	Test Expiration Date With Extension = null

else if (Rpt Period Op Days Accumulator Array for the location == -1)

Set CurrentlAnearityStatus = "Invalid Op Data".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if (GraceOpHours > 168)

Set CurrentLinearity Status = "OOC-Expired".

else

If there are NO quarters beginning with the LATER of the quarter after the
PriorTestExpirationDateWithExtension and the quarter of the EarliestLocationReportDate
and ending with the quarter prior to the CurrentMHVRecord.Date/Hour,

else

For each quarter beginning with the quarter after the

PriorTestExpirationDateWithExtension and continuing through the quarter prior to

Environmental Protection Agency

Page 592 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

the CurrentMH VRecord. D a tc/H o ur ,

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Locate a record in OperatingSuppDataRecordsByLocation where
the reporting period is equal to the year/quarter being checked and
the OpTypeCode = "OPHOURS" and FuelCode is null.

if (OperatingSuppDataRecordsByLocation is found)

Add OpValue to GraceOpHours.

if (GraceOpHours > 168)

Set CurrentLinearityStatus = "OOC-Expired".
exit for.

else

Set CurrentLinearityStatus = "Missing Op Data".
Set LinearityMissingOpDatalnfo = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked and
[QTR] is the number of the quarter being checked.)
exit for.

Results:

Result

Usage:

1

2

3

4

k (CurrentLinearityStatus is null)

Set CurrentLinearityStatus = "IC-Grace".

Response	Severity

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 593 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LINSTAT-5

Check Name:

Determine Event Conditional Status

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set SubsequentLinearityRecord = null.

if (CurrentLinearityStatus is null and Priori. inearityEventRecord is not null)

if (Priori.in«//-%£"wy/. Conditiona 1DataBcgin Datc/Hour is null or CurrentMHVRecord Date/Hour is prior to the
Priori, inearityE	C o n d i t i o n a 1D a t a B c g i n D a t c/ H o ur)

Set CurrentLinearityStatus = "OOC-Event".

else

Locate the earliest record in LinearUyTestRecordsByLocationForQAStatus where the ComponentID is equal to the
ApplicableComponentID, the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed, the
CalculatedTestResult is not equal to "INVALID" and the EndDate/Hour is on or after the
PriorL inearityE ve« f/?e6Y>«/. C o n d i t i o n a 1D a t a B e g i n D a t e/ H o ur.

if {LinearityTestRecordsByLocationForQAStatus is found)

Set SubsequentLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

if (LinearityTestRecordsByLocationForQAStatus.QANQQdsEvdluationFlag = "Y")

Set CurrentLinearityStatus = "Recertification Test Not Yet Evaluated".

else if (IJnearityTestReconlslly Location ForOAStatus.TcslRcsuhCodc is null)

Set CurrentLinearityStatus = "OOC-Recertification Test Has Critical Errors".

else if (Linearity TestReconlslly Location ForOAStatus.TcslRcsuhCodc = "FAILED")

Set CurrentLinearityStatus = "OOC-Recertification Test Failed".

else if (LinearityTestRecordsByLocationForQAStatus.TestResultCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Recertification Test Aborted".

If (InvalidLinearityRecord is null)

Locate the earliest record in LinearityTestRecordsByLocationForQAStatus where the
ComponentID is equal to the ApplicableComponentID, the SpanScaleCode is equal to the
CurrentAnalyzerRangeUsed, the CalculatedTestResult is equal to "INVALID" and the
EndDate/Hour is on or after the P/wAirt«//-%£'v'£;rt?/?£;t'WY/.ConditionalDataBeginDate/Hour and is
before the EndDate/EndHour of the LinearityTestRecordsByLocationForQAStatus record retrieved
above.

Environmental Protection Agency

Page 594 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

if (CurrentLinearityStatus is null AND Annual Reporting Requirement == false)

If {Subsequent!AnearityRecord is not null and SubsequentlyinearityRecord EndDatc/Hour is greater than
October 30th of the year of the CurrentMHVRecord.Date/Hour) OR (SubsequentLinearityRecord is null
and the CurrentMHVRecord Date/Hour is in the 3rd quarter))

Set CurrentIAnearity Status = "OOC-Conditional Period Expired".

if (CurrentLinearityStatus is null)

if (Priori.inearityEventRecord LincarityCcrtEvcnt == "Y")

if (PriorLinearityEventRecord.EventCode = 125)

If (Priori.inearityEventRecord Moni toringSy stem ID is null)

Set CurrentI Anearity Status = "Invalid Certification Event"

else if (the associated BeginDate of the system in the Priori inearityE ventRecord is null)
Set CurrentI Anearity Status = "Invalid Monitor System"

else

If (the associated SystemTypeCode of the system in the
Prior L inearityE ventRecord == "S02")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {ARP,
CAIRS02} and the UnitMonitorCertBeginDate is ON OR BEFORE the
associated BeginDate of the system in the PriorLinearity EventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
ProgramCode is in set {ARP, CAIRS02} and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the Priori Anearity EventRecord

else if (the associated SystemTypeCode of the system in the
Priori Anearity EventRecord == "NOX")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {ARP,
NBP, NHNOX, CAIRNOX, CAIROS, SIPNOX} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of
the system in the Prior L inearityE ventRecord

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the

Environmental Protection Agency

Page 595 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

ProgramCode is in set {ARP, CAIRS02, NBP, NHNOX, CAIRNOX,
CAIROS, SIPNOX} and the EmissionsRecordingBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorLinearityEventRecord.

else if (the associated SystemTypeCode of the system in the
Prior LinearityEventRecord == "NOXC")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {NBP,
NHNOX, CAIRNOX, CAIROS, SIPNOX} and the UnitMonitorCertBeginDate
is ON OR BEFORE the associated BeginDate of the system in the
Prior LinearityEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
ProgramCode is in set {NBP, NHNOX, CAIRNOX, CAIROS,
SIPNOX} and the EmissionsRecordingBeginDate is ON OR BEFORE
the associated BeginDate of the system in the
PriorLinearityEventRecord.

else

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the UnitMonitorCertBeginDate is
ON OR BEFORE the associated BeginDate of the system in the
PriorLinearityEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorLinearityEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Set CurrentLinearityStatus = "Missing Program".

else if (Location Program Records HyHourLocationlJmlMomlorCcrlDc'Lidlmc is not

null)

if (CurrentDate is prior to the

Location ProgramRecordsByHourLocation UnitMonitorCcrtDcadlinc)
Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocation.UmtMomtorCertBegmDate +

Environmental Protection Agency

Page 596 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

180 days)

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

If (the number of calendar days ON OR AFTER the

Priori.inearityEventRecord QACcrtEvcntDatc and ON OR BEFORE the

CurrentMHVRecord Date/Hour > 180)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else if (the quarter of the Priori. inearityE ventRecord Q A C crt E vcn t D a tc is equal to the
quarter of the CurrentMHVRecord Date/Hour)

If (the number of calendar days ON OR AFTER the

Prior L inearityE ventRecord Q A C crt E vcn t D a tc and ON OR BEFORE the

CurrentMHVRecord.Date/Hour > 90)

If (Rpt Period Op Hours Accumulator Array for the location == -1)
Set CurrentLinearityStatus = "Invalid Op Data".

else if (the number of calendar days ON OR AFTER the
Prior L inearityE ventRecord Q A C crt E vcn t D a tc and ON OR BEFORE the
CurrentMHVRecord.Date/Hour is equal to Rpt Period Op Days
Accumulator Array for the location)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "IC-Conditional".

else if (PriorLinearityEventRecord.MmOpDsiysPviovQud.rtQV is null)
Set PriorLinearityEventRecord.MinOpDaysPviovQuavtev = 0
Set PriorLinearityEventRecord.MaxOpDaysPviovQua.vtQV = 0

for each quarter beginning with the quarter of the

Prior L inearityE ventRecord Q A C crt E vcn t D a tc and continuing through the quarter
BEFORE the CurrentMHVRecord.Date/Horn::

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Locate the record in OperatingSuppDataRecordsbyLocation where
the OpTypeCode is equal to "OPDAYS" and the reporting period is
equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Set PriorLinearityEventRecord.MmOpDaysPviovQuavtev =

Environmental Protection Agency

Page 597 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

-1

Set LinearityMissingOpDataInfo= "[YEAR] Q[QTR]"

(where [YEAR] is the year of the quarter being checked and
[QTR] is the number of the quarter being checked,
exit for.

else

If the quarter being checked is the quarter of the
Priori. inearityEventReconl Q A C crt E vcn t D a tc

If (()peratingSuppI)ataRecordsbyI. ocation Op Va 1 lie

MINUS the number of calendar days in the quarter

being checked that are PRIOR to the

Priori. inearityE ventReconl Q A C crt E vcn t D a tc >0)

Set

Priori. inearityE ventReconl M i n Op D ay s P ri

orQuarter =

OperatingSuppDataRecordsbyL ocation. Op

Value MINUS the number of calendar days in
the quarter being checked that are PRIOR to
the

Priori. inearityE ventReconl Q A C crt E vcn t D

ate

If (OperatingSuppDataRecordsbyLocation. Op Value
is less than the number of calendar days in the
quarter being checked that are ON OR AFTER the
Priori. inearityE ventReconl Q A C crt E vcn t D a tc)

Set

Priori. inearityE ventReconl M a\ Op D ay s P ri

orQuarter =

OperatingSuppDataRecordsbyL ocation. Op

Value.

else

Set

Priori. inearityE ventReconl M a\ Op D ay s P ri

orQuarter = the number of calendar days in
the quarter being checked that are ON OR
AFTER the

Priori. inearityE ventReconl Q A C crt E vcn t D

ate.

else

Set

Priorl.inearityEventRecord.MmOpD'dysPnorQu'drlc
r =

PriorLinearityEventRecord.MmOpDaysPnorQuarte

r +

Environmental Protection Agency

Page 598 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OperatingSuppDataRecordsbyLocation. Op Value.
Set Priori.inearityEventRecorcl M a\0pDay s

PriorQuarter =

PriorLinearityEventRecordMaxOpDaysPviovQuaxtQ

r +

OperatingSuppDataRecordsbyLocation. Op Value.

if (PriorlJnearityEventRecord.MmOpD'ciysPnorQu'cirlcr == -1
set CurrentLinearityStatus to "Missing Op Data"

else if (Praw,£,veM*/?ecw 90)

Set CurrentlAnearityStatus = "OOC-Conditional Period Expired".

else if (Pfw£,veM*/?ecw 90)

Set CurrentLinearity Status = "Undetermined-Conditional Data".

else

Set CurrentLinearity Status = "IC-Conditional".
Set CurrentlAnearity Status = "IC-Conditional".

If (the quarter of the PriorLinearityEventRecord.ConditiomiBegmDate is equal to the quarter of the
CurrentMHVRecord. Date/Hour)

Count the number of HourlyOpData records for the location where OpTime is greater than 0
and Date/Hour is ON OR AFTER the

PriorLinearityEventRecord.Cond\l\on'<\\BcgmD'<\lc/Hour and ON OR BEFORE
\hcCurrentMHVRecord Datc/Hour ,

If the number > 168,

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else

Set CurrentLinearity Status = "IC-Conditional".

else

if ( PriorlJnearityEventRecord.MmOpHoursPnorQu'cirlcr is null)

Set PriorLinearityEventRecord.MmOpHouvsPviovQudXtQV = 0
Set PriorLinearityEventRecord.MaxOpHoursPriorQusrter = 0

for each quarter beginning with the quarter of the

PriorLinearityEventRecord.ConditionalBQgmDatQ and continuing through the
quarter BEFORE the CurrentMHVRecord Date/Hour :

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Environmental Protection Agency

Page 599 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (Annual Reporting Requirement == false AND the quarter being
checked == 2)

Locate the record in

OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OSHOURS" and the reporting
period is equal to the quarter being checked.

else

Locate the record in

OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OPHOURS", FuelCode is null, and
the reporting period is equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Set PriorLinearityEventRecord.MmOpHoursPnorQua.rter =
-1

Set LinearityMissingOpDatalnfo = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked and
[QTR] is the number of the quarter being checked.)
exit for.

else

If the quarter being checked is the quarter of the
PriorLinearityEventRecord.ConditionalBeginDate

If (OperatingSuppDataRecordsbyLocation. Op Value
MINUS the number of calendar hours in the quarter
being checked that are PRIOR to the
PriorL inearityEventRecord. C onditionalB e ginD ate/
Hour > 0)

Set

Priori. inearityEventRecord. M i nOp HoursPri

orQuarter =

OperatingSuppDataRecordsbyLocation. Op

Value MINUS the number of calendar hours
in the quarter being checked that are PRIOR
to the

PriorLinearityEventRecord.ConditionalBegi
nDate/Hour

If (OperatingSuppDataRecordsbyLocation. Op Value
is less than the number of calendar hours in the
quarter begin checked that are ON OR AFTER the
PriorL inearityEventRecord. C onditionalB e ginD ate/
Hour)

Environmental Protection Agency

Page 600 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set

PriorLinearityEventRecordMaxOpHouTsPvi

orQuarter =

OperatingSuppDataRecordsbyLocation. Op

Value.

else

Set

PrioriJnearityE ventRecord.MdxOpHoursPn
orQuarter = the number of calendar hours in
the quarter being checked that are ON OR
AFTER the

PriorLinearityEventRecord.ConditionalBegi
nDate/Hour.

else

Set

Priori.inearityEventRecord M in Op HoursPriorQuart
er =

Prior L inearityE ventReconl M i n Op H o urs P ri orQ uart
er +

OperatingSuppDataRecordsbyL ocatiott. Op Value.

Set Priori, inearityEventRecord M a\Op Hours

PriorQuarter =

PrioriJnearityEventRecord.M'dxOpHoursPnorQu'drl

er +

OperatingSuppDataRecordsbyL ocatiott. Op Value.

if (PriorIJnearityEventRecord.MmOpHoursPnorQm\rlcr == -1)
set CurrentLinearityStatus to "Missing Op Data"

else if {Rpt Period Op Days Accumulator Array for the location == -1)

if (i^w£,ve«£7?ecw 168)

Set CurrentlAnearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearity Status = "Invalid Op Data".

else

if (Prior E ventRecord M i n Op H o urs P ri orQ uartcr + Rpt Period Op Hours
Accumulator Array for the Location > 168)

Set CurrentlAnearity Status = "OOC-Conditional Period Expired".

else if ( PriorEventRecord.M'Li\OpHoursPnorQ\mrlcr + Rpt Period Op Hours
Accumulator Array for the Location > 168)

Set CurrentLinearity Status = "Undetermined-Conditional Data".

else

Set CurrentLinearity Status = "IC-Conditional".

Environmental Protection Agency

Page 601 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 602 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LINSTAT-6

Check Name:

Determine Final Linearity Status

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set AlternateLinearityRecord = null
Set AlternatelnvalidLinearityRecord = null

if (CurrentLinearityStatus begins with "OOC")

if (LnvalidLinearityRecord is not null)

Set CurrentLinearity Status = CurrentLinearity Status &

Return result CurrentLinearityStatus.

else if (CurrentLinearityStatus= "Invalid Monitor Span")

if (CurrentAnalyzerRangeUsed = "H")

Set CurrentLinearityStatus = CurrentLinearityStatus & " (High Scale)".

else

Set CurrentLinearityStatus = CurrentLinearityStatus & " (Low Scale)".

Return result CurrentLinearityStatus.

else if (DualRangeStatus = true and CurrentLinearityStatus begins with "IC" or "Undetermined")

if {CurrentAnalyzerRangeUsed = "H")

Set AlternateAnalyzerRange = "L".

Set AlternateComponentlD = LowRangeComponentLD.

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentlD = HighRangeComponentLD.

for each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the
AlternateComponentlD

Append MonitorSystemComponentRecordsByHourLocation. SystemID to AlternateSystemlDs.

if (MonitorSystemComponentRecordsByHourLocation is not found)

Set CurrentLinearityStatus = "Invalid Monitor System Component".

Return result CurrentLinearityStatus.

if i CurrentMHI "Parameter in set {S02C, NOXC})

Environmental Protection Agency	Page 603 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Locate the record in MonitorSpanRecordsByHourAndLocation for the hour where the ComponentTypeCode is
equal to the CurrentMHVRecord.ComponcnlTypcCodc and the SpanScaleCode is equal to the
A Ite mate A nalyze rRange.

if (MonitorSpanRecordsByHourAndLocation is not found OR more than one

MonitorSpanRecordsByHourAndLocation is found or MonitorSpan Records By HourA ndLocatlon Span V al lie is

null or is less than or equal to 0)

Set CurrentLinearityStatus = "Invalid Monitor Span".
if (AlternateAnalyzerRange = "H")

Set CurrentLinearity Status = CurrentLinearityStatus & " (High Scale)".

else

Set CurrentLinearityStatus = CurrentLinearityStatus & " (Low Scale)".

Return result CurrentLinearityStatus.

else if (MonitorSpanRecordsByHourAndLocation.SpdnVdlue <=30)

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.

else

exit check.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AlternateComponentID where the
SpanScaleCode is equal to the AlternateAnalyzerRange and the CalculatedTestResult is not equal to "INVALID" and the
EndDate/Hour is either:

a)	prior to the CurrentMH VRecord Date/Hour OR

b)	equal to the CurrentMHVRecord Date/Hour and the EndMinute is less than "45" and the CalculatedTestResult is equal
to "PASSED" or "PASSAPS".

if (LinearityTestRecordsByLocationForQAStatus is found)

Set AUernateLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

Locate all records in QACertificationEventRecords where:

the ComponentID is equal to the AlternateComponentID

AND Linearity Required is equal to " Y",

AND the QACertEventDate/Hour is either:

a)	prior to the CurrentMHVRecord.Date/Hour OR

b)	equal to both the CurrentMHVRecord.Date/Hour and the ConditionalDataBeginDate/Hour;

AND either

a) AUernateLinearityRecord is null OR

Environmental Protection Agency

Page 604 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

b)	QACertEventDate/Hour is after the A IternateLinearity Record. EndDatc/Hour OR

c)	QACertEventDate/Hour is equal to the A Item ate I. in earity Record EndDatc/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the A IternateLinearity Record. EndDatc/Hour)

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode o 20, 25, 26, 30, or 172 and AlternateAnalyzerRange = "H" OR

d)	QACertEventCode <> 35 or 171 and AlternateAnalyzerRange = "L"

if (QACertificationEventRecords is found)

if (QACertificationEventRecords.CondiiionaWiQgmDsiQrRow is null or CurrentMHVRecord.Date/Hour is prior to
the QA CertificationEventRecords. ConditionalBeginDate/Hour)

If i CurrentlyinearityStatus does not begin with "IC")

Return result CurrentIAnearityStatus.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the

AlternateComponentID where the SpanScaleCode is equal to the AlternateAnalyzerRange, the
CalculatedTestResult is equal to "INVALID", and the EndDate/Hour is after the

QACertificationEventRecords.QACertEventDate/Hour and prior to the CurrentMHVRecord Date/Hour.

if (LinearityTestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

else

Set AlternatelnvalidLinearityRecord = null.

Locate the first record in LinearityTestRecordsByLocationForQAStatus where the ComponentID is equal
to the AlternateComponentID, the SpanScaleCode is equal to the AlternateAnalyzerRange,the
CalculatedTestResult is not equal to "INVALID", and the EndDate/Hour is on or after the

Conditional Data Begin Date/Hour.

if (LinearityTestRecordsByLocationForQAStatus is found)
Set AlternateLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

if (AlternateLinearityRecord .QANeedsEvaluationFlag = "Y")

Set CurrentLinearityStatus = "Alternate Range Recertification Test Not Yet Evaluated".

else if (AlternateLinearityRecord TestResultCode is null or is in set {FAILED, ABORTED})

If (AlternatelnvalidLinearityRecord is null)

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for

the AlternateComponentID where the SpanScaleCode is equal to the
AlternateAnalyzerRange, the CalculatedTestResult is equal to "INVALID", and the
EndDate/Hour is after the QA CertificationEventRecords. QACertEventDate/Hour
and prior to the EndDate/Hour of the

Environmental Protection Agency

Page 605 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

LinearityTestRecordsByLocationForQAStatus record retrieved above.

if (LinearityTestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

if {AlternatelAnearityRecord .TestResultCode is null)

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Has
Critical Errors".

if (AlternatelnvalidTestRecord is not null)

Set CurrentLinearity Status = CurrentLinearityStatus &

else if (AlternateLinearityRecord TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Failed",
if (.AlternatelnvalidTestRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AlternateLinearityRecord TestResv\tCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Aborted",
if (.AlternatelnvalidTestRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.

else

if (AUernateLinearityRecord is found)

if (AItemateLinearityRecord. QANccdsEva 1 uationF1 ag = "Y")

Set CurrentLinearityStatus = "Alternate Range Test Not Yet Evaluated".

else if (AlternateLinearityRecordTestResultCode is null or is in set {ABORTED, FAILED})

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the

AlternateComponentID where the SpanScaleCode is equal to the AlternateAnalyzerRange and the
EndDate/Hour is prior to the CurrentMH VRecord Date/Hour and the EndDate/Hour is greater than
the A IternatelAnearity Record. EndDate/Hour and the CalculatedTestResult is equal to "INVALID".

if (LinearityTestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

if (AUernateLinearityRecord TestResultCode = null)

Set CurrentLinearityStatus = "OOC-Alternate Range Test Has Critical Errors",
if (.AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AUernateLinearityRecord TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Alternate Range Test Failed",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

Environmental Protection Agency

Page 606 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

else if {AhernateLinearityRecord Tqs\RqsvMCoAq = "ABORTED")

Set CurrentLinearityStatus = "OOC-Alternate Range Test Aborted",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else

Set CurrentLinearityStatus = "OOC-No Prior Alternate Range Test or Event".

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.

else

If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.

Environmental Protection Agency

Page 607 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

Alternate Range

Recertification

Test Not Yet

Evaluated

Alternate Range

Test Not Yet

Evaluated

Invalid

Certification

Event

Invalid Monitor
Span (High
Scale)

Invalid Monitor
Span (Low
Scale)

Invalid Monitor
System

Invalid Monitor
System
Component
Invalid Op Data

Missing Op Data

Missing Program

OOC-Alternate
Range

Recertification
Test Aborted
OOC-Alternate
Range

Recertification
Test Aborted*
OOC-Alternate
Range

Recertification
Test Failed
OOC-Alternate
Range

Recertification
Test Failed*

Response	Severity

The [testtype] status for [key] could not be determined, because the prior	Critical Error Level 1

[testtype] for the alternate range component with TestNumber [alttestnum] has not
yet been evaluated.

The [testtype] status for [key] could not be determined, because the prior
[testtype] for the alternate range component with TestNumber [alttestnum] has not
yet been evaluated.

The [testtype] status for [key] could not be determined, because the QA
Certification Event record for QACertEventCode [code] QACertEventDate
[eventdate] has a critical error.

The [testtype] status for [key] could not be determined, because you did not report
a single, valid high-scale [comptype] span record that was active during the test.

The [testtype] status for [key] could not be determined, because you did not report
a single, valid low-scale [comptype] span record that was active during the test.

The [testtype] status for [key] could not be determined, because the Monitor
System record for MonitoringSystemID [system] has a critical error.

The [testtype] status for [key] could not be determined, because you did not report
any active Monitor System Component records for the alternate range of the
component.

The [testtype] status for [key] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or
invalid.

The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

The [testtype] status for [key] could not be determined, because a Unit Program
record associated with the initial certification event for QACertEventCode [code]
QACertEventDate [eventdate] either does not exist or has a
UnitMonitorCertificationBeginDate inconsistent with the BeginDate of the
associated Monitor System record.

The subsequent recertification [testtype] for the alternate range of the component
for [key] with TestNumber [alttestnum] was aborted.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

The subsequent recertification [testtype] for the alternate range of [key] with	Critical Error Level 1

TestNumber [alttestnum] was aborted. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.

The subsequent recertification [testtype] for the alternate range of the component	Critical Error Level 1

for [key] with TestNumber [alttestnum] failed.

The subsequent recertification [testtype] for the alternate range of the component	Critical Error Level 1

for [key] with TestNumber [alttestnum] failed. An invalid [testtype] with
TestNumber [altinvtestnum] was ignored.

Environmental Protection Agency

Page 608 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-Alternate
Range

Recertification
T est Has Critical
Errors

OOC-Alternate
Range

Recertification
Test Has Critical
Errors*

OOC-Alternate
Range Test
Aborted
OOC-Alternate
Range Test
Aborted*
OOC-Alternate
Range Test
Failed

OOC-Alternate
Range Test
Failed*

OOC-Alternate
Range Test Has
Critical Errors
OOC-Alternate
Range Test Has
Critical Errors*
OOC-Conditiona
1 Period Expired
OOC-Conditiona
1 Period Expired*
OOC-Event

OOC-Event*

OOC-Expired
OOC-Expired*

OOC-No Prior
Alternate Range
Test or Event
OOC-No Prior
Test or Event
OOC-No Prior
Test or Event*
OOC-Recertificat
ion Test
Aborted

OOC-Recertificat
ion Test
Aborted*

The subsequent recertification [testtype] for the alternate range of the component	Critical Error Level 1

for [key] with TestNumber [alttestnum] has critical errors.

The subsequent recertification [testtype] for the alternate range of the component	Critical Error Level 1

for [key] with TestNumber [alttestnum] has critical errors. An invalid [testtype]
with TestNumber [altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with	Critical Error Level 1

TestNumber [alttestnum] was aborted.

The prior [testtype] for the alternate range of the component for [key] with	Critical Error Level 1

TestNumber [alttestnum] was aborted. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with	Critical Error Level 1

TestNumber [alttestnum] failed.

The prior [testtype] for the alternate range of the component for [key] with	Critical Error Level 1

TestNumber [alttestnum] failed. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with	Critical Error Level 1

TestNumber [alttestnum] has critical errors.

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [alttestnum] has critical errors. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [key] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [key] has expired. An invalid [testtype] was ignored.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate], but you did not indicate the use of conditional data
for [key].

You reported a QA Certification Event record for QACertEventCode [code]

QACertEventDate [eventdate] for [key], but you did not indicate the use of

conditional data. An invalid [testtype] was ignored.

The prior [testtype] for [key] with TestNumber [testnum] has expired.

The prior [testtype] for [key] with TestNumber [testnum] has expired. An invalid

prior [testtype] with TestNumber [invtestnum] was ignored.

You did not report a prior [testtype] or certification event for the alternate range of

the component for [key].

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

You did not report a prior [testtype] or certification event for [key].

Critical Error Level 1

You did not report a valid prior [testtype] or certification event for [key]. An
invalid [testtype] with TestNumber [invtestnum] was ignored.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
was aborted.

Critical Error Level 1

Critical Error Level 1

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
was aborted. An invalid [testtype] with TestNumber [invtestnum] was ignored.

Critical Error Level 1

Environmental Protection Agency

Page 609 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-Recertificat
ion Test Failed
OOC-Recertificat
ion Test Failed*
OOC-Recertificat
ion Test Has
Critical Errors
OOC-Recertificat
ion Test Has
Critical Errors*
OOC-Test
Aborted
OOC-Test
Aborted*
OOC-Test Failed
OOC-Test
Failed*

OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*
Prior Test Not
Yet Evaluated
Recertification
Test Not Yet
Evaluated
Undetermined-C
onditional Data

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
failed.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
has critical errors.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
has critical errors. An invalid [testtype] with TestNumber [invtestnum] was
ignored.

The applicable prior [testtype] for [key] with TestNumber [testnum] was aborted.

The prior [testtype] for [key] with TestNumber [testnum] was aborted. An invalid
prior [testtype] with TestNumber [invtestnum] was ignored.

The applicable prior [testtype] for [key] with TestNumber [testnum] failed.
The prior [testtype] for [key] with TestNumber [testnum] failed. An invalid prior
[testtype] with TestNumber [invtestnum] was ignored.

The applicable prior [testtype] for [key] with TestNumber [testnum] has critical
errors.

The prior [testtype] for [key] with TestNumber [testnum] has critical errors. An

invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The [testtype] status for [key] could not be determined, because the applicable

prior [testtype] with TestNumber [testnum] has not yet been evaluated.

The [testtype] status for [key] could not be determined, because the subsequent

recertification [testtype] for the component with TestNumber [subtestnum] has not

yet been evaluated.

The software could not determine if the current hour was within the conditional
data period for QACertEventCode [code] QACertEventDate [eventdate] for [key]

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 610 of 703


-------
Draft ECMPS Emissions Check Specifications

Check Category:
LME

3/7/2012 12:00:00AM

Environmental Protection Agency

Page 611 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-11

Check Name:

Check LTFF System

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

For the LTFF record:

If MonitoringSystemID is null,
return result A.

else

Locate the Monitor System record for the MonitoringSystemID.

If the associated SystemTypeCode is not equal to "LTOL" or "LTGS",
return result B.

Results:

Result

A

B

Response

You did not report a MonitoringSystemID in an LTFF record.

The MonitoringSystemID reported in the LTFF record for [key] is not a long-term

fuel flow system.

Severity
Fatal

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow

Process/Category: LME Emissions Data Generation LTFF Heat Input Data

Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 612 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-13

Check Name:	Check Long Term Fuel Flow Value

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LTFF record:

If the LongTermFuelFlowValue is null or is less than or equal to 0,
return result A.

Results:

Result	Response	Severity

A	The [fieldname] reported in the LTFF record for [key] is missing or invalid.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow

1	Process/Category: LME Emissions Data Generation LTFF Heat Input Data

1	Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 613 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-14

Check Name:

Check Long Term Fuel Flow UOM

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

For the LTFF record:

If the LongTermFuelFlowUOMCode is null,
return result A.

Otherwise,

If the SystemTypeCode is "LTOL" and the LongTermFuelFlowUOMCode is not in set {"LB", "GAL"},
return result A.

If the SystemTypeCode is "LTGS" and the LongTermFuelFlowUOMCode is not equal to "SCF",
return result A.

Results:

Result
A

Response

The [fieldname] reported in the LTFF record for [key] is missing or invalid.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow

Process/Category: LME Emissions Data Generation LTFF Heat Input Data

Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 614 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-15

Check Name:	Check LTFFGCV

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LTFF record:

If the GrossCalorificValue is null or is less than or equal to 0,
return result A.

Results:

Result	Response	Severity

A	The [fieldname] reported in the LTFF record for [key] is missing or invalid.	Critical Error Level 1

Usage:

1	Process/Category:	Emissions Data Evaluation Report — Long Term Fuel Flow

1	Process/Category:	LME Emissions Data Generation LTFF Heat Input Data

1	Process/Category:	Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 615 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-16

Check Name:

Check LTFF GCV UOM

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

For the LTFF record:

LME Gen LTFF Heat Input = null.

If the GCVUnitsOfMeasureCode is null,
return result A.

Otherwise,

If the LongTermFuelFlowUOMCode is "LB" and the GCVUnitsOfMeasureCode is not equal to "BTULB",
return result A.

If the LongTermFuelFlowUOMCode is "GAL" and the GCVUnitsOfMeasureCode is not equal to "BTUGAL",
return result A.

If the LongTermFuelFlowUOMCode is "SCF" and the GCVUnitsOfMeasureCode is not equal to "BTUSCF",
return result A.

Otherwise,

If GrossCalorificValue is greater than 0 and LongTermFuelFlowValue is greater than 0,

Calculate LME Gen LTFF Heat Input = GrossCalorificValue * LongTermFuelFlowValue / 1,000,000,
rounded to the nearest integer.

Results:

Result
A

Response

The [fieldname] reported in the LTFF record for [key] is missing or invalid.

Severity

Critical Error Level 1

Usage:

Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow

Process/Category: LME Emissions Data Generation LTFF Heat Input Data

Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 616 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the LTFF record:

If LME OS is equal to true,

If the Quarter of the Current Reporting Period is equal to 2,
If the FuelFlowPeriodCode is null,
return result A.

Otherwise,

If the FuelFlowPeriodCode is not null,
return result B.

Otherwise,

If the FuelFlowPeriodCode is not null,
return result C.

LME-41

Check LTFF Fuel Flow Period Code
LME Check

Results:

Result
A

B
C

Response

You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value
is required for LME units with an ozone-season qualification during the second
quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is
only appropriate during the second quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is
only appropriate for LME units with an ozone-season qualification.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report — Long Term Fuel Flow

Environmental Protection Agency

Page 617 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-42

Check Name:

Check LTFF Total Heat Input

Related Former Checks:
Applicability:

LME Check

Description:

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

For the Current LTFF record:

If LME Gen LTFF Heat Input is not null,

If LME Total Heat Input Array for the location is greater than or equal to 0,

add LME Gen LTFF Heat Input to LME Total Heat Input Array for the location.

If LME OS is true and the Current LTFF Record. FuelFlowPeriodCode is equal to "A",

add LME Gen LTFF Heat Input to LME April Total Heat Input Array for the location.

If (the LocationName begins with "CP")

If LME CP Total Heat Input is greater than or equal to 0,

add LME Gen LTFF Heat Input to LME CP Total Heat Input.

If LME OS is true and the Current LTFF Record. FuelFlowPeriodCode is equal to "A",
add LME Gen LTFF Heat Input to LME CP April Heat Input.

Set LME Total Heat Input Array for the location to -1.

If (the LocationName begins with "CP")

set LME CP Total Heat Input to -1.

If (the LocationName begins with "CP")

Rpt Period HI Calculated Accumulator Array for this location = LME Total Heat Input Array for the location.
April HI Calculated Accumulator Array fox this location = LME Total April Input Array for the location
Expected Summary Value HI Array for this location = true

If Current L TFF Record Total Heat I nput is greater than or equal to 0,

If (the LocationName begins with "CP" AND Rpt Period HI Reported Accumulator Array for this location is
greater than or equal to 0)

Rpt Period HI Reported Accumulator Array for this location = Rpt Period HI Reported Accumulator
Array for this location + Current LTFF Record. TotalHeatlnput

If LME Gen LTFF Heat Input is not null AND Current L TFF Record TotalHeatlnput is not equal to LME Gen
L TFF Heat Input,

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI" AND
UOM = "MMBTUHR"

else

if (ABS(Current LTFF Record.TotaUieatlnput - LME Gen LTFF Heat Input) > Heat Input Tolerance)
return result A.

else

Environmental Protection Agency

Page 618 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If (the LocationName begins with "CP")

Rpt Period HI Reported Accumulator Array for this location = -1.

return result B

Results:

Result	Response Severity

A	The TotalHeatlnput reported in the LTFF record for [key] is inconsistent with the	Critical Error Level 1

recalculated value.

B	The [fieldname] reported in the LTFF record for [key] is missing or invalid.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow

Environmental Protection Agency

Page 619 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-10

Check Name:	Determine Total Load for Reporting Period

Related Former Checks: LME-EXP8A

Applicability:	LME Check

Description:

Specifications:

Set LME Gen LTFF Heat Input Array, LME Gen Total Heat Input Array, LME Gen Total Load Array, LME Gen Total S02M
Array, LME Gen Total NOXM Array, LME Gen Total C02M Array, LME Gen Total Op Time Array, LME Gen Total Op Hours
Array, and LME Gen LTFF Total Op Time Array to 0 for each location in the monitor configuration.

Set LME Gen LTFF April Heat Input Array, LME Gen April Heat Input Array, LME Gen April Load Array, LME Gen April
NOXM Array, LME Gen April Op Time Array, LME Gen April Op Hours Array, and LME Gen LTFF April Op Time Array to 0

for each location in the monitoring configuration.

Set LME Gen CP Total Heat Input, LME Gen Total Load, and LME Gen Total Optime to 0.

Set LME Gen CP April Heat Input, LME Gen April Load, and LME Gen April Optime to 0.

Set LME Gen Annual and LME Gen OS to false.

Set LME Gen HI Method and LME Gen HI Substitute Data Code to null.

Locate MonitorMethod records for all locations in the monitoring configuration where ParameterCode = "HIT", BeginDate is on or
before the first day of the reporting period, and the EndDate is null or is on or after the last day of the reporting period.

If any location does not have a retrieved record,
return result A.

Otherwise,

Set LME Year Start Quarter to the quarter of the current reporting period.

Locate a MonitorQualification for all units in the monitoring configuration where the QualificationTypeCode is equal to
"LMEA" or "LMES", BeginDate is on or before the last day of the reporting period, and the EndDate is null or is on or after
December 31 of the year prior to the reporting period.

If a record with QualificationTypeCode equal to "LMEA" is found,
set LME Gen Annual to true.

If a record with QualificationTypeCode equal to "LMES" is found,
set LME Gen OS to true.

If LME Gen Annual AND LME Gen OS are both false,
return result B.

else if LME Gen Annual is false AND the Quarter of the reporting period is equal to 1 or 4,
return result C.

Otherwise,

If the Quarter of the reporting period is greater than 1,

If the earliest BeginDate in the retrieved records is in a year prior to the year of the current reporting period,
If LME Gen Annual is equal to true,

set LME Year Start Quarter to 1.

else

Environmental Protection Agency

Page 620 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

set LME Year Start Quarter to 2.

else if the earliest BeginDate in the retrieved records is in a quarter prior to the LME Year Start Quarter,
set LME Year Start Quarter to the quarter of the earliest BeginDate.

If MethodCode in all the retrieved Method records is equal to "MHHI",

LME Gen HI Method = "MHHI".

Locate an LTFF record for any location during the reporting period.

If found,

return result D.

If MethodCode in all the retrieved Method records is in set {LTFF, CALC, LTFCALC},

LME Gen HI Method = "LTFF".

If SubstituteDataCode in any retrieved record is equal to "MHHI",

LME Gen HI Substitute Data Code = "MHHI".

For each Hourly Op Data record for the configuration:

If Hourly Op DataHourLoad is not null and is less than 0,
return result E.

else if Hourly Op Data. OpTime for any hour is null, less than 0, or greater than 1,
return result F.

else if Hourly Op Data. OpTime is greater than 0 and Hourly Op Data.HourLoad is null,
return result E.

else if Hourly Op Data. OpTime is greater than 0 AND Hourly Op DataMRWl Indicator is not equal
to 1,

Add HourLoad * OpTime to LME Gen Total Load Array for the location.

Add HourLoad * OpTime to LME Gen Total Load.

Add OpTime to LME Gen Total Optime.

Add OpTime to LME Gen LTFF Total Op Time Array for location.

If the month of Hourly Op Data.Date is April AND LME Gen OS is equal to true,
Add HourLoad * OpTime to LME Gen April Load Array for the location.
Add HourLoad * OpTime to LME Gen April Load.

Add OpTime to LME Gen April Optime.

Add OpTime to LME Gen LTFF April Op Time Array for location.

Locate an LTFF record for any location in the monitoring configuration during the reporting period.

If found,

If LME Gen Total Load is equal to 0 and LME Gen Total Optime is equal to 0,
return result G.

If not found,

Environmental Protection Agency

Page 621 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If LME Gen Total Load is greater than 0,
return result I.

Otherwise,

return result H.

Do not process remaining categories if fatal error is returned.

Results:

Result	Response	Severity

A	You have not reported an active HIT method in your monitoring plan for at least	Fatal

one monitoring location in the configuration.

B	You have not reported an active LMEA or LMES qualification record for this	Fatal

configuration in your monitoring plan.

C	You have not reported an active LMEA qualification record for this configuration	Fatal

in your monitoring plan, but the reporting period is the first or fourth quarter. Only
annual LME units should report in the first or fourth quarter.

D	You have reported MHHI as the heat input method for this configuration, but you	Fatal

have reported a long-term fuel flow record.

E	You have reported LTFF as the heat input method for this configuration, but the	Fatal

LoadValue in at least one hourly record is missing or invalid.

F	You have reported LTFF as the heat input method for this configuration, but the	Fatal

OperatingTime in at least one hourly record is missing or invalid.

G	You have reported a long-term fuel flow record for this reporting period, but the	Fatal

sum of the load and operating time values in the hourly records (where
MHHIIndicator is not equal to 1) are equal to 0.

H	You have not reported the same heat input method in your monitoring plan for all	Fatal

locations in the configuration during the reporting period.

I	You have reported LTFF as the heat input method for this configuration, but you	Fatal

have not reported a long-term fuel flow record for this reporting period.

Usage:

1	Process/Category: LME Emissions Data Generation LME Initialization

Environmental Protection Agency

Page 622 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the LTFF record:

If LME Gen OS is equal to true,

If the Quarter of the reporting period is equal to 2,
If the FuelFlowPeriodCode is null,
return result A.

Otherwise,

If the FuelFlowPeriodCode is not null,
return result B.

Otherwise,

If the FuelFlowPeriodCode is not null,
return result C.

LME-12

Check LTFF Fuel Flow Period Code
LME Check

Results:

Result
A

B
C

Response

You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value
is required for LME units with an ozone-season qualification during the second
quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is
only appropriate during the second quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is
only appropriate for LME units with an ozone-season qualification.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 623 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-17

Check Name:

Check LTFF Total Heat Input

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

For the LTFF record:

If LME Gen LTFF Heat Input is not null and is greater than or equal to 0 ,

if LME Gen Total Heat Input Array for the location is greater than or equal to 0,

add LME Gen L TFF Heat Input to LME Gen L TFF Heat Input Array for the location.

If LME Gen OS is true and the FuelFlowPeriodCode is equal to "A",

add LME Gen LTFF Heat Input to LME Gen LTFF April Heat Input Array for the location.

If Location is a common pipe,

If LME Gen CP Total Heat Input is greater than or equal to 0,

add LME Gen LTFF Heat Input to LME Gen CP Total Heat Input.

If LME Gen OS is true and the FuelFlowPeriodCode is equal to "A",

add LME Gen LTFF Heat Input to LME Gen CP April Heat Input.

Otherwise,

If Location is a common pipe,

set LME Gen CP Total Heat Input to -1.

Set LME Gen LTFF Heat Input Array for the location to -1.

Results:

Result
A

Response
obsolete

Severity
No Errors

Usage:

Process/Category: LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 624 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-21

Check Name:	Locate Hourly Op Record for LME Unit

Related Former Checks:

Applicability:

Description:

Specifications:

Set Current LME Hourly Op Record to null.

Set Generate LME to false.

If LME Gen Annual = true

Locate all Monitor Method records for the unit and
"C02M", and the MethodCode is equal to "LME".

else

Locate all Monitor Method records for the unit and
MethodCode is equal to "LME".

If found,

Set LME Gen Parameters to the list of ParameterCodes in the retrieved records.

Otherwise,

Set LME Gen Parameters to null.

Locate an Hourly Op Data record for the unit and the hour.

If found,

If LME Gen Parameters is null,
return result A.

else

Set Current LME Hourly Op Record to the retrieved record.

Set Generate LME to true.

if LME Gen Annual is equal to false, and the current date is in the month of April,
return result B.

Otherwise,

If LME Gen Parameters is not null, AND

(LME Gen Annual is equal to true OR the current date is in the months of May thru September),
return result C.

the hour where the ParameterCode is equal to "S02M", "NOXM", or
the hour where the ParameterCode is equal to "NOXM and the

Environmental Protection Agency

Page 625 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	There is no active LME method in your monitoring plan.	Critical Error Level 1

B	You reported an LME Hourly record for April, but the unit does not have an annual Informational Message

LME qualification. Emissions for this hour will not be included in the totals
reported in the Summary Value record.

C	You did not report an LME Hourly record for the hour.	Critical Error Level 1

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 626 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-22

Check Name:

Check LME Op Time

Related Former Checks: LME-EXP2

Applicability:

LME Check

Description:

Specifications:

If Current LME Hourly Op Record is not null,

If OpTime is null, or is not between 0 and 1 inclusive,

Set LME Gen Total Op Time Array for location to -1, Generate LME to false, and return result A.

Otherwise,

If OpTime is greater than 0, AND LME Gen Total Op Time Array for location is greater than or equal to 0,
Add 1 to LME Gen Total Op Hours Array for location.

Add OpTime to LME Gen Total Op Time Array for location.

If current date in the month of April,

Add 1 to LME Gen April Op Hours Array for location.
Add OpTime to LME Gen April Op Time Array for location.

Results:

Result
A

Response

The [fieldname] reported in the LME Hourly record is missing or invalid.

Severity

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 627 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-24

Check Name:

Check LME Load Value

Related Former Checks: LME-EXP5

Applicability:

LME Check

Description:

Specifications:

If Current LME Hourly Op Record is not null,

If LoadValue is less than 0,

set Generate LME to false, and return result A.

else if LoadValue is null,

If OperatingTime is greater than 0,

If LME Gen HI Method is equal to "LTFF"

set Generate LME to false, and return result B.

Otherwise

return result C.

else

If OperatingTime is equal to 0,
return result D.

Results:

Result

Response

The [fieldname] reported in the LME Hourly record is invalid.

You did not report a LoadValue in the LME Hourly record.

You did not report a LoadValue in the LME Hourly record.

You reported a LoadValue in the LME Hourly record. This field should be blank for
a non-operating hour.

Severity

A
B
C
D

Critical Error Level 1
Critical Error Level 1
Non-Critical Error

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 628 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-26

Check Name:

Check LME Load UOM

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

If Current LME Hourly Op Record is not null,

If LoadValue is null,

If LoadUOMCode is not null,
return result A.

Otherwise,

If LoadUOMCode is not equal to "MW", "KLBHR", or "MMBTUHR",
set Generate LME to false, and return result A.

Otherwise,

Locate Monitor Load record for the location and hour.

If not found, or more than one record is found, or the MaximumLoadUnitsOfMeasureCode is null,
set Generate LME to false, and return result B.

Otherwise,

If the LoadUOMCode is not equal to the MaximumLoadUnitsOfMeasureCode in the retrieved record,
set Generate LME to false, and return result C.

Results:

Result

A

B

Response

The [fieldname] reported in the LME Hourly record is missing or invalid.
You have not reported a single, active, valid Monitor Load record in your
monitoring plan.

The LoadUOMCode in the LME Hourly record is not consistent with the value in
the Monitor Load record in your monitoring plan.

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Hourly Emissions Data

Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 629 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-27

Check Name:	Check LME Fuel Code List

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

If Current LME Hourly Op Record is not null,

If OpTime is greater than 0, and FuelCodeList is null,
set Generate LME to false, and return result A.

Results:

Result	Response Severity

A	You did not report a value in the FuelCodeList in the LME Hourly record, but the	Critical Error Level 1

unit operated during the hour.

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 630 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-28

Check Name:	Calculate Heat Input for LME Unit

Related Former Checks: LME-EXP3B, LME-EXP9A

Applicability:	LME Check

Description:

Specifications:

LME Gen Heat Input Record = null
LME Calc Heat Input = null
LME Gen Fuel Code = null

If Generate LME is equal to true,

If Current LME Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

LTFF April Heat Input Array for the location * Current LME
Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Calculate LME Calc Heat Input = (LME Gen CP Total Heat Input *
Current LME Hourly Op Record.HourLoad * Current LME Hourly Op
Record/ LME Gen TotalLoad) + (LME Gen LTFF Heat Input
Array for the location * Current LME Hourly Op Record.HowLoaA *
Current LME Hourly Op Record.OpTims / LME Gen Total Load Array for
the location), and round the result to 1 decimal place.

else if LME Gen Total Optime is greater than 0,

Calculate LME Calc Heat Input = (LME Gen CP Total Heat Input * Current LME
Hourly Op Record. OpTime / LME Gen Total Optime) + (LME Gen LTFF Heat
Input Array for the location * Current LME Hourly Op Record. OpTime / LME Gen
LTFF Total Op Time Array for the location), and round the result to 1 decimal
place.

If LME Calc Heat Input is not null,

If LME Calc Heat Input is greater than 999,999.9
If LME Gen Parameters contains "S02M",

set LME Gen Total S02M Array for location to -1.

If LME Gen Parameters contains "NOXM",

set LME Gen Total NOXM Array for location to -1.

If LME Gen Parameters contains "C02M",

set LME Gen Total C02M Array for location to -1.
set LME Calc Heat Input to null, LME Gen Total Heat Input Array for location to -1, and return
result B.

else if LME Calc Heat Input is greater than or equal to 0,

LME Gen Heat Input Record.HourlD = Current LME Hourly Op Record.HourlD

LME Gen Heat Input Record.ParameterCode = "HIT"

LME Gen Heat Input Record. AdjustedHourlyValue = LME Calc Heat Input

If Current LME Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	You did not report a single, active, valid default record for MHHI in your	Critical Error Level 1

monitoring plan.

B	The value calculated for [param] in the LME Hourly record exceeds the maximum Critical Error Level 1

value.

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 634 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-29

Check Name:	Calculate S02 Mass for LME Unit

Related Former Checks: LME-EXP3C, LME-EXP9C

Applicability:	LME Check

Description:

Specifications:

LME Gen S02MRecord = null

If LME Gen Parameters contains " S02M" and Current LME Hourly Op Record is not null,

If Current LME Hourly Op Record FuclCodcList is not null,

S02 Rate = 0
S02 Fuel = null

For each FuelCode in the Current LME Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

You did not report a single, active, valid [defparm] default record for FuelCode
[fuel] in your monitoring plan.

The value calculated for [param] in the LME Hourly record exceeds the maximum
value.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 636 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-30

Check Name:

Calculate NOX Mass for LME Unit

Related Former Checks: LME-EXP3A, LME-EXP9B

Applicability:

Description:

Specifications:

LME Check

LME Gen NOXM Record = null

If LME Gen Parameters contains "NOXM" and Current LME Hourly Op Record is not null and Current LME Hourly Op
Record.O^TivaQ is greater than 0,

If Current LME Hourly Op Record FuclCodcList is not null,

NOX Rate = 0
NOX Fuel = null

For each FuelCode in the Current LME Hourly Op Record FuclCodcList

If Current LME Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If LME Calc Heat Input is not null and is greater than or equal to 0 AND NOXRate is greater than 0,

Calculate NOX Mass = LME Calc Heat Input * NOX Rate, and round the result to 1 decimal place.

If NOX Mass is greater than 99,999.9

set LME Gen Total NOXM Array for location to -1, and return result C.

Otherwise,

LME Gen NOXM RecordHowlT) = Current LME Hourly Op Record HowlT)

LME Gen NOXM Record ParamctcrCodc = "NOXM"

LME Gen NOXM itecorrf. AdjustedHourlyValue = NOX Mass

LME Gen NOXM Record.FuelCode = NOX Fuel

LME Gen NOXM itecorrf. OperatingConditionCode = Current LME Hourly Op
Record. OperatingConditionCode

If LME Gen Total NOXM Array for location is greater than or equal to 0,

Add NOX Mass to LME Gen Total NOXM Array for location.

If current date in the month of April,

Add NOX Mass to LME Gen April NOXM Array for location.

Environmental Protection Agency

Page 638 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

C

Response

You did not report a single, active, valid [defparm] default record for FuelCode
[fuel] in your monitoring plan.

You did not report a single, active, valid [defparm] default record for FuelCode

[fuel] OperatingConditionCode [cond] in your monitoring plan.

The value calculated for [param] in the LME Hourly record exceeds the maximum

value.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Usage:

1

Process/Category:

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 639 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-31

Check Name:	Calculate C02 Mass for LME Unit

Related Former Checks: LME-EXP3D, LME-EXP9D

Applicability:	LME Check

Description:

Specifications:

LME Gen C02MRecord = null

If LME Gen Parameters contains " C02M" and Current LME Hourly Op Record is not null,

If Current LME Hourly Op Record FuclCodcList is not null,

C02 Rate = 0
C02 Fuel = null

For each FuelCode in the Current LME Hourly Op 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result
A

B

Response

You did not report a single, active, valid [defparm] default record for FuelCode
[fuel] in your monitoring plan.

The value calculated for [param] in the LME Hourly record exceeds the maximum
value.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 641 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-32

Check Name:	Calculate HIT Summary Values

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

LME Summary Heat Input Record = null

If location is a common pipe,

tempHIT = LME Gen LTFF Heat Input Array for the location
tempAprilHIT = LME Gen LTFF April Heat Input Array for the location

else

tempHIT = If LME Gen Total Heat Input Array for the location
tempAprilHIT = LME Gen April Heat Input Array for the location

If tempHIT is greater than or equal to 0,

LME Summary Heat Input RecordMonLoclA = current location ID

LME Summary Heat Input Record.ReportingPeriodld = current reporting period ID

LME Summary Heat Input Record.ParameterCode = "HIT"

If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,

LME Summary Heat Input Record. CurrentReportingPeriodTotal = tempHIT - tempAprilHIT, rounded to 0 decimal
places.

else

LME Summary Heat Input Record. CurrentReportingPeriodTotal = tempHIT, rounded to 0 decimal places.

If LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Heat Input Record OzoncScasonToDatcTotal = tempHIT - tempAprilHIT, rounded to 0
decimal places.

else if Quarter of Reporting Period is equal to 3,

LME Summary Heat Input Record. OzoneSeasonToDateTotal = tempHIT, rounded to 0 decimal places.

else if Quarter of Reporting Period is equal to 4 AND LME Year Start Quarter is less than 4,

Locate the Op Supp Data records for the location WHERE the reporting period is the third quarter of the
Year of the Reporting Period and OpTypeCode = "HIT".

If not found,

set LME Summary Heat Input Record. OzoneSeasonToDateTotal to null, and return result A.
Otherwise,

LME Summary Heat Input Record. OzoneSeasonToDateTotal = OpValue in the retrived record.

if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,

Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of the

Environmental Protection Agency

Page 642 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Year of the Reporting Period and OpTypeCode = "HITOS".

If not found,

set LME Summary Heat Input Record. OzoneSeasonToDateTotal to null, and return result A.
Otherwise,

add Op Value in the retrieved record to LME Summary Heat Input
Record. OzoneSeasonT oDateT otal.

If LME Gen Annual == true,

LME Summary Heat Input Record. Ye arT oDateT otal = LME Summary Heat Input
itecorrf. CurrentReportingPeriodTotal, rounded to 0 decimal places.

If the quarter of the current reporting period is greater than the LME Year Start Quarter,

For each reporting period in the year of the current reporting period and in a quarter that is on or after the
LME Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =

If not found,

set LME Summary Heat Input Record. Ye arT oDateT otal to null, and return result B.
Otherwise,

add Op Value in the retrieved record to LME Summary Heat Input Record. YearToDateTotal.

HIT".

Results:

Result
A

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 643 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-33

Check Name:

Calculate OPTIME Summary Values

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

LME Summary Op Time Record = null

If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,

LME Summary Op Time Record.MonLocId = current location ID

LME Summary Op 7wne./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If the First ECMPS Reporting Period in the retrieved record is not null and is on or prior to the
second quarter of the current year,
return result A.

Otherwise,

add Op Value in the retrieved record to LME Summary Op 7wne./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response	Severity

A	The program could not determine ozone-season-to-date totals for [osparam],	Critical Error Level 1

because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

B	The program could not determine year-to-date for [param], because the Op Supp	Critical Error Level 1

Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

Usage:

1	Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 646 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-34

Check Name:

Calculate OPHOURS Summary Values

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

LME Summary Op Hours Record = null

If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,

LME Summary Op Hours Record MonLocid = current location ID

LME Summary Op Hours 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If LME Gen Annual == true,

LME Summary Op Hours Record. YearToDateTotal = LME Summary Op Hours
Record. CurrentReportingPeriodT otal.

If the quarter of the current reporting period is greater than the LME Year Start Quarter,

For each reporting period in the year of the current reporting period and in a quarter that is on or after the
LME Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =
"OPHOURS".

If not found,

set LME Summary Op Hours Record. YearToDateTotal to null, and return result B.
Otherwise,

add OpValue in the retrieved record to LME Summary Op Hours Record. YearToDateTotal.

Results:

Result
A

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 648 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-35

Check Name:

Calculate S02M Summary Values

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

LME Summary S02M Record = null

If location is a unit, LME Gen Annual == true, AND LME Gen Total S02M Array for the location is greater than or equal to 0,

Locate a Monitor Method record for the unit where the ParameterCode is equal to "S02M", and the MethodCode is equal to
"LME", BeginDate is on or before the first day of the reporting period, and the EndDate is null or is on or after the last day of
the reporting period.

LME Summary S02MRecord.MonLocId = current location ID

LME Summary SCEAfitecorrf.ReportingPeriodld = current reporting period ID

LME Summary S02MRecord.ParameterCode = "S02M"

LME Summary £02M./?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 650 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-36

Check Name:	Calculate C02M Summary Values

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

LME Summary C02MRecord = null

If location is a unit, LME Gen Annual == true, AND LME Gen Total C02M Array for the location is greater than or equal to 0,

Locate a Monitor Method record for the unit where the ParameterCode is equal to "C02M", and the MethodCode is equal to
"LME", BeginDate is on or before the first day of the reporting period, and the EndDate is null or is on or after the last day of
the reporting period.

If found,

LME Summary C()2M Record Mon Locid = current location ID

LME Summary C02M7?ecw
-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Usage:

1	Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 652 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-37

Check Name:

Calculate NOXM Summary Values

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

LME Summary NOXM Record = null

If location is a unit AND LME Gen Total NOXM Array for the location is greater than or equal to 0,

Locate a Monitor Method record for the unit where the ParameterCode is equal to "NOXM", and the MethodCode is equal
to "LME", BeginDate is on or before the first day of the reporting period, and the EndDate is null or is on or after the last day
of the reporting period.

LME Summary NOXM Record MonLocid = current location ID

LME Summary NOXM 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

If not found,

set LME Summary NOXM Record. Ozone SeasonToDateTotal to null, and return result A.
Otherwise,

add OpValue in the retrieved record to LME Summary NOXM
Record. OzoneSeasonT oDateT otal.

If LME Gen Annual == true,

LME Summary NOXM Record. YearToDateT otal = LME Summary NOXM
Record. CurrentReportingPeriodT otal.

If the quarter of the current reporting period is greater than the LME Year Start Quarter,

For each reporting period in the year of the current reporting period and in a quarter that is on or
after the LME Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the
OpTypeCode = "NOXM".

If not found,

set LME Summary NOXM Record. Ye arT oDateT otal to null, and return result B.
Otherwise,

add OpValue in the retrieved record to LME Summary NOXM
Record. Y earT oDateT otal.

Results:

Result
A

Response

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or more
previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA
host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

B

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 654 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-38

Check Name:

Calculate NOXR Summary Values

Related Former Checks:
Applicability:

LME Check

Description:

Specifications:

LME Summary NOXR Record = null

If LME Summary Heat Input Record and LME Summary NOXM Record are both not null,

Locate a Program record for the unit where the ProgramCode is equal to " ARP", the Class is not equal to "NA",
UnitMonitorCertBeginDate is on or before the first day of the reporting period, and the EndDate is null or is on or after the
last day of the reporting period.

LME Summary NOXR Record Mon Locid = current location ID

LME Summary NOXR 7?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Otherwise,

Add OpValue * NOXRValue (rounded to 1 decimal) to NOxTotal.

If NOxTotal == 0,

LME Summary NOXR Record. YearToDateTotal = 0.

else

LME Summary NOXR Record. YearToDateTotal = NOxTotal / LME Summary Heat Input
Record. YearToDateTotal, rounded to 3 decimal places.

else

LME Summary NOXR Record. YearToDateTotal = LME Summary NOXR
Record. CurrentReportingPeriodT otal.

Results:

Result
A

B

Response

The program could not determine year-to-date for [param], because the Op Supp
Data record for this parameter is missing for one or more previous reporting
periods. If you have submitted emissions data for prior quarters, you should be
able to retrieve these records by logging on to the EPA host.

The program could not determine year-to-date for [param], because the Op Supp
Data record for HIT is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

Severity

Critical Error Level 1

Critical Error Level 1

Usage:

1

Process/Category:

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 656 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-40

Check Name:	Check LME MHHI Indicator

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

If Current LME Hourly Op Record is not null,

If MHHIIndicator is equal to 1,

If LME Gen HI Substitute Data is not equal to "MHHI",
set Generate LME to false, and return result A.

Results:

Result	Response	Severity

A	You reported a MHHIIndicator, but you did not report an active LTFF heat input	Critical Error Level 1

method with a SubstituteDataCode of "MHHI".

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 657 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

LME-44

Check Name:

Related Former Checks:

Check Fuel Codes against LTFF Records

Applicability:

Description:

Specifications:

LME Check

If Current LME Hourly Op Record is not null and LME Gen HI Method = "LTFF",

If MHHIIndicator is not equal to 1 and FuelCodeList is not null,

Locate all Unit Stack Configuration Records where the unit location is the location in the Current LME Hourly Op
Record, the StackID begins with "CP", the BeginDate and BeginHour is on or before the Date and Hour in the
Current LME Hourly Op Record, and the EndDate is null or the EndDate and EndHour is on or after the Date and
Hour in the Current LME Hourly Op Record.

For each FuelCode in FuelCodeList,

Locate a LTFF Record for the configuration and reporting period where the location is the location in the
Current LME Hourly Op Record or is any of the common pipes in the retrieved Unit Stack Configuration
Records, and the FuelCode of the associated fuel flow system is equal to the FuelCode in the FuelCodeList
that is being evaluated.

If not found for any FuelCode,

set Generate LME to false, and return result A.

Results:

Result
A

You did not report a Long Term Fuel Flow record for a fuel flow system for one or
more fuels in the FuelCodeList in the LME Hourly record. If you burn a fuel that is
not measured by a fuel flow meter, you must use maximum hourly heat input for the
hour.

Response

Severity

Critical Error Level 1

Usage:

Process/Category: LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 658 of 703


-------
Draft ECMPS Emissions Check Specifications	3/7/2012 12:00:00AM

Check Code:	LME-45

Check Name:	Duplicate LTFF Record

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LTFF record:

Locate another LTFF record for the location with same ReportingPeriod, MonitoringSystemID, and FuelFlowPeriodCode as
the current record.

If found,

return result A.

Results:

Result	Response	Severity

A	Another [recordtype] record already exists with the same [fieldnames].	Fatal

Usage:

1	Process/Category: LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 659 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-18

Check Name:	Check LME Begin Hour

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LME Hourly Op record:

If BeginHour is null or is not between 0 and 23 (inclusive),
return result A.

Results:

Result	Response	Severity

A	The Hour is missing or invalid.	Fatal

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 660 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-19

Check Name:	Check LME Begin Date

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LME Hourly Op record:

If BeginDate is null or is not within the reporting period,
return result A.

Results:

Result	Response	Severity

A	The Date is missing or not within the reporting period.	Fatal

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 661 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-20

Check Name:	Duplicate LME Hourly Op Record

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LME Hourly Op record:

Locate another Hourly Op record for the location with same BeginDate and BeginHour.

If found,

return result A.

Results:

Severity
Fatal

Result	Response

A	Another [recordtype] record already exists with the same [fieldnames].

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 662 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-23

Check Name:	Check LME Data Entry Screen Op Time

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LME Hourly Op record:

If OpTime is null, or is not between 0 and 1 inclusive,
return result A.

Results:

Result	Response	Severity

A	The [fieldname] reported in the LME Hourly record is missing or invalid.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 663 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	LME-25

Check Name:	Check LME Data Entry Screen Load Value

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

For the LME Hourly Op record:

If LoadValue is null,

If OperatingTime is greater than 0,
return result A.

else if LoadValue is less than 0,
return result A.

else

If OperatingTime is equal to 0,
return result B.

Results:

Result	Response Severity

A	The [fieldname] reported in the LME Hourly record is missing or invalid.	Critical Error Level 1

B	You reported a LoadValue in the LME Hourly record. This field should be blank for Non-Critical Error

a non-operating hour.

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 664 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

For the LTFF record:

If the Quarter of the reporting period is not equal to 2,
If the FuelFlowPeriodCode is not null,
return result A.

LME-43

Check LTFF Fuel Flow Period Code
LME Check

Results:

Result	Response	Severity

A	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is Critical Error Level 1

only appropriate during the second quarter.

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 665 of 703


-------
Draft ECMPS Emissions Check Specifications

Check Category:
RATA Status

3/7/2012 12:00:00AM

Environmental Protection Agency

Page 666 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RAT ST AT-1

Check Name:

Check Low Sulfur and FLOW Exemptions

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set CurrentRA TAStatus = null.

Set MaxLevelCount = null.

Set FlowRATAExemption = false.

if (CurrentHourlyRecordforRATAStatus.SystemTypeCode begins with "S02")

Locate a record in TestExtensionExemptionRecords for the location where the SystemID is equal to the
CurrentHourlyRecordforRA TAStatus System ID. the reporting period is the Current Reporting Period, AND the
ExtensionExemptionCode is equal to "LOWSYTD"

if (TestExtensionExemptionRecords is found)

Set CurrentRA TA Status = "IC-Exempt"

else

Locate a record in MonitorQualificationRecordsByHour for the hour and where MonitoringLocationld = Current
Location

and the QualificationTypeCode is equal to "LOWSULF".
if (MonitorQualificationRecordsByHour is found)

Set CurrentRA TA Status = "IC-Exempt".

else if (CurrentHourlyRecordforRATAStatus Parameter = "FLOW")

Set PeakingBypass = false,
if (CurrentEntityType is equal to "CS" or "MS")

Locate the record in LocationAttributeRecordsByHourLocation for the hour and location,
if (LocationAttributeRecords.Bypasslnd == 1)

Set PeakingBypass = true.

For each record in UnitStackConfigurationRecordsByHourLocation for the hour and stack location

Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld
= the unit location in the UnitStackConfigurationRecordsByHourLocation record and
QualificationTypeCode is equal to "PK" or "SK".

Set PeakingBypass = true.

else

Environmental Protection Agency

Page 667 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (MonitorQualificationRecordsByHour is NOT found)

Set PeakingBypass = false.

Exit for.

else if i CurrentUnitisPeaking i

Set PeakingBypass = true,
if (PeakingBypassj

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where the MonitoringLocationld = Current
Location and QualificationTypeCode is equal to "PRATA1"

if (MonitorQualificationRecordsByHour is found)

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld =
Current Location and the QualificationTypeCode is equal to "PRATA2"

if (MonitorQualificationRecordsByHour is found)

Set MaxLevelCount = 2.

else

Set MaxLevelCount = 3.

Append CurrentHourlyRecordforRA TA Status Sy stem ID to FLOWSystemIDArray for the location.

Locate a record in TestExtensionExemptionRecords for the location where the SystemID is equal to the
CurrentHourlyRecordforRATAStatusSystsmlD, the ComponentID is equal to the the

CurrentHourlyRecordforRA TA .Vfrtfw.v. C omponcn11D the reporting period is the Current Reporting Period, AND the
ExtensionExemptionCode is equal to "FLOWEXP"

if (TestExtensionExemptionRecords is found)

Set FlowRATAExemption = true.

Results:

Result	Response	Severity

Environmental Protection Agency

Page 668 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 669 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	RATSTAT-2

Check Name:	Locate Most Recent Prior RAT A Test

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Set PriorRA TARecord = null.

Set InvalidRATARecord = null.

Set ApplicableSystemlDList = null.

If Flow RATA Exemption is true,

Locate all MonitorSystemComponentRecordsforHourandLocation for the location and hour where the ComponentID is
equal to CurrentHourlyRecordforRA 7'AVfflfH.v. Component ID.

For each record found,

Append MonitorSystemComponentRecordsforHourandLocation. SystemID to the ApplicableSystemlDList.

else

Append CurrentHourlyRecordforRA TA Status Sy stem ID to the ApplicableSystemlDList.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is in the
ApplicableSystemlDList and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to the
CurrentHourlyRecordforRA TAStatus. Date/Hour

if (RATATestRecordsByLocationForQAStatus is found)

Set PriorRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

if i Current RA TAStatus is null)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is
in the ApplicableSystemlDList and the EndDate/Hour is prior to the

CurrentHourlyRecordforRA TA Status Date/Hour and the EndDate/Hour is greater than the
PriorRATARecordlEaSD&XelUovs and the TestResultCode is equal to "INVALID".

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is in the
ApplicableSystemlDList and the TestResultCode is equal to "INVALID" and the EndDate/Hour is prior to the
CurrentHourlyRecordforRA TA Status. D ate/Hour

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

Environmental Protection Agency

Page 670 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

Severity

C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 671 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RATSTAT-3

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set PriorRA TAEventRecord = null.

If i Current RA TA Status is null)

Locate the most recent record in QACertificationEventRecords where the SystemID is in the ApplicableSystemlDIJst and
RATARequired is equal to " Y" and the QACertEventDate is either:

a)	prior to the CurrentHourlyRecordforRA TA Status Date/Hour OR

b)	equal to both the CurrentHourlyRecordforRA TA Status Date/Hour and the ConditionalBeginDate/Hour;

AND either:

a)	Prior RA TA Record is null OR

b)	QACertEventDate/Hour is after the PriorRA TA Record EndDatc/Hour OR

c)	QACertEventDate/Hour is equal to the PriorRA TA Record EndDatc/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the PriorRA TA Record EndDatc/Hour )

AND either:

a)	Annual Reporting Requirement is equal to true OR

b)	QACertEventDate/Hour is on or after April 1 of the year of the CurrentHourlyRecordforRA TA Status Date
if (QACertificationEventRecords is found)

Set Prior RATAEventRecord = the found record in QACertificationEventRecords.

if {PriorRAT AEventRecord is null)

if (PriorRA TA Record is null)

Set Current RA TA Status = "OOC-No Prior Test or Event"

else if (InvalidRATARecord is not null AND Prior RAT AEventRecord. QACertEventDate/Hour is after
InvalidRA 7/4./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set InvalidRATARecord = null.

Results:

Result	Response

Usage:

1	Process/Category:	Emissions Data Evaluation Report

2	Process/Category:	Emissions Data Evaluation Report

3	Process/Category:	Emissions Data Evaluation Report

4	Process/Category:	Emissions Data Evaluation Report

5	Process/Category:	Emissions Data Evaluation Report

6	Process/Category:	Emissions Data Evaluation Report

7	Process/Category:	Emissions Data Evaluation Report

Severity

C02/02 RAT A Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 673 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RATSTAT-4

Check Name:

Check RATA Result

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

if i CurrentRA TA Status is null and PriorRATARecord is not null and PriorRA TAEventRecord is null)

Set EvaluateMultiLevelRATA = true.

if (/VioriM TMitecorrf. QANeedsEvaluationFlag = "Y")

Set Current RA TA Status = "Prior Test Not Yet Evaluated".

else if (Prior RA 7/1 wy/. T c s t R c s u 11C o dc = null or Prior RA TA Record. T cstRcsultC'odc = "FAILED" or
PriorRA 7/1/?£?««*<•/. TestRcsultCode = "ABORTED")

Locate the most recent record in QACertificationEventRecords where the SystemID is in the
ApplicableSystemlDList and RATARequired is equal to " Y" and the ConditionalBeginDate/Hour is:

a)	on or prior to the CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour AND

b)	on or after the PriorRA TA Record EndDa tc/Hour: AND

c)	Annual Reporting Requirement is equal to true OR QACertEventDate/Hour is on or after April 1 of the year of
the CurrentHourlyRecordforRA TAStatusHsAQ.

if {QACertificationEventRecords is found)

Set PriorRA TAEventRecord = found record in QACertificationEventRecords.
elseif (PriorRA TA Record Test Resul tC ode = null)

Set CurrentRA TA Status = "OOC-Prior Test Has Critical Errors",
elseif (PriorRA7M	T e s t R e s u 11C o de = "FAILED")

Set CurrentRA TA Status = "OOC-Prior Test Failed",
elseif (PriorRA7M	T e s t R e s u 11C o de = "ABORTED")

Set CurrentRA TA Status = "OOC-Prior Test Aborted".

Results:

Result

Response

Severity

Environmental Protection Agency

Page 674 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Usage:

1

Process/Category:

Emissions Data Evaluation Report

2

Process/Category:

Emissions Data Evaluation Report

3

Process/Category:

Emissions Data Evaluation Report

4

Process/Category:

Emissions Data Evaluation Report

5

Process/Category:

Emissions Data Evaluation Report

6

Process/Category:

Emissions Data Evaluation Report

7

Process/Category:

Emissions Data Evaluation Report

C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 675 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RATSTAT-5

Check Name:

Determine Event Conditional Status

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set SubsequentRATARecord = null.

Set RATAMissingOpDatalnfo = null.

Set RATA Event Operating Level Count = null.

if i CurrentRA TA Status is null and Prior RATAEventRecord is not null)

if (Prior RA 7M£'veMf/?ecwY/. Conditional Data Begin Date/Hour is null or CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour is
prior to the PriorRA TA E ventRecord Condi tional Data Begin Date/Hour)

Locate the earliest record in RATATestRecordsByLocationForQAStatus where the SystemID is equal to the
PriorRA TA EventRecord Sy stem ID, the TestResult is not equal to "INVALID" and the EndDate/Hour is on or after
the PriorRA TAEventRecord. ConditionalDataBeginDate/Hour.

if (RA TA TestRecordsByLocationForQA Status is found)

Set SubsequentRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

if (RA TA TestRecordsByLocationForOAStatus.QANccdsEvdhi'dUonFl'dg = "Y")

Set CurrentRA TA Status = "Recertification Test Not Yet Evaluated".

else if (RA TA TestRecordsByLocationForOAStatus.TcslRcsuhCodc is null)

Set CurrentRA TA Status = "OOC-Recertification Test Has Critical Errors".

else if (RATATestRecordsByLocationForQAStatus.TestResultCode = "FAILED")

Set CurrentRA TA Status = "OOC-Recertification Test Failed".

else if (RATATestRecordsByLocationForQAStatus.TestResultCode = "ABORTED")

Set CurrentRA TA Status = "OOC-Recertification Test Aborted".

else

if (PriorRA TA Record is null)

RequiredLevelCount = MaxLevelCount

else (if PriorRA TAEventRecordRKX A3 Required is equal to " Y")
RequiredLevelCount = 3

else (if PriorRA TAEventRecordRKXA2Rcquircd is equal to " Y")

Set CurrentRA TA Status = "OOC-Event".

else

Environmental Protection Agency

Page 676 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

RequiredLevelCount = 2

else

RequiredLevelCount = 1

If (number of levels in RATA TestRecords lly Location ForOAStatus.OpLc\c\CodcL]sl is less than
RequiredLevelCount)

Set CurrentRA TAStatus = "OOC-Incomplete Recertification".

else

Set RATA Event Operating Level Count to the RequiredLevelCount.

If (InvalidRATARecord is null)

Locate the earliest record in RATATestRecordsByLocationForQAStatus where the SystemID is
equal to the Prior RA TA E ventRecord Sy stem ID, the TestResult is equal to "INVALID" and the
EndDate/Hour is on or after the Prior RA TA E ventRecord Condi tional Data Begin Date/Hour and is
before the EndDate/EndHour of the RATATestRecordsByLocationForQAStatus record retrieved
above.

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

else

if (Prior RA TAE ventRecord.RAT A3 Required is equal to "Y")

Set RATA Event Operating Level Count to 3.

else (if PriorRATAEventRecord.RklA2Rcquircd is equal to " Y")

Set RATA Event Operating Level Count to 2.

else

Set RATA Event Operating Level Count to 1.

if (Current RA TAStatus is null AND Annual Reporting Requirement == false)

If (SubsequentRATARecord is not null and SubsequentRATARecord.EndDate/Hour is greater than
October 30th of the year of the CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour) OR
(SubsequentRATARecord is null and the CurrentHourlyRecordforRA TA Status Date/Hour is in the 3rd

quarter))

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired",
if i CurrentRA TAStatus is null)

if (PriorRATAEventRecord.RklAC'crtEvent == "Y")

if ((CurrentHourlyRecordforRA7/1.Vfrtfw.v. Parameter <> "FLOW" and

PriorRA TAEventRecord EventCodc = 125) or (CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Parameter ==
"FLOW" and PriorRA TA EventRecord .EvcniQo&c = 305))

Environmental Protection Agency

Page 677 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (the associated BeginDate of the system in the PriorRATAEventRecord is null)
Set CurrentRA TA Status = "Invalid Monitor System"

else

If (the associated SystemTypeCode of the system in the PriorRATAEventRecord
== "S02")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {ARP,
CAIRS02} and the UnitMonitorCertBeginDate is ON OR BEFORE the
associated BeginDate of the system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
ProgramCode is in set {ARP, CAIRS02} and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorRATAEventRecord.

else if (the associated SystemTypeCode of the system in the
PriorRATAEventRecord == "NOX")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {ARP,
NBP, NHNOX, CAIRNOX, CAIROS, SIPNOX} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of
the system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
ProgramCode is in set {ARP, CAIRS02, NBP, NHNOX, CAIRNOX,
CAIROS, SIPNOX} and the EmissionsRecordingBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorRA TAEventRecord.

else if (the associated SystemTypeCode of the system in the
PriorRATAEventRecord == "NOXC")

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the ProgramCode is in set {NBP,
NHNOX, CAIRNOX, CAIROS, SIPNOX} and the UnitMonitorCertBeginDate
is ON OR BEFORE the associated BeginDate of the system in the
PriorRA TAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation

with the latest EmissionsRecordingBeginDate where the
ProgramCode is in set {NBP, NHNOX, CAIRNOX, CAIROS,
SIPNOX} and the EmissionsRecordingBeginDate is ON OR BEFORE

Environmental Protection Agency

Page 678 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

the associated BeginDate of the system in the
PriorRA TAEventRecord.

else

Locate the record in LocationProgramRecordsByHourLocation with the
latest UnitMonitorCertBeginDate where the UnitMonitorCertBeginDate is
ON OR BEFORE the associated BeginDate of the system in the
Prior RA TAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation
with the latest EmissionsRecordingBeginDate where the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the Prior RATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Set CurrentRA TAStatus = "Missing Program".

else if (A ocationProgramRecordsByHourLocationiJ n i t Moni torC crt Dcadl i nc is not

null)

if (CurrentDate is prior to the

Location Program Records liyHourLocationAJmlMomlorCcrlDc'Lidlmc)
Set CurrentRA TA Status = "IC-Conditional".

else

Set CurrentRA TA Status = "PendingOOC-Conditional Period
Expired".

else

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocation.UmtMomtorCertBeginDate +

180 days)

Set CurrentRA TA Status = "IC-Conditional".

else

Set CurrentRA TA Status = "PendingOOC-Conditional Period
Expired".

else

If (the number of calendar days ON OR AFTER the

Prior RA TA E vent Record Q A C crt E vcn t D ate and ON OR BEFORE the

CurrentHourlyRecordforRA 7/1 .Vfrtfw.v. Date/Hour > 180)

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired".

else if (the quarter of the Prior RA TA E ventRecord. Q A C crt E vcn t D ate is equal to the quarter
of the CurrentHourlyRecordforRA TA Status. D a tc/H o ur )

If (the number of calendar days ON OR AFTER the

Environmental Protection Agency

Page 679 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Prior RA TA E vent Record Q A C crt E vcn t D a tc and ON OR BEFORE the
CurrentHourlyRecordforRATAStatus.Dd.tQ/Houv > 90)

If (Rpt Period Op Hours Accumulator Array for the location == -1)
Set CurrentRA TA Status = "Invalid Op Data".

else if (the number of calendar days ON OR AFTER the
Prior RA TA E ventRecord Q A C crt E vcn t D a tc and ON OR BEFORE the
CurrentHourlyRecordforRA TA Status Date/Ho ur is equal to Rpt Period Op
Days Accumulator Array for the location)

Set CurrentRA TA Status = "PendingOOC-Conditional Period
Expired".

else

Set CurrentRA TA Status = "IC-Conditional".

else

Set CurrentRA TA Status = "IC-Conditional".

else if (PriorRATAEventRecordMmO^Dsy'sPxioxQvL&xtQX is null)

Set PriorRA 7M EveMffiecwv/. MinOpDay sPriorQuartcr = 0
Set PriorRA 7M £"veMf/?ecwf/. MaxOpDay sPriorQuartcr = 0

For each quarter beginning with the quarter of the

PriorRA TA E ventRecord Q A C crt E vcn t D a tc and continuing through the quarter
BEFORE the CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour :

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Locate the record in OperatingSuppDataRecordsbyLocation where
the OpTypeCode is equal to "OPDAYS" and the reporting period is
equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Set PriorRA TAE ventRecord MmO\)D'A\?,Pr\or()iVArVcr = -1
SetRATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where
[YEAR] is the year of the quarter being checked and [QTR] is
the number of the quarter being checked.)
exit for.

else

If the quarter being checked is the quarter of the
PriorRA TAEventRecord. Q ACertEventDate

If (OperatingSuppDataRecordsbyLocation. Op Value
MINUS the number of calendar days in the quarter
being checked that are PRIOR to the
PriorRA TAEventRecord.Q ACcrlEvcnlDAlc > 0)

Environmental Protection Agency

Page 680 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set

PriorRATAEventRecord.MmOpDaysPriorQ
uarter =

OperatingSuppDataRecordsbyLocation. Op

Value MINUS the number of calendar days in
the quarter being checked that are PRIOR to
the

PriorRA TAEventRecord. Q ACertEventDate

If (OperatingSuppDataRecordsbyL ocation. Op Value
is less than the number of calendar days in the
quarter being checked that are ON OR AFTER the
PriorRA TAEventRecord. Q ACertEventDate)

Set

PriorRA TA EventRecord. M a\ Op Day sPriorQ

uarter =

OperatingSuppDataRecordsbyL ocation. Op

Value.

Set

PriorRA TA EventReconl M a\ Op D ay s P ri orQ

uarter = the number of calendar days in the
quarter being checked that are ON OR
AFTER the

PriorRA TAEventRecord. Q ACertEventDate.

else

Set

PriorRA TAEventRecordMmO^'A\?Pr\orQvvAr{cr =
PriorRA 7/4£'veM£7?ecw 90)

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired".

else if {PriorRA '/'/lEveMf^ectfn/.MaxOpDaysPriorQuartcr + Rpt Period Op Days
Accumulator Array for the Location > 90)

Set CurrentRA TA Status = "Undetermined-Conditional Data".

else

Environmental Protection Agency

Page 681 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentRA TA Status = "IC-Conditional".

else

Set Current RA TA Status = "IC-Conditional".

If (the quarter of the Prior RA TA E vent Record C on di t i on a 1B c gi n D a tc is equal to the quarter of the
CurrentHourlyRecordforRA TAStatus. D ate/Hour)

Count the number of HourlyOpData records for the location where OpTime is greater than 0
and Date/Hour is ON OR AFTER the Pfw7L47^4£'veMf./?ec 720,

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired".

else

Set CurrentRA TA Status = "IC-Conditional".

else

if (Prior RA TA E vent Record M i n Op H o urs P ri orQ uartcr is null)

Set Prior RA TA E ventRecord M i n Op H o urs P ri orQ uartcr = 0
Set PriorRA /MfVeM^etYWY/.MaxOpHoursPnorQuartcr = 0

for each quarter beginning with the quarter of the

PriorRA TA E ventRecord Condi tional Begin Date and continuing through the quarter
BEFORE the CurrentH ourlyRecordforRA 7'AVfflfH.v. Date/Hour :

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

if {Annual Reporting Requirement == false AND the quarter being
checked == 2)

Locate the record in

OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OSHOURS" and the reporting
period is equal to the quarter being checked.

else

Locate the record in

OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OPHOURS", FuelCode is null, and
the reporting period is equal to the quarter being checked.

if (OperatingSuppDataRecordsbyLocation is not found)

Set PriorRA TA EventRecord MmOvHouisPnorQanricr = -1
Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where

Environmental Protection Agency

Page 682 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

[YEAR] is the year of the quarter being checked and [QTR] is
the number of the quarter being checked.)
exit for.

else

If the quarter being checked is the quarter of the
PriorRA TAEventRecord. ConditionalBeginDate

If (OperatingSuppDataRecordsbyLocation. Op Value
MINUS the number of calendar hours in the quarter
being checked that are PRIOR to the
PriorRA TAEventRecord. ConditionalBeginDate/Ho
ur> 0)

Set

PriorRA TAEventRecord. MinOpHoursPrior
Quarter =

OperatingSuppDataRecordsbyL ocation. Op

Value MINUS the number of calendar hours
in the quarter being checked that are PRIOR
to the

PriorRA TAEventRecord. ConditionalBeginD
ate/Hour

If (()peratingSuppl)ataRecordsbyL ocation Op Va 1 lie

is less than the number of calendar hours in the
quarter begin checked that are ON OR AFTER the
PriorRA TAEventRecord. ConditionalBeginDate/Ho
ur)

Set

PriorRA TA EventRecord M a\OpHoursPri or

Quarter =

OperatingSuppDataRecordsbyL ocation. Op

Value.

else

Set

PriorRA TA EventRecord M a \ O p H o urs Pri or

Quarter = the number of calendar hours in
the quarter being checked that are ON OR
AFTER the

PriorRA TA EventRecord Condi tional Begin D
ate/Hour.

else

Set

PriorRAT^4£'veM£./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

+ OperatingSuppDataRecordsbyLocation. Op V alue.

Set PriorRA TA EventRecord M a\Op Hours

PriorQuarter =

Prior RATA E ventRecord.M'A\0\)Y\ovir?,?r\orQvvAr{cr
+ OperatingSuppDataRecordsbyL ocatiott. Op Value.

if {PriorRATAEventRecordMxnO^HoviviPnorQviivcicr == -1)
set CurrentRA TA Status to "Missing Op Data"

else if (Rpt Period Op Days Accumulator Array for the location == -1)

if (PriorRA TA EventRecord M in Op HoursPriorQuartcr > 720)

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired".

else

Set CurrentRA TA Status = "Invalid Op Data".

else

if (PriorRA TA E ventRecord M i n Op H o urs P ri orQ uartcr + Rpt Period Op Hours
Accumulator Array for the Location > 720)

Set CurrentRA TA Status = "PendingOOC-Conditional Period Expired".

else if (Pfw£,veM*/?ecw 720)

Set CurrentRA TA Status = "Undetermined-Conditional Data".

else

Set CurrentRA TA Status = "IC-Conditional".

Results:

Result

Usage:

Response

Severity

1

Process/Category:

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 684 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RATSTAT-6

Check Name:

Evaluate Prior Multi-Level RATA

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set PriorRatalsAlternateSingleLevelRATA = false.

Set ThreeLoadRATAExpirationDate to null.

If (CurrentHourlyRecordforRATAStatus Parameter == "FLOW" AND PriorRA TARecord is not null AND CurrentRA TAStatus is

null, starts with "IC", starts with "Undetermined", or starts with "PendingOOC")

Set PriorRatalsAlternateSingleLevelRATA = true.

Set PriorMultiLevelRATARecord = null.

Set InvalidMultiLevelRATARecord = null.

Set PriorMaxLevelRA TA Record = null.

if (the number of levels in Prior RA 7M	O p L e v e 1C o de L i s t is greater than or equal to the MaxLevelCount)

Set PriorRatalsAIternateSingleLevelRATA = false,
exit check.

else if (Prior RA TA Record Op L c vc 1C ode L i st contains 2 levels)

Set PriorRatalsAIternateSingleLevelRATA = false,
if (MaxLevelCount o 3)

else if (AnnualReportingRequiremnt == true)

if (PriorRATARecord.O^LQNQlCoAeLisi contains 1 level and PriorRA 7/1/?£««*
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

(the number of operating levels the OpLevelCodeList is greater than or equal to 2 or the TestClaimCode ==
"SLC").

if (RA TA TestRecordsBy Location ForOA Status is found)

Set InvalidMultiLevelRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the Prior RA TA Record System ID and the EndDate/Hour is prior to the
PriorRATARecord.BadD&X&IYiovx and the TestResultCode is equal to "INVALID", and the number of
operating levels the OpLevelCodeList is greater than or equal to 2 or the TestClaimCode == "SLC").

if (RA TA TestRecordsBy Location ForOAStatus is found)

Set InvalidMultiLevelRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

if (PriorMultiLeveIRA TA Record is not null)

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the
PriorMultiLeveIRA TA Record System ID and RATA2Required is equal to " Y" and the QACertEventDate is
either:

a)	prior to the CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour OR

b)	equal to both the CurrentHourlyRecordforRA 7/1.Vfrtfw.v. Date/Hour and the ConditionalBeginDate/Hour;
AND either:

a)	QACertEventDate/Hour is after the PriorMultiLeveIRA TA Record EndDate/Hour OR

b)	QACertEventDate/Hour is equal to the PriorMultiLeveIRA TA Record EndDate/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the

PriorMultiLe velRA TA Record EndDate/Hour)

AND either

a)	Annual Reporting Requirement is equal to true OR

b)	QACertEventDate/Hour is on or after April 1 of the year of the
CurrentHourlyRecordforRA TA Status. D ate

if (QACertificationEventRecords is found)

Set CurrentRataStatus = "OOC-Incomplete Recertification".

Set SubsequentRATARecord = PriorMultiLevelRATARecord.

else

if (PriorMultiLeveIRA rf ARecord .QANccdsEvaluationFlag = "Y")

Set CurrentRA TA Status = "Prior Multi-Level RATA Not Yet Evaluated".

Environmental Protection Agency

Page 686 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

else if (Prior MultiLeveIRA TARecord .TestResultCode = null or PriorMultiLevelRATARecord

.TestResultCode = "FAILED" or PriorMultiLevelRATARecord TestResultCode = "ABORTED")

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

else if (the number of levels in PriorMultiLeveIRA TA Record.OpLcvc\CodcL]sl is greater than or
equal to MaxLevelCount)

exit check.

else

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

if i CurrentRA TA Status is null, starts with "IC", starts with "Undetermined", or starts with "PendingOOC" AND
RATAEventOperatingLevelCount is null or less than MaxLevelCount))

Set InvalidMultiLevelRATARecord = null.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is
equal to the CurrentHourlyRecordforRATAStatus.SystemID and the TestResultCode is not equal to "INVALID"
and the EndDate/Hour is prior to the PriorRATARecordEndDatQlliow and the number of operating levels in the
OpLevelCodeList is equal to the MaxLevelCount.

if (RATATestRecordsByLocationForQAStatus is found)

Set PriorMaxLevelRA TA Record = the found record in RATATestRecordsByLocationForQAStatus.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the CurrentHourlyRecordforRA TA Status Sy stem ID and the EndDate/Hour is prior to
the PriorRA TA Record EndDate/Hour and the EndDate/Hour is greater than the
PriorMaxLevelRA TA Record EndDate/Hour and the TestResultCode is equal to "INVALID" and the
number of operating levels the OpLevelCodeList is equal to the MaxLevelCount.

if (RA TA TestRecordsIiy Location ForOAStatus is found)

Set InvalidMultiLevelRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the CurrentHourlyRecordforRA TA Status Sy stem ID and the EndDate/Hour is prior to
the PriorRATARecord.Ba6D&\&IUovs and the TestResultCode is equal to "INVALID" and the number of
operating levels the OpLevelCodeList is equal to the MaxLevelCount.

if (RA TA TestRecordsIiy Location ForQA Status is found)

Set InvalidMultiLevelRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

Environmental Protection Agency

Page 687 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (PriorMaxLevelRA TA Record is null)

Set CurrentRA TAStatus = "OOC-No Prior Maximum Level RATA".

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the
CurrentHourlyRecordforRA TAStatus. SystemID and

AND either

a)	MaxLevelCount is equal to 2 and RATA2Required is equal to " Y" OR

b)	MaxLevelCount is equal to 2 and RAT A3 Required is equal to " Y" OR

c)	MaxLevelCount is equal to 3 and RAT A3 Required is equal to " Y"

AND the QACertEventDate is either:

a)	prior to the CurrentHourlyRecordforRA 7'AVfflfH.v. Date/Hour OR

b)	equal to both the CurrentHourlyRecordforRA TAStatus. Ddlc/Hour and the ConditionalBeginDate/Hour;
AND either:

a)	QACertEventDate/Hour is after the Prior Max I. e velRA TA	E n d D a t e/ H o ur OR

b)	QACertEventDate/Hour is equal to the PriorMaxLevelRA TA Record EndDatc/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the

PriorMaxLevelRA TA Record EndDate/Hour)

if (QACertificationEventRecords is found)

Set CurrentRataStatus = "OOC-Incomplete Recertification".

Set SubsequentRA TA Record = PriorMaxLevelRA TA Record

else if (Prior MaxL e ve//?,4 7M ««/. Q A N e ed s E v a 1 u a t i o n F1 a g = "Y")

Set CurrentRA TA Status = "Prior Maximum Level RATA Not Yet Evaluated".

else if (PriorMaxLevelRA TA Record Test Resul tCode = null)

Set CurrentRA TA Status = "OOC-Prior Maximum Level RATA Has Critical Errors".

else if (PriorMaxLevelRATARecord TQStRQSultCodQ= "FAILED")

Set CurrentRA TA Status = "OOC-Prior Maximum Level RATA Failed".

else if (PriorMaxLevelRATARecord TQStRQSultCodQ= "ABORTED")

Set CurrentRA TA Status = "OOC-Prior Maximum Level RATA Aborted".

else

Set PriorMaxLevelRATA Record.TcslExpnaUonDalc = the end of the quarter twenty quarters after
the PriorMaxLevelRA TA Record EndDatc.

Environmental Protection Agency

Page 688 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (CurrentHourlyRecordforRA TAStatus Date is after the
Prior Max L e veIRA TARecord. T estExpirationDate)

if (Annual Reporting Requirement == false)

Set Current RA TA Status = "OOC-Prior Maximum Level RATA Expired".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location.

If (GraceOpHours < 0)

Set Current RA TA Status = "Invalid Op Data".

else if (GraceOpHours > 720)

Set Current RA TA Status = "OOC-Prior Maximum Level RATA Expired".

else

For each quarter beginning with the quarter after the
PriorMaxLevelRATARecord.TcslExptf'ciUonD'dlc and continuing through
the quarter prior to the CurrentHourlyRecordforRA TA Status. D a tc/H o ur ,

if (EarliestLocationReportDate <= the last day of the quarter being
checked)

Locate a record in OperatingSuppDataRecordsByLocation

where the reporting period is equal to the year/quarter being
checked and the OpTypeCode = "OPHOURS" and FuelCode
is null.

if (OperatingSuppDataRecordsByLocation is found)

Add OpValue to GraceOpHours.

if (GraceOpHours > 720)

Set Current RA TA Status = "OOC-Prior
Maximum Level RATA Expired".
exit for.

else

Set Current RA TA Status = "Missing Op
Data".

Set RATAMissingOpDatalnfo = " [YEAR]
Q[QTR]" (where [YEAR] is the year of the
quarter being checked and [QTR] is the
number of the quarter being checked.)
exit for.

Environmental Protection Agency

Page 689 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result	Response

Usage:

1	Process/Category:	Emissions Data Evaluation Report

2	Process/Category:	Emissions Data Evaluation Report

3	Process/Category:	Emissions Data Evaluation Report

4	Process/Category:	Emissions Data Evaluation Report

5	Process/Category:	Emissions Data Evaluation Report

6	Process/Category:	Emissions Data Evaluation Report

7	Process/Category:	Emissions Data Evaluation Report

Severity

C02/02 RAT A Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 690 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:	RATSTAT-7

Check Name:	Determine Expiration Dates for Most Recent Prior RAT A T est

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

if i CurrentRA TA Status is null and PriorRATARecord is not null and PriorRA TA Event Record is null)

Set PriorTestExpirationDate = null

Set PriorTestExpirationDate WithExtension = null

Set MissingOpData = false

Set NumberOfExtensionQuarters = 0

Set PriorTestExpirationDate = Prior RA 7 M	T e s t E \ p i r a t i o n D a t e.

Set PriorTestExpirationDateWithExtension = Praw7L47^4./?ecwLVfflfH.v. System DesignationCode == "B")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
CurrentHourlyRecordforRATAStatusSystsmlD and the ExtensionExemptionCode is equal to "NRB720"
and a ReportingPeriod equal to the CurrentReportingPeriod.

if (TestExtensionExemptionRecords is found)

Locate the most recent QACertificationEventRecords for the

CurrentHourlyRecordforRATAStatusSystsmlD where RATARequired is equal to "Y" and the
QACertEventDate/Hour is prior to the PriorRA TA Record Bcgi n Da tc/Hour.

if (QACertificationEventRecords is found AND RATACertEvent == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
Prior RA TARecord. EndD ate/Hour)

Set PriorTestExpirationDate = the end of the quarter eight quarters after the
QACertificationEventRecords.CompletionTestDate.

else

Set PriorTestExpirationDate = the end of the quarter eight quarters after the
Prior RA TARecord. EndD ate.

if (PriorTestExpirationDate is null)

if (PriorRatalsAlternateSingleLevelRATA == true)

Environmental Protection Agency

Page 691 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set PriorTestExpirationDate = the end of the quarter one year after the
PriorMultiLevelRA TA Record EndDatc.

if (Prior MiiltiLe velRA TA Record GracePeri od I nd == 1)

Set PriorTestExpirationDate = the end of the quarter prior to the PriorTestExpirationDate.

if (PriorRA TA Record RataFreqlienca'Cd in set {4QTRS,8QTRS})

Locate the most recent QACertificationEventRecords for the Prior RA TA Record Sy stem ID
where RATARequired is equal to " Y" and the BeginDate/Hour is prior to the
Prior RA TA Record BcginDatc/Hour.

if (QACertificationEventRecords is found and RATACertEvent == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
Prior RA TARecord. EndD ate/Hour)

Set PriorTestExpirationDate = the end of the quarter one year after the
QACertificationEventRecords.Completion! QsiDatQ.

else

Set PriorTestExpirationDate = the end of the quarter one year after the
Prior RA TARecord. EndD ate.

if (PriorRATARecord.Gx&coPQxiodhvl == 1)

Set PriorTestExpirationDate = the end of the quarter prior to the
PriorTestExpirationDate.

Locate the most recent QACertificationEventRecords for the Prior RA TA Record Sy stem ID
where RATARequired is equal to " Y" and the BeginD ate/Hour is prior to the
PriorRA TARecord BcginDatc/Hour.

if (QACertificationEventRecords is found AND RATACertEvent == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
Prior RA TARecord. EndD ate/Hour)

Set PriorTestExpirationDate = the end of the quarter two quarters after the
QACertificationEventRecords.CompletionTestDate.

else

Set PriorTestExpirationDate = the end of the quarter two quarters after the
Prior RA TARecord. EndD ate.

Set PriorRA 7/4/?ecwf/.TcstE\pirationDatc = PriorTestExpirationDate.

Environmental Protection Agency

Page 692 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if (CurrentHourlyRecordforRATAStatus.Date/Hour is ON OR BEFORE the PriorTestExpirationDate)

Set CurrentRA TAStatus = "IC".
else if (Annual Reporting Requirement == false)

Set CurrentRA TA Status = "OOC-Expired".

if (PriorTestExpirationDateWithExtension is null)

if (CurrentHourlyRecordforRA 7/1 .SY the last day of the quarter being checked)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else

Locate a record in OperatingSuppDataRecordsByLocation where the reporting period is
equal to the year/quarter being checked and the OpTypeCode = "OPHOURS".

if (OperatingSuppDataRecordsByLocation is found AND
OperatingSuppDataRecordsByLocation. Op Value <168)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else if {CurrentHourlyRecordforRA 7'AVfflfH.v.SystcmTypcCodc begins with "S02")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to
the CurrentHourlyRecordforRA TA Status Sy stem ID and the

Environmental Protection Agency

Page 693 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

ExtensionExemptionCode is equal to "LOWSQTR" and the reporting period is equal
to the year/quarter being checked.

if (TestExtensionExemptionRecords is found)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else if (OperatingSuppDataRecordsByLocation is not found)

Set Missing Op Data to true.

Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the
year of the quarter being checked and [QTR] is the number of the quarter
being checked.)

else if (CurrentHourlyRecordforRA /'AVfrtfM.v. System Designation Code == "PB")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to
the CurrentHourlyRecordforRATAStatusSystsmlD and the
ExtensionExemptionCode is equal to "NONQAPB" and the reporting period is equal
to the year/quarter being checked.

if (TestExtensionExemptionRecords is found)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else if (OperatingSuppDataRecordsByLocation is not found)

Set Missing Op Data to true.

Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the
year of the quarter being checked and [QTR] is the number of the quarter
being checked.)

else if (OperatingSuppDataRecordsByLocation is not found)

Set Missing Op Data to true.

Set RATAMissingOpDatalnfo = " [YEAR] Q[QTR]" (where [YEAR] is the year of the
quarter being checked and [QTR] is the number of the quarter being checked.)

Set PriorTestExpirationDateWithExtension = PriorTestExpirationDate.

Add NumberOfExtensionQuarters to PriorTestExpirationDateWithExtension.

Set _fVw7£47y4./?ecw
-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentRATAStatus = "Missing Op Data".

Set Praw7L47^4./?ecw 720)

Set CurrentRA TA Status = "OOC-Expired".

else

If there are no quarters beginning with the LATER of the quarter after the
PriorTestExpirationDateWithExtension and the quarter of the EarliestLocationReportDate and
ending with the quarter prior to the CurrentHourlyRecordforRA TA Status. Da tc/Hour ,

Set CurrentRA TA Status = "IC-Grace".

else

For each quarter beginning with the quarter after the

PriorTestExpirationDateWithExtension and continuing through the quarter prior to the
CurrentHourlyRecordforRA TAStatus. Date/Hour ,

if (EarliestLocationReportDate <= the last day of the quarter being checked)

Locate a record in OperatingSuppDataRecordsByLocation where the
reporting period is equal to the year/quarter being checked and the
OpTypeCode = "OPHOURS" and FuelCode is null.

if (OperatingSuppDataRecordsByLocation is found)

Add OpValue to GraceOpHours.

if (GraceOpHours > 720)

Set CurrentRA TA Status = "OOC-Expired".
exit for.

else

Set CurrentRA TA Status = "Missing Op Data".
SetRATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR]
is the year of the quarter being checked and [QTR] is the number of
the quarter being checked.)
exit for.

Environmental Protection Agency

Page 695 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

if i CurrentRA TA Status is null)

Set CurrentRA TA Status = "IC-Grace".

If (PriorRatalsAlternateSingleLevelRATA == true AND CurrentRA TA Status = "OOC-Expired")
Set CurrentRA TA Status = "OOC-Incomplete QA RATA".

Results:

Result

Usage:

Response

Severity

1

Process/Category:

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 696 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Check Code:

RATSTAT-8

Check Name:

Determine Final RATA Status

Related Former Checks:
Applicability:

CEM Check

Description:

Specifications:

Set AlternateRATARecord = null.

if i CurrentRA TA Status begins with "OOC")

Set InvalidRATATestNumber = null.

if (InvalidMultiLevelRA TARecord is not null)

Set Invalid RATA Test Number = InvalidMultiLevelRATARecord.TQStNumbQV
Set CurrentRA TA Status = CurrentRA TA Status &

else if (InvalidRA TA Record is not null)

Set InvalidRATATestNumber = In validRA TA Record T cstN limber
Set CurrentRA TA Status = CurrentRA TA Status &

Return result CurrentRA TA Status

else if (CurrentRATAStatus begins viiiYi "IC", "Undetermined" or "PendingOOC"

If (CurrentHourlyRecordforRATAStatus.SystsmlypQCd == "NOX")

Set ComponentlDList = null.

Set AlternateSystemlDList = null.

For each record in MonitorSystemComponentRecordsforHourandLocation where the SystemID is equal to the
CurrentHourlyRecordforRATAStatus.SystemID and ComponentTypeCd in list {"C02", "NOX", "02"}

Add MonitorSystemComponentRecordsforHourandLocation Componcnl\D to ComponentlDList.

if (ComponentlDList is not null)

For each record in MonitorSystemComponentRecordsforHourandLocation where the ComponentID is in
ComponentlDList and SysTypeCd in list {"C02", "02", "NOXC"}.

Add MonitorSystemComponentRecordsforHourandLocation Sy stem ID to AlternateSystemlDList.

if (.AlternateSystemlDList is not null)

If (PriorRATAEventRecord is not null)

If (PriorRArfAEventRecord.Condiliom\BcgmD'cilc is not null)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the

Environmental Protection Agency

Page 697 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

location where the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to
the CurrentHourlyRecordforRATAStatusDatQ/How and the EndDate/Hour is after the
PriorRATAEventRecord.Cori&iiiorisABQgmDatQlYlow and theTestResultCode is null or is
equal to "FAILED" or "ABORTED".

if (RA TA TestRecords By Location ForOA Status is found)

Set A ItemateRA TA Record = the found record in
RA TATestRecordsByLocationForQAStatus.

if (A ItemateRA TA Record T cstRcsultC'odc = null)

Set Current RA TA Status = "OOC-Prior Alternate System RATA Has Critical
Errors".

else if (AlternateRATARecord.TestResu\tCode = "FAILED")

Set CurrentRA TA Status = "OOC-Prior Alternate System RATA Failed",
else if (AlternateRATARecord.TestResu\tCode = "ABORTED")

Set CurrentRA TA Status = "OOC-Prior Alternate System RATA Aborted".

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for
the location where the SystemID is in AlternateSystemlDList and the EndDate/Hour
is prior to the CurrentHourlyRecordforRA TA Status Date/Hour and the
EndDate/Hour is after the PriorRA TAEventRecord Conditional Begin Date/Hour and
the QANeedsEvaluationFlag is equal to "Y".

if (RATATestRecordsByLocationForQAStatus is found)

Set A ItemateRA TA Record = the found record in
RA TATestRecordsByLocationForQAStatus.

Set CurrentRA TA Status = "Prior Alternate System RATA Not Yet
Evaluated".

else if (PriorRATARecord is not null)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where
the SystemID is in AlternateSystemLDList and the EndDate/Hour is prior to the
CurrentHourlyRecordforRATAStatus.Ddlc/Hour and the EndDate/Hour is after the
PriorRATARecord.EndDatQfUour and the TestResultCode is null or is equal to "FAILED" or
"ABORTED".

if (RATATestRecordsByLocationForQAStatus is found)

Set A ItemateRA TA Record = the found record in
RA TA TestRecordsByLocationForQAStatus.

if (AlternateRATARecord.TestResultCode = null)

Environmental Protection Agency

Page 698 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Set CurrentRA TAStatus = "OOC-Prior Alternate System RATA Has Critical Errors",
else if (A IternateRA TA Record T est Resul tC ode = "FAILED")

Set CurrentRA TA Status = "OOC-Prior Alternate System RATA Failed",
else if (A ItenmteRA TA Record T est Resul tC ode = "ABORTED")

Set CurrentRA TA Status = "OOC-Prior Alternate System RATA Aborted".

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the
location where the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to
the CurrentHourlyRecordforRATAStatus.DatQ/How and the EndDate/Hour is after the
Pr'wrRA TA Record EndDate/Hour and the QANeedsEvaluationFlag is equal to "Y".

if (RA TA TestRecordsIiyLocationForQAStatus is found)

Set A IternateRA TA Record = the found record in
RA TATestRecordsByLocationForQAStatus.

Set CurrentRA TA Status = "Prior Alternate System RATA Not Yet Evaluated".
If (Current RATA Status begins with "IC", "Undetermined" or "PendingOOC")

If (Prior RA TA Record is null)

Set RATA Status BAF = 1

else if (Current RATA Status begins with "IC-Cond", "Undetermined-Cond" or "PendingOOC-Cond" AND

( Prior RA TA E ventRecord Q A C crt E vcn t C ode is in set {40, 50, 51, 100, 101, 120, 125, 151, 250, 255,
300, 305}) OR PriorRA 7/1TestResultCode does NOT begin with "PASS"))

Set RATA Status BAF = 1

else if (CurrentHourly Record/or RA TA Status Sy stem ID is NOT equal to PriorRATARecord. SystemID)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the CurrentHourlyRecordforRATAStatus.SystemID, the TestResultCode is NOT
equal to "INVALID" and the EndDate/Hour is prior to the CurrentHourlyRecordforRA TA Status Date/Hour

If found,

Set RATA Status BAF to the OverallBiasAdjustmentFactor in the RATA record found above.

else

Set CurrentRA TA Status to "OOC-No Prior Test or Event".

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where
the SystemID is equal to the CurrentHourlyRecordforRATAStatus S\ slcm\D. the TestResultCode
is equal to "INVALID" and the EndDate/Hour is prior to the

Environmental Protection Agency

Page 699 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

CurrentHourlyRecordforRA TAStatus. D ate/Hour.

If found,

Set InvalidRATATestNumber to the TestNumber in the RATA record found above.
Set CurrentRA TAStatus = CurrentRA TAStatus &

else

Set RATA Status BAF = Prior RA TA	Overall BiasAdj ustmcntFactor

If i CurrentRA TAStatus begins with "PendingOOC")

Set InvalidRATATestNumber = null.

if (InvalidMultiLevelRATARecord is not null)

Set Invalid RATA Test Number = InvalidMultiLevelRA TA Record TcstNumbcr
Set CurrentRA TA Status = CurrentRA TA Status &

else if (InvalidRA TA Record is not null)

Set InvalidRATATestNumber = InvalidRA TA Record T cstNumbcr
Set CurrentRA TA Status = CurrentRA TA Status &

Replace "PendingOOC" with "OOC" in CurrentRA TA Status
Return result CurrentRA TA Status .

Else if i CurrentRA TAStatus does not begin with "IC")

Return result CurrentRA TA Status .

else

If i CurrentRA TAStatus does not begin with "IC")

Return result CurrentRA TA Status .

Environmental Protection Agency

Page 700 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

Results:

Result

Invalid Monitor
System

Invalid Op Data

Missing Op Data

Missing Program

OOC-Conditiona
1 Period Expired
OOC-Conditiona
1 Period Expired*

OOC-Event

OOC-Event*

OOC-Expired

OOC-Expired*

OOC-Incomplete
QA RATA
OOC-Incomplete
QA RATA*

OOC-Incomplete
Recertification

OOC-Incomplete
Recertification*

OOC-No Prior
Maximum Level
RATA

OOC-No Prior
Maximum Level
RATA*

OOC-No Prior
Test or Event
OOC-No Prior
Test or Event*

Response

The [testtype] status for [key] could not be determined, because the Monitor
System record for MonitoringSystemID [system] has a critical error.

The [testtype] status for [key] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or
invalid.

The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve
these records by logging on to the EPA host.

The [testtype] status for [key] could not be determined, because a Unit Program
record associated with the initial certification event for QACertEventCode [code]
QACertEventDate [eventdate] either does not exist or has a
UnitMonitorCertificationBeginDate inconsistent with the BeginDate of the
associated Monitor System record.

The conditional data period for QACertEventCode [code] QACertEventDate

[eventdate] for SystemID [EVENTKEY] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate

[eventdate] for SystemID [EVENTKEY] has expired. An invalid RATA was

ignored.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for SystemID [eventkey], but you did not indicate
the use of conditional data.

You reported a QA Certification Event record for QACertEventCode [code]

QACertEventDate [eventdate] for SystemID [eventkey], but you did not indicate

the use of conditional data. An invalid [testtype] was ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has

expired.

The prior RATA for [RATASYS] with TestNumber [testnum] has expired. An

invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for FLOW SystemID [RATASYS] with TestNumber [testnum] was

a single-level RATA instead of the required multi-level RATA.

The prior RATA for FLOW SystemID [RATASYS] with TestNumber [testnum] was

a single-level RATA instead of the required multi-level RATA. An invalid prior

test with TestNumber [invtestnum] was ignored.

The subsequent recertification RATA for FLOW SystemID [SUBSYS] with
TestNumber [subtestnum] was performed at fewer than the required operating
levels.

The subsequent recertification RATA for FLOW SystemID [SUBSYS] with
TestNumber [subtestnum] was performed at fewer than the required operating
levels. An invalid prior test with TestNumber [invtestnum] was ignored.

You did not report a valid prior [max]-level flow RATA for [key].

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

You did not report a valid prior [max]-level flow RATA for [key]. An invalid RATA Critical Error Level 1
with TestNumber [invtestnum] was ignored.

You did not report a prior [testtype] or certification event for [key].	Critical Error Level 1

You did not report a valid prior [testtype] or certification event for [key]. An	Critical Error Level 1

invalid [testtype] with TestNumber [invtestnum] was ignored.

Environmental Protection Agency

Page 701 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-Prior
Alternate
System RATA
Aborted
OOC-Prior
Alternate
System RATA
Failed
OOC-Prior
Alternate
System RATA
Has Critical
Errors
OOC-Prior
Maximum Level
RATA Aborted
OOC-Prior
Maximum Level
RATA Aborted*
OOC-Prior
Maximum Level
RATA Expired
OOC-Prior
Maximum Level
RATA Expired*
OOC-Prior
Maximum Level
RATA Failed
OOC-Prior
Maximum Level
RATA Failed*
OOC-Prior
Maximum Level
RATA Has
Critical Errors
OOC-Prior
Maximum Level
RATA Has
Critical Errors*
OOC-Prior Test
Aborted
OOC-Prior Test
Aborted*
OOC-Prior Test
Failed

OOC-Prior Test
Failed*

OOC-Prior Test
Has Critical
Errors

OOC-Prior Test
Has Critical
Errors*

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] was Critical Error Level 1
aborted, so [key], which contains a component that is also in the former system, is
out-of-control.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys]	Critical Error Level 1

failed, so [key], which contains a component that is also in the former system, is
out-of-control.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] has Critical Error Level 1
critical errors, so [key], which contains a component that is also in the former
system, is out-cf-control.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] was	Critical Error Level 1

aborted.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] was	Critical Error Level 1

aborted. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has	Critical Error Level 1

expired.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has	Critical Error Level 1

expired. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed. Critical Error Level 1

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed. Critical Error Level 1
An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has	Critical Error Level 1

critical errors.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has	Critical Error Level 1

critical errors. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was	Critical Error Level 1

aborted.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was	Critical Error Level 1

aborted. An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] failed.	Critical Error Level 1

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] failed. An Critical Error Level 1
invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has critical Critical Error Level 1
errors.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has critical Critical Error Level 1
errors. An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

Environmental Protection Agency

Page 702 of 703


-------
Draft ECMPS Emissions Check Specifications

3/7/2012 12:00:00AM

OOC-Recertificat
ion Test
Aborted

OOC-Recertificat
ion Test
Aborted*
OOC-Recertificat
ion Test Failed
OOC-Recertificat
ion Test Failed*

OOC-Recertificat
ion Test Has
Critical Errors
OOC-Recertificat
ion Test Has
Critical Errors*
Prior Alternate
System RATA
Not Yet
Evaluated
Prior Maximum
Level RATA Not
Yet Evaluated
Prior Multi-Level
RATA Not Yet
Evaluated
Prior Test Not
Yet Evaluated
Recertification
Test Not Yet
Evaluated
Undetermined-C
onditional Data

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] was aborted.

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] was aborted. An invalid [testtype] with TestNumber [invtestnum]
was ignored.

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] failed.

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] failed. An invalid [testtype] with TestNumber [invtestnum] was
ignored.

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] has critical errors.

The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] has critical errors. An invalid [testtype] with TestNumber
[invtestnum] was ignored.

The RATA status for [key] could not be determined, because a prior RATA with
TestNumber [alttestnum] for Monitoring SystemID [altsys], which contains a
component that is also in the former system, has not yet been evaluated.

The RATA status for [key] could not be determined, because the prior [max]-level
flow RATA with TestNumber [maxtestnum] has not yet been evaluated.

The RATA status could not be determined, because the prior multi-level flow
RATA for SystemID [RATASYS] with TestNumber [multitestnum] has not yet
been evaluated.

The RATA status could not be determined, because the applicable prior RATA for
SystemID [RATASYS] with TestNumber [testnum] has not yet been evaluated.
The RATA status could not be determined, because the subsequent recertification
RATA for SystemID [subsys] with TestNumber [subtestnum] has not yet been
evaluated.

The software could not determine if the current hour was within the conditional
data period for QACertEventCode [code] QACertEventDate [eventdate] for
SystemID [eventkey].

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 703 of 703


-------