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 09, 2016


-------
Table of Contents

Appendix D and E Status	1

Daily Calibration Status	35

Daily Calibration Test	47

Daily Emissions Data	98

Daily Interference Status	114

Daily Test	120

EM Weekly System Integrity Test	127

EM Weekly Test Summary	139

Flow-to-Load Status	149

Hourly Aggregation	163

Hourly Appendix D	210


-------
Hourly Appendix E	272

Hourly Apportionment	288

Hourly Calculated Data	305

Hourly Derived Data	362

Hourly General	427

Hourly Monitor Data	461

Hourly Operating Data	515

Leak Status	566

Linearity Status	575

LME	602

MATS Calculated Hourly Value Checks	654

MATS Derived Hourly Value Checks	681

MATS Hourly GFM Data	701

MATS Monitor Hourly Value Checks	711

MATS Operating Hour Checks	737

MATS Sampling Train Checks	757

MATS Sorbent Trap Data	779

RATA Status	798

Weekly System Integrity Status	835


-------
Check Category:
Appendix D and E Status


-------
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 AppE NOXE 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 (AppendixETestRecordsByLocationForQAStatus is found)

Set Prior AppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.

Locate the most recent record in AppendixETestRecordsByLocationForQAStatus 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 AppendixERecord.EndDate/Hour.

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.

else

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

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.
if (PriorAppendixERecord is not null)

if (Prior A ppen dixERecord.QANeedsEy a 1 ua t i o n F1 a g = "Y")

Set CurrentAppendixEStatus = "Prior Test Not Yet Evaluated",
else if (PriorAppendixERecord.TestResultCode = null)

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

else


-------
Set PriorTestExpirationDate = Prior A ppendixERecord. Tc s t E \ p i ra t i o n D a tc

if (PriorTestExpirationDate is null)

Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
PriorAppendixERecordEndDate/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
PriorAppendixERecordEndDate/Hour

if {QACertificationEventRecords is found)

Set PriorAppendixEEventRecord = the found record in QACertificationEventRecords.

if (the number of calendar days ON OR AFTER the

Prior A ppendixEEventRecord. Q A Cc rt E vc lit Da tc and ON OR BEFORE the

CurrentOperatingDate/Hour > 180)

Set CurrentAppendixEStatus = "OOC-Event".

else if {PriorAppendixEEventRecord .MinOpDaysPriorQuarter is null)

Set Prior AppendixEEventRecord .MinOpDaysPriorQuarter = 0
Set Prior AppendixEEventRecord .MaxOpDaysPriorQuarter = 0

for each quarter beginning with the quarter of the

PriorAppendixEEventRecord.QACertEventDate and continuing through the quarter
BEFORE the CurrentOperatingDate/Hour.

if (Earliest!.ocationReportDate <= 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 PriorAppendixEEventRecord.MinOpDaysPriorQuarter = -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.

else

If the quarter being checked is the quarter of the
Prior Appen dhcEE vent Record. Q A C c rt E v e n t D a t c

If (()peratingSuppl)ataRecordsbyL ocation.Op V a 1 lie

MINUS the number of calendar days in the quarter
being checked that are PRIOR to the
PriorAppendixEEventRecord.QACertEventDate > 0)


-------
Set

PriorAppendixEEventRecordMinOpDaysPrior
Quarter =

OperatingSuppDataRecordsbyLocation. OpVal
ue MINUS the number of calendar days in the
quarter being checked that are PRIOR to the
PriorAppendixEEventRecord.QACertEventDat

e

If ((fperatingSuppDatuRecordsbyLocation.Op Va 1 lie is

less than the number of calendar days in the quarter
being checked that are ON OR AFTER the
PriorAppendixEEventRecord.QACertEventDate)

Set

PriorAppendixEEventRecord.MaxOpDaysPrio
rQuarter =

OperatingSuppDataRecordsbyLocation. OpVal
ue.

else

Set

PriorAppendixEEventRecord.MaxOpDaysPrio
rQuarter = the number of calendar days in the
quarter being checked that are ON OR AFTER
the

PriorAppendixEEventRecord.QACertEventDat
e.

else

Set

PriorAppendixEEventRecord.MmOpDaysPnorQuarter

PriorAppendixEEventRecord.MmOpDaysPnorQuarter
+ OperatingSuppDataRecordsbyLocation. Op Value.

Set PriorAppendixEEventRecord.MaxOpDays,
PriorQuarter =

PriorAppendixEEventRecordMaxOpDaysPriorQuarter
+ OperatingSuppDataRecordsbyLocation. Op Value.

If (CurrentAppendixEStatus does NOT begin with "OOC")

if (RptPeriodOp Time Accumulator Array for ths Location == -1)

set CurrentAppendixEStatus = "Invalid Op Data"

elseif (Prior A ppen dixEE ventRecorcl. M i nO p D ay s P ri o rQ ua rt c r = = -1)

set CurrentAppendixEStatus = 'Missing Op Data"

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

Set CurrentAppendixEStatus = "OOC-Event".

else if (PriorAppendixEEventRecord MaxOpDaysPriorQuarter + 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 AppendbcETestRecordsIiyLocationForOAStatus 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 (AppendixETestRecordsByLocationForQAStatus is found)

Set SubsequentAppendixERecord = the found record in
AppendixETestRecordsByLocationForQAStatus.

Locate the earliest record in AppendixETestRecordsByLocationForQAStatus 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.EndDatefHour

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in
AppendixETestRecordsByLocationForQAStatus.

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 -1)/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. U nitFuclCodc

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

Set CurrentAppendixEStatus = "Invalid Location Fuel"

else if (FuelRecordsByHourLocation.lndicatorCode is equal to "S",


-------
if (SubsequentAppendixERecord.QANeedsEvahmtioviFlag = "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"

Set PriorAppendixERecord = SubsequentAppendixERecord

else

Set CurrentAppendixEStatus = "OOC-No Prior Test"

else

Set CurrentAppendixEStatus = "OOC-No Prior Test"

Locate the earliest record in AppendixETestRecordsByLocationForQAStatus 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 (AppendixETestRecordsIiyLocationForOAStatus 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.


-------
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-Subsequent
Test Has Critical
Errors

OOC-Subsequent
Test Has Critical
Errors*

Prior Test Not
Yet Evaluated

Subsequent Test
Not Yet
Evaluated
Undetermined-Ev
ent

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.

The software could not determine if the current hour was within the 30-operating day
window required to conduct another Appendix E test following QACertEventCode
[code] QACertEventDate [eventdate] for MonitoringSystemID [ID],

Severity

Critical Error Level

Critical Error Level
Critical Error Level

Critical Error Level
Critical Error Level

Critical Error Level
Critical Error Level

Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level


-------
Usage:

1

Process/Category:

Emissions Data Evaluation Report — Hourly Configuration Evaluation



Conditions:

App E Checks Needed Equals true

2

Process/Category:

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification



Conditions:

App E Constant Fuel Mix Equals true

3

Process/Category:

Emissions Data Evaluation Report	Hourly Fuel Flow



Conditions:

App E Constant Fuel Mix Equals false


-------
Check Code:	ADESTAT-2

Check Name:	Locate Most Recent Prior Accuracy Test

Related Former Checks:

Applicability:

Description:	Determines if there is an applicable prior accuracy test.

Specifications:

Set Current Accuracy Status = null.

Set PriorAccuracyRecord = 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
Fu el Flo i vCompon entRecord To Ch eck. C o m po nc n 11D and the TestResult is not equal to "INVALID" and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour

if (Accuracy TestRecordsByLocationForQAStatus is found)

Set Prior AccuracyRecord = the found record in AccuracyTestRecordsByLocationForQAStatus.

if (Prior Accuracy Record.T cstTy pcCodc is equal to "FFACCTT" AND
FuelFloivComponentRecordToCheck.S'c\mp\cAcqu\s\[\onMc[hod is NOT equal to "ORF", "NOZ", or "VEN")

Set Inappropriate Transmitter Transducer Test to true.

Locate the most recent record in AccuracyTestRecordsByLocationForOAStatus for the location where the ComponentID is equal
to the FuelFlowComponentRecordToCheck.ComponentID and the EndDate/Hour is prior to the CurrentOperatingDate/Hour and
the EndDate/Hour is greater than the Prior AccuracyRecordSxvSDaiQlYiow and the TestResult is equal to "INVALID".

if (A ecu racy TestRecordsBy Location For OA Status i s found)

Set InvalidAccuracyRecord = the found record in Accuracy TestRecordsByLocationForQAStatus.

if (7>iwv4ccwracy7te£w
-------
Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

Fuel Flowmeter QA Status Evaluation


-------
Check Code:

ADESTAT-3

Check Name:

Related Former Checks:

Locate Most Recent Prior Accuracy Event

Applicability:
Description:

Determines if there is a applicable prior event requiring an Accuracy test.

Specifications:

Set PriorAccuracyEventRecord = null.

If (CurrentA ccuracyStatus is null)

Locate the most recent record in QACertificationEventRecords WHERE

a)	the ComponentID is equal to the FuelFlowComponentRecordToCheck. ComponentID 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 PriorAccuracyRecord.EndDi\\dY\oux and the
Prior A ccuracy Record. R c i n s t a 11 a t i o n D a t c/ H o u r.

if {QACertificationEventRecords is found)

Set PriorAccuracyEventRecord = the found record in QACertificationEventRecords.
Set CurrentAccuracyStatus = "OOC-Event".

else

Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
Prior Accuracy Record.En&DaidHoux.

if (CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate)

Set CurrentA ccuracyStatus = "OOC-Accuracy Test Expired".

else

Set PriorTestExpirationDate = 4 quarters after the end of the quarter of the later of the
Prior Accuracy Record.EndDMdHoux and the Prior A ccuracy Record. R c i n s t a 11 a t i o n D a t c/ H o u r.
Set Prior A ccuracy Record. Tc s t E \ p i ra t i o n D a t c = PriorTestExpirationDate.

If (CurrentOperatingDate/Hour is ON OR BEFORE the PriorTestExpirationDate)

Set CurrentAccuracyStatus = "IC".

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation


-------
Check Code:

ADESTAT-4

Check Name:

Determine Eligibility for Fuel Flow to Load Testing (Accuracy)

Related Former Checks:

Applicability:
Description:

Determines if this component is eligible to extend their accuracy text expiration date using fuel flow to load
testing.

Specifications:

Set FF2LAccuracyEligible = null.
Set FF2LAccuracyC1ieckDate = null.

if (CurrentA ecu racy Status is null)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SysicmlD 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 PriorAccuracyRecord.EndDate and the Prior Accuracy Record. Rci nstal lationDatc.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2 LAccuracyEligible = true.

Set FF2LAccuracyCheckDate = the later of the PriorAccuracyRecord.EndDate and the
Prior A ccuracy Record. R c i n s t a 11 a t i o n D a tc.

for each record in FuelFlowComponentRecords

if (FuelFlowComponentRecords. ComponentID is not equal to
Fu el Flo i vCompon en tRecord To Ch eck. C o m po lie n 11D)

Locate the latest record in Accuracy TestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the FuelFlowComponentRecords.ComponentID and the TestResult is equal to
"PASSED" and the quarter of the later of the EndDate and the ReinstallationDate is in the same or adjacent
quarter of the later of the Prior Accuracy RecordEndDMc and the
Prior A ccuracy Record. ReinstallationDate.

if (AccuracyTestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
Accuracy TestRecordsByLocationForQAStatus.EndDate and the
Accuracy TestRecordsByLocationForQAStatus.ReinstallationDate.

if (AccuracyTestRecords fly Location ForQAStatus.TcslTxpcCodc 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 later of the PriorAccuracyRecord.EndDate and the
Prior A ccuracy Record. ReinstallationDate.

if (PEITestRecordsByLocationForQAStatus is not found)

else

Set FF2LAccuracyEligible = false, and exit this check.

else


-------
Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
PEI TestRecordsHy Location ForOA Status. E ndDa te.

else if (PriorAccuracyTestRecord.7cs[7xpcCodc is equal to "FFACCTT")

Locate the latest record in PEITestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the FuelFlowComponentRecords.Componclit ID and the TestResult is equal to
"PASSED" and the quarter is in the same or adjacent quarter of the Prior A ccuracy Record. E nd D a t c.

if (PEITestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

else

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
PEITestRecordsByLocationForQAStatusEndDatQ.

Results:

Result	Response	Severity

Usage:

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


-------
Check Code:

ADESTAT-5

Check Name:

Evaluate Fuel Flow to Load Tests (Accuracy)

Related Former Checks:

Applicability:
Description:

Evaluates the Fuel flow to load tests for a flow meter that is eligible to use fuel flow to load tests.

Specifications:

Set FF2LAccuracyBeginYear Quarter = null.

Set FF2LAccuracyEndYear Quarter = null.

Set InvalidFF2LTestNumber = null.

Set MissingFF2 LYear Quarter = null.

if {FF2LAccuracy Eligible == true)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemlD 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 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.TestNumber
Set CurrentAccuracyStatus = "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 PriorAccuracyRecord.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 = FF2 LTestRecords/iy Location ForOAStatus.TcslNumbcr
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.Sxs{cm\D and the QANeedsEvaluation 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 PriorAccuracyRecord.EndDate
and the PriorAccuracyRecord.RemstaWationDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2 LTestRecords/iy Location ForOAStatus.TcslNumbcr
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
FuelFlowComponentRecordToCheck.SystemID 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
PriorAccuracyRecord.EndDate and the Prior Accuracy Record. Rci nstal lationDatc.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2LAccuracyBeginYearQuarter = FF2LTestRecordsByLocationForQAStatus.Year &
FF2L TestRecordsByLocationForQAStatus. Quarter.

else

Set FF2LAccuracyBeginYear Quarter = null


-------
Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystemlT> 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 PriorAccuracyRecord.EndDate and the
Prior Accuracy Record. Rci nstal lationDatc.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (FF2LAccuracyBeginYearQuarter is not null AND FF2 LTestRecordsBy Location ForOAStatus.Ycar/Quarlcr >
FF2LAccuracyBegin YearQuarter)

Set InvalidFF2LTestNumber = FF2I. TestRecordsByL ocation ForOA Status. Te st N u lube r
Set Cur rent Accuracy Status = "OOC-Invalid Fuel Flow to Load Test",
exit check.

else if (FF2 LTestRecordsBy Location ForOAStatus.Ycar/Quarlcr is more than 4 quarters after the quarter of the
FF2LAccuracyCheckDate)

Set InvalidFF2LTestNumber = FF2I. TestRecordsByL ocation ForOA Status. Te st N u lube r
Set Current Accuracy Status = "Undetermined-Baseline Period Expired",
exit check.

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

Locate the latest record in FF2I< TestRecordsByLocationForOAStatus for the location where the SystemID is equal to the
Fu elFlo i vCompon entRecord To Ch eck .SystemID 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 Accuracy Record.EndDa\c 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 FF21 Accuracy EndYearOuarter = FF2 L TestRecordsByL ocation ForOA Status. Year &
FF2L TestRecordsByLocationForQAStatus. Quarter.

for each quarter between the FF2LAccuracyBeginYearQuarter and the FF2LAccuracyEndYearQuarter (inclusive)

Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
Fu elFlo i vCompon en tRecord To Ch eck .SystemID and the quarter is equal to the quarter to check.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (FF2 LTestRecordsBy Location ForOAStatus.TcslRcsull = "FEW168H")

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to

Current FuelFlowRecord.FudCodc 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)

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

If not found,

Set InvalidFF2LTestNumber = FF2 LTestRecordsBy Location ForOAStatus.TcslNumbcr
Set Current Accuracy Status = "OOC-Invalid Fuel Flow to Load Test".

Exit check.

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
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.

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation


-------
Check Code:	ADESTAT-6

Check Name:	Determine Accuracy Test Expiration Date

Related Former Checks:

Applicability:

Description:	Determines the expiration date for the prior applicable Accuracy Test.

Specifications:

Set AccuracyMissingOpDatalnfo = null,
if {CurrentAccuracy Status is null)

Set PriorTestExpirationDate = Prior A ccuracy Record. Tc s t E \ p i ra t i o n D a tc.

for each quarter subsequent to the quarter of the later of the Prior Accuracy Record.En&DMdHoux and the
Prior A ccuracy Record. R c i n s t a 11 a t i o n D a t c/ H o u r and prior to the quarter of the CurrentOperatingDate/Hour

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 (FF2LAccuracyEligible == true and the quarter to check is between the FF2LAccuracyBeginYearQuarter and
the FF2LA ccuracyEnd YearOuarter (inclusive))

Add 1 quarter to the PriorTestExpirationDate.

if (EarliestLocationReportDate > the last day of the quarter being checked)

Add 1 quarter to the PriorTestExpirationDate.

else

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.FuelCode.

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)

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)ataRecordsby Location.OpVa 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.ComponentID, 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 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.FuelCode.

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. ComponentID, 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 1st or 4th quarter)

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.FuelCode.

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 Fu el Flo i vCompon en tRecord To Ch eck .ComponentID. 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 Current Accuracy Status = 'Missing Op Data"

Return result CurrentAccuracyStatus .

else if {FF2LAccuracy Eligible == false)

Set Current Accuracy Status = "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 &

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

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


-------
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

OOC-Fuel Flow
to Load Test
Failed*

OOC-Fuel Flow
to Load Test Has
Critical Errors

Response	Severity

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

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

The [testtype] status for [key] could not be determined, because a prior fuel-flow-to-load Critical Error Level 1

test for MonitoringSystemID [ID] with TestNumber [If 21testnum] 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 prior Critical Error Level 1
[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 prior Critical Error Level 1
[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
fuel-flow-to-load test for MonitoringSystemID [ID] was ignored. An invalid prior
[testtype] with TestNumber [invtestnum] was also ignored.

Critical Error Level 1

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

Critical Error Level 1
Critical Error Level 1

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. Critical Error Level 1

The prior [testtype] for [key] with TestNumber [testnum] has critical errors. An invalid Critical Error Level 1
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 fuel-flow-to-load Critical Error Level 1
test for MonitoringSystemID [ID] with TestNumber [If21testnum] has failed.

The [testtype] status for [key] could not be determined, because a prior fuel-flow-to-load Critical Error Level 1
test for MonitoringSystemID [ID] with TestNumber [If21testnum] 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 Critical Error Level 1
test for MonitoringSystemID [ID] with TestNumber [fF21testnum] 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-Ba
seline Period
Expired

U ndetermined-Mi
ssing Fuel Flow
to Load Test

The [testtype] status for [key] could not be determined, because a prior fuel-flow-to-load Critical Error Level 1
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	Critical Error Level 1

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	Critical Error Level 1

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].	Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

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 [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 Critical Error Level 1
test for MonitoringSystemID [ID] was missing for [missingff21].

Usage:

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


-------
Check Code:

ADESTAT-7

Check Name:

Related Former Checks:

Determine if Component Requires a PEI Test

Applicability:
Description:

Determines a if an Appendix D fuel flow meter requires a PEI test.

Specifications:

Set PEIRequired = false.

if (PriorAccuracy Record is not null and Pr iorAccuracy Record Jc${T\\ycCo(lc is equal to "FFACCTT")

Set PEIRequired = true.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation


-------
Check Code:	ADESTAT-8

Check Name:	Locate Most Recent Prior PEI Test

Related Former Checks:

Applicability:

Description:	Determines if there is an applicable prior PEI test.

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.ComponentID and the EndDate/Hour is prior to the CurrentOperatingDate/Hour

if (PEITestRecordsIiy Location ForOAStatus is found)

Set PriorPEIRecord = the found record in PEITestRecordsByLocationForQAStatus.

if (PriorPEIRecord. Q A Needs E va 1 ua t i o n F lag = "Y")

Set CurrentPEIStatus = "PEI Test Not Yet Evaluated".

else if (Prior PEI Record. Tc s t R c s u 11C o dc is null)

Set CurrentPEIStatus = "OOC-PEI Test Has Critical Errors".

else if (PriorPEI Record. Tc s t R c s u 11C o dc = "FAILED")

Set CurrentPEIStatus = "OOC-PEI Test Failed".

else if (PriorPE I Record. Tc s t R c s u 11C o dc = "ABORTED")

Set CurrentPEIStatus = "OOC-PEI Test Aborted".

else

Set CurrentPEIStatus = "OOC-No Prior PEI Test",
if (CurrentPEIStatus is not null)

Return result CurrentPEIStatus.

Results:

Result	Response	Severity

OOC-No Prior You did not report a prior [testtype] for [key].	Critical Error Level 1

PEI Test

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

Aborted

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

Failed

OOC-PEI Test The applicable prior [testtype] for [key] with TestNumber [testnum] has critical errors. Critical Error Level 1

Has Critical

Errors

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


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


-------
Check Code:

ADESTAT-9

Check Name:

Related Former Checks:

Locate Most Recent Prior PEI Event

Applicability:
Description:

Determines if there is a applicable prior event requiring an PEI test.

Specifications:

Set PriorPEIEventRecord = null.

If (PEI Required == true AND CurrentPEIStatus is null)

Locate the most recent record in QACertificationEventRecords WHERE

a)	the ComponentID is equal to the Fu el Flo i vCompon en tRecord To Ch eck. C o m po nc n 11D 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. EndDatc/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 E ndDate.
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 Pr ior PEI Record.EndDdic.
Set PriorPEIRecord.TcstE\pirationDatc = 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

Usage:

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


-------
Check Code:

ADESTAT-10

Check Name:

Related Former Checks:

Determine Eligibility for Fuel Flow to Load Testing (PEI)

Applicability:

Description:

Specifications:

Determines if this component is eligible to extend their PEI text expiration date using fuel flow to load testing.

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.SysicmlD 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 ndDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set FF2LPEIEligible = true.

Set FF2LPEICheckDate = Prior PEI Record. E ndDate.

for each record in FuelFlowComponentRecords

Locate the latest record in Accuracy TestRecordsByLocationForQAStatus for 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
PriorPEIRecord. E ndDate.

if (Accuracy TestRecordsByLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
AccuracyTestRecordsIiyLocationFor(QAStatus.^i\\ADc\\c and the
AccuracyTestRecordsByLocationForQAStatus.ReinstallationDate.

if (FuelFlowComponentRecords. ComponentID is not equal to
FuelFlou'ComponentRecordToCheck.ComponcnllD AND

AccuracyTestRecords/iyLocationForOAStatus.TcsfTypcCodc 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
Prior PEI Record. E ndDate.

if (PEITestRecordsByLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

else

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
PEITestRecordsByLocationForQAStatusEndDate.

else

Results:

Result

Response

Severity


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


-------
Check Name:

Check Code:

ADESTAT-11

Evaluate Fuel Flow to Load Tests (PEI)

Related Former Checks:

Applicability:
Description:

Evaluates the Fuel flow to load tests for a flow meter that is eligible to use fuel flow to load tests.

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.SystevaiD and the TestResultCode 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. EndDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Locate a record in QACertificationEventRecords WHERE

a)	the ComponentID is equal to the FuelFlowComponentRecordToCheck. Co mpo nc lit ID AND

b)	the QACertEventCode is equal to "410"

c)	the RequiredTestCode is equal to "53"AND

d)	the QACertEventDate/Hour is after the EndDate/Hour and of the located failed
FF2L TestRecordsByLocationForQAStatus record.

e)	the QACertEventDate/Hour is prior to the CurrentOperatingDate/Hour

if (QACertificationEventRecords is not found)

Set InvalidFF2LTestNumber = FF21. TestRecordsHyL ocation ForOA Status. Te st N u lube r
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. SystemID and the TestResultCode 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 PriorPEI Record. E ndDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2 LTestRecords/iy Location ForOA Status.TcslNumbcr
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. SystemID 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.EndDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

Set InvalidFF2LTestNumber = FF2 LTestRecords/iy 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.S\s{cm\r> and the TestResultCode 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
PriorPEI Record. E nd D a tc.

if (FF2LTestRecordsByLocationForQAStatus is found)


-------
Set FF2LPEIBeginYearQuarter = FF2LTestRecords By Location ForQAStatus. Ycar &
FF2L TestRecordsByLocationForQAStatus. Quarter.

else

Set FF2 LPEIBeginYear Quarter = null

Locate the latest record in FF2I< TestRecorclsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystQvaiD and the TestResultCode 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 EndDate.

if (FF2LTestRecordsByLocationForQAStatus is found)

if (Set FF2LPELBeginYearQuarter is not null AND FF2LTestRecordsByLocationForQAStatus.Year/Quarter >
FF2LPELBegin YearQuarter)

Set LnvalidFF2LTestNumber = FF21. TestRecordsByL ocation ForQA Status. Te st N u lube r
Set CurrentPELStatus = "OOC-Invalid Fuel Flow to Load Test".

Return result CurrentPELStatus.

else if (FF2 LTestRecords By Location ForOAStatus.Y cnr/Qunvlcr is more than 4 quarters after the quarter of the
FF2LPELCheckDate)

Set LnvalidFF2LTestNumber = FF2I. TestRecordsByL ocation ForQA Status. Te st N u lube r
Set CurrentPELStatus = "Undetermined-Baseline Period Expired".

Return result CurrentPELStatus.

Set FF2LPELBeginYearQuarter to the quarter after the quarter of the FF2LPELCheckDate.

Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SysicmW and the TestResultCode 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. EndDate.

Set FF2LPELEndYearQuarter = FF2I. TestRecords By Location ForQAStatus. Y car &

FF2L TestRecordsByLocationForQAStatus. Quarter.

for each quarter between the FF2LPELBeginYearQuarter and the FF2LPELEndYearQuarter (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 (FF2 LTestRecordsByLocation ForOAStatus.Ci\\cuk\[cd7cs[Rcsu\[ = "FEW168H")

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)

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

If not found,

Set LnvalidFF2LTestNumber = FF2 LTestRecordsBy Location ForQAStatus.TcslNumbcr
Set CurrentPELStatus = "OOC-Invalid Fuel Flow to Load Test".

Return result CurrentPELStatus.


-------
else

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to

CurrentFuelFlowRecord. Fuc 1 Code 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)

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-Ba
seline Period
Expired

U ndetermined-Mi
ssing Fuel Flow
to Load Test

Set MissingFF2LYearQuarter equal to the year/quarter to check.

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

Return result CurrentPEIStatus.

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.

Severity

Critical Error Level 1

The [testtype] status for [key] could not be determined, because a prior fuel-flow-to-load Critical Error Level 1
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 Critical Error Level 1
test for MonitoringSystemID [ID] with TestNumber [ff21testnum] has critical errors.

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

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	Critical Error Level 2

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 Critical Error Level 1
test for MonitoringSystemID [ID] was missing for [missingff21].

Usage:

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


-------
Check Name:

Related Former Checks:

Check Code:

ADESTAT-12

Determine PEI Test Expiration Date

Applicability:
Description:

Determines the expiration date for the prior applicable PEITest.

Specifications:

Set PEIMissingOpDatalnfo = null.

if (PEIRequired == true AND CurrentPEIStatus is null)

Set PriorTestExpirationDate = Prior PEI Record. Tc st E \ p i ra t i o n Da tc.

for each quarter subsequent to the quarter of the Prior PEI Record E ndDate 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 (FF2LPEIEligible == true and the quarter to check is between the FF2LPEIBeginYearQuarter and the
FF2LPEIEndYearQuarter (inclusive))

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

if (FF2 LPEI Eligible == 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

Set CurrentPEIStatus = "OOC-PEI Test Expired"

Return result CurrentPEIStatus.

Add 1 quarter to the PriorTestExpirationDate.

else

Set CurrentPEIStatus = "IC-Extension"


-------
Results:

Result

Missing Op Data

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

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

Usage:
1

Process/Category: Emissions Data Evaluation Report ¦

¦ Fuel Flowmeter QA Status Evaluation


-------
Check Code:	ADESTAT-13

Check Name:	Determine System Appendix D Status

Related Former Checks:

Applicability:

Description:	Determines the Appendix D status for the system based on current system status and the current component

accuracy and/or PEI status.

Specifications:

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

Set CurrentAppendixDStatus = "OOC-Multiple Reasons"

else if (CurrentAppendixDStatus starts with "OOC")

-do nothing

else if (CurrentAccuracyStatus 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"
if (PEI Required == true)

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

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

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

Fuel Flowmeter QA Status Evaluation


-------
Check Category:
Daily Calibration Status


-------
Check Code:	DCSTAT-1

Check Name:	Locate Most Recent Prior Daily Calibration Test

Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior Daily Calibration Test

Specifications:

Set PriorDailyCalRecord = null.

Set InvalidDailyCalRecord = null.

Locate the most recent 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 most recent 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. EndD ate/Hour/Min)

Set InvalidDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

else

Locate the most recent 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)

Set InvalidDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

Results:

Result	Response	Severity


-------
Process/Category:

Emissions

Data Evaluation Report	

	C02 Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	Hg Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

Process/Category:

Emissions

Data Evaluation Report	

	S02 Daily Calibration Status Evaluation


-------
Check Code:	DCSTAT-2

Check Name:	Locate Most Recent Prior Event

Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior event.

Specifications:

Set Prior Daily CalE vent Record = 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 CurrentDateHour AND

AND either

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

b)	QACertEventDate/Hour is after the PriorDailyCalRecord.EndDi\\dY\oux

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode <> 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 CurrentDateHour is
less than 25)

Set CurrentDailyCalStatus = "IC-Undetermined".

else if (QaStatusSystemTypeCode is equal to "HG" or "HCL", AND MatsDailyCalRequiredDate is NOT null, AND
CurrentDateHour is before MatsDailyCalRequiredDate)

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 CurrentDateHour and the OpTime is greater than zero.

if (not found OR the number of clock hours between Hourly()pData. Datc/Hour and the CurrentDateHour
is less than 8)

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.QACertEyentDate/How)

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	

	Hg Daily Calibration Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	S02 Daily Calibration Status Evaluation


-------
Check Code:	DCSTAT-3

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

Related Former Checks:

Applicability:	CEM Check

Description:	Determines the expiration dates for the Applicable Prior Daily Calibration test.

Specifications:

Set OnlineDailyCalRecord to null,
if (CurrentDailyCalStatus is null)

if (PriorDailyCalRecord.Onlinelndicator == 1)

if (the number of clock hours between the PriorDailyCalRecord.Date/How and the CurrentDateHour 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 PriorDailyCalRecord.DatefRour 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 CurrentDateHour is greater
than or equal to 8)

Set CurrentDailyCalStatus = "OOC-Expired".

else

Set CurrentDailyCalStatus = "IC-Grace".

else

Set CurrentDailyCalStatus = "OOC-Expired".

else

Locate the most recent record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the ApplicableComponentID 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

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 (DailyCalTestRecordsByLocationForOAStatus is found AND the EndDate/Hour is after the
OnlineDailyCalRecord.EndDatefiiom AND the EndDate/Hour is equal to or prior to the
PriorDailyCalRecordDate/Houf)

set InvalidDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.

if (OnlineDailyCalRecord .TestResultCode = null)

Set CurrentDallyCalStatus = "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
CurrentDateHour is less than 26 AND the number of clock hours between the PriorDailyCalRecord.Date/Hour
and the CurrentDateHour is less than 26)

Set CurrentDailyCalStatus = "IC".

else

if (the number of clock hours between the OnlineDailyCalRecord Date/Hour and the CurrentDateHour 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 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
CurrentDateHour 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)


-------
Results:

Resi

Usage:

1

2

3

4

5

6

7

else

Set CurrentDailyCalStatus =
Set CurrentDailyCalStatus =

"IC-Undetermined".
"OOC-Expired".

Response



Severity

Process/Category:

Emissions Data Evaluation Report	

	C02 Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	Hg Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

Process/Category:

Emissions Data Evaluation Report	

	S02 Daily Calibration Status Evaluation


-------
Check Code:	DCSTAT-4

Check Name:	Determine Final Daily Calibration Status

Related Former Checks:

Applicability:	CEM Check

Description:	Evaluates the determined Daily Calibration Status and changes it if needed based on an ignored test or the status

of the alternate range.

Specifications:

Set AlternateDailyCalRecord = null.

if (CurrentDailyCalStatus begins with "OOC")

if (InvalidDailyCalRecord 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 AlternateComponentID = LowRangeComponentlD.

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentID = HighRangeComponentlD.

Locate the most recent record in DailyCalTestRecordsByLocationForQAStatus for the location where:

a)	ComponentID is equal to the AlternateComponentID 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 (AlternateDailyCalRecord.TestResultCode = null)

Set CurrentDailyCalStatus = "OOC-Alternate Range Test Has Critical Errors",
else if (AlternateDailyCalRecord.TesiResultCode= "FAILED")

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

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

else

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 (Daily CalTestRecordsBy Location ForOAStatus is found AND (either the PriorDailyCalRecord is null or
EndDate/Hour/Minute is after the 7>ior/)ai/jCa/7?ecor
-------
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

OOC-No Prior
Test*

OOC-No
Probationary
Calibration Test

Response	Severity

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

completed on [altdate], was aborted.

The prior daily calibration test for the alternate range [altscale] cf [compkey], which was Critical Error Level 1
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] cf [compkey], which was Critical Error Level 1
completed on [altdate], failed.

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

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

The prior daily calibration test for the alternate range [altscale] cf [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.

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

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

No Errors


-------
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

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. 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 expired. Critical Error Level 1

The prior online daily calibration test for [compkey] completed on [ondate] has expired. 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] failed.

Critical Error Level 1

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

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

Online Test Has errors.

Critical Errors

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

Online Test Has errors. An invalid daily calibration test completed on [invdate] was ignored.

Critical Errors*

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

OOC-Test
Aborted
OOC-Test
Aborted*

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

OOC-Test Failed The prior daily calibration test for [compkey] completed on [date] failed.

OOC-Test
Failed*
OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*

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

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

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

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	

	C02 Daily Calibration Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	Hg Daily Calibration Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report

S02 Daily Calibration Status Evaluation


-------
Check Category:
Daily Calibration Test


-------
Check Code:	DAYCAL-1

Check Name:	Daily Calibration Test Component Type Check
Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the component type reported is appropriate for an Daily Calibration test.
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,
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.

Else if the ComponentTypeCode of the associated component is equal to "HG" or "HCL",
If (OnlineOfflinelndicator is equal to 1)

set Daily Cal Component Type Valid to true.

Else

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

Otherwise,

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

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

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', "HG", or 'FLOW' may have a daily calibration test.

C	For Hg and or HC1 CEMS, all calibrations must be done while unit is online.	Critical Error Level 1

Usage:

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


-------
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 was Informational Message

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


-------
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 (ComponentTypeCode is equal to "HG" or "HCL")

If (OnlineOfflinelndicator is equal to 1) // Earlier component type error will occur if indicator is not 1

If (Daily Cal Calc Online Ind is equal to 0)
return result E.

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

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

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 <> 20, 25, 26, 30, or 172 OR

c)	SpanScaleCode in the current test == "L" and QACertEventCode <> 35 or 171

If found,


-------
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.

For Hg and or HC1 CEMS, all calibrations must be done while unit is online.

Severity

Critical Error Level 1
Critical Error Level 1

No Errors

Critical Error Level 2

Critical Error Level 1

Usage:

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


-------
Check Code:	DAYCAL-4

Check Name:	Test Span Scale Valid

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the reported span scale is valid and consistent with the current analyzer range of

the component.

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", not equal to "HG", or not equal to "HCL",

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.

Else, if the ComponentTypeCode of the associated component is equal to "HG" or "HCL",

If the SpanScaleCode is null,

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

Else if the SpanScaleCode is not equal to "H",

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

Otherwise,

If the SpanScaleCode is not null,

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


-------
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, in the field	Critical Error Level 1

[fieldname] for [key].

C	The active analyzer range for the component is inconsistent with the span scale [value] Critical Error Level 1

reported for the [type] test for [key].

D	You reported a SpanScaleCode in the [type] test for [key], but this is not appropriate for Critical Error Level 1

flow component.

Usage:

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


-------
Check Code:

DAYCAL-5

Check Name:	Determine Span Value

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines the span value for the test:

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.


-------
Results:

Result	Response	Severity

A	You have not reported a valid monitoring plan span record that was active during the Critical Error Level 1

test for [key].

B	You reported more than one monitoring plan span record that was active during the test Critical Error Level 1

for [key].

C	The component reported for [key] is not part of any monitoring system.	Critical Error Level 1

Usage:

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


-------
Check Code:	DAYCAL-6

Check Name:	Daily Calibration Test Upscale Gas Level Code Valid
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Upscale Gas Level Code is valid.

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

C

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

Critical Error Level 1

Usage:

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


-------
Check Code:

DAYCAL-7

Check Name:

Related Former Checks:

Reference Values Consistent with Calibration Gas Levels

Applicability:
Description:

CEM Check

This check is to identify reference values which are not correct relative to the calibration gas levels indicated.

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
A

Response

The reference value is not consistent with the reported calibration gas levels in the 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.

Severity

Critical Error Level 1

Usage:

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


-------
Check Code:	DAYCAL-8

Check Name:	Zero Measured Value Valid
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Zero Measured Value is reported.

Specifications:

For the daily calibration test with a zero injection:

If ZeroMeasuredValue is null,
return result A.

Severity

Critical Error Level 1

Results:

Result	Response

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

Usage:

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


-------
Check Code:	DAYCAL-9

Check Name:	Zero Reference Value Valid
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Zero Reference Value is reported.
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.


-------
Check Code:	DAYCAL-10

Check Name:	Zero Calibration Error Valid
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Zero Calibration Error is reported.
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:

Result	Response	Severity

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

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

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

Usage:

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


-------
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.

Severity

Critical Error Level 1

Results:

Result	Response

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

Usage:

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


-------
Check Code:	DAYCAL-12

Check Name:	Upscale Measured Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Upscale Measured Value is reported.

Specifications:

For the daily calibration test with an upscale injection:

If UpscaleMeasuredValue is null,
return result A.

Severity

Critical Error Level 1

Results:

Result	Response

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

Usage:

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


-------
Check Code:	DAYCAL-13

Check Name:	Upscale Reference Value Valid

Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Upscale Reference Value is reported.

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.


-------
Check Code:	DAYCAL-14

Check Name:	Upscale Calibration Error Valid

Related Former Checks:

Applicability:	CEM Check

Description:	This check is to make sure that the Upscale Calibration Error is reported.

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.


-------
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 Upscale APSIndicator is null,
return result A.

Severity

Critical Error Level 1

Results:

Result	Response

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

Usage:

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


-------
Check Code:

DAYCAL-16

Check Name:

Related Former Checks:

Upscale Injection Time Valid

Applicability:
Description:

CEM Check

This check determines whether the Injection Date and Hour reported in the Injection Element is valid.

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
A

Response

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

Severity

Critical Error Level 1

Usage:

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


-------
Check Code:

DAYCAL-17

Check Name:

Related Former Checks:

Zero Injection Time Valid

Applicability:
Description:

CEM Check

This check determines whether the Injection Date and Hour reported in the Injection Element is valid.

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

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/Minute of 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.

to "FLOW"

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

Otherwise,

Results:

Result

A

B

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

C

Critical Error Level 1

D

Critical Error Level 2

Usage:

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


-------
Check Code:	DAYCAL-18

Check Name:	Zero Reference Value Consistent with Span
Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the calibration gas or reference signal is appropriate for span and gas level.

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:

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

Calculate Zero Reference Percent of Span = ZeroReferenceValue / 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

B

Response

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.

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.

Severity

Critical Error Level 2

Non-Critical Error

Usage:

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


-------
Check Code:	DAYCAL-19

Check Name:	Upscale Reference Value Consistent with Span
Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the calibration gas or reference signal is appropriate for span and gas level.

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 UpscaleGasLevelCode is equal to "HIGH",

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

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.

Otherwise,

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.

Otherwise,

return result F.


-------
Results:

Result
A

B

C

D

Response	Severity

The tag value of at least one Mid level reference signal or calibration gas for [key] is Critical Error Level 2

[percent] %, which does not meet the applicable performance specifications. 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 Non-Critical Error
[percent] %, which does not meet the applicable performance specifications. 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 Critical Error Level 2
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 applicable performance specifications. The concentration of
the high reference calibration gas must be between 80.0% and 100.0% of the span value.

The test is invalid.

The tag value of at least one High level reference calibration gas for [key] is [percent]%, Non-Critical Error
which does not meet the applicable performance specifications. The concentration of
the 'high' reference calibration gas must be between 80.0% and 100.0% of the span
value.

Non-Critical Error

Critical Error Level 2

Usage:

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


-------
Check Code:	DAYCAL-20

Check Name:	Calculate Zero Gas Injection or Reference Signal Results
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to calculate calibration errors.

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.

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
ZeroInjectionDate/ZeroInjectionHour)

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(
-------
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 ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than ZeroInjectionDate/ZeroInjectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
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 than
ZeroInjectionDate/ZeroInjectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection 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 SampleAcquisitionMethodCode 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 betw een 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 CalcResultto "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 ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater than
ZeroInjectionDate/ZeroInjectionHour)

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

Otherwise,

If (ZeroAPSIndicator is equal to 1, the Sample AcquisitionMethodCode 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 ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than ZeroInjectionDate/ZeroInjectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
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 than


-------
ZeroInjectionDate/ZeroInjectionHour)

set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection 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".

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

Calculate Daily Cal Zero Injection Calc Result = min(round(
-------
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 ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than ZeroInjectionDate/ZeroInjectionHour)

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

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.

Otherwise,

If {Daily Cal Calc Result is not equal to "FAILED" or "INC" 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 of the Informational Message

errors listed above.

Usage:

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


-------
Check Code:

DAYCAL-21

Check Name:	Calculate Upscale Gas Injection or Reference Signal Results
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to calculate calibration errors.

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 UpscaleReference Value 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
Cale APS Indicator to null, and return result A.

Otherwise,

Calculate dif = 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 dijf to 1 decimal place.

Set Daily Cal Upscale Injection Calc Result to cUff.

ff {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 dijf 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
UpscalelnjectionDate/UpscalelnjectionHour)

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
UpscalelnjectionDate/UpscalelnjectionHour)

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(
-------
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 "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
UpscalelnjectionDate/UpscalelnjectionHour)

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 betw een 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)

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, 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

UpscalelnjectionDate/UpscalelnjectionHour)
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.

Otherwise,

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

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

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

If {Daily Cal Upscale Injection Calc Result is greater than 5.0, AND diff is less than or equal to 1.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 "PASSAPS".

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 Upscalelnjection 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)

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 UpscaleCalibrationError is 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
"DifferenceUGSCM".

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
Upscalelnj ectionDate.

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
UpscalelnjectionDate/UpscalelnjectionHour)

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 "PASS APS" 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 of the Informational Message

errors listed above.


-------
Usage:

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


-------
Check Code:

DAYCAL-22

Check Name:

Related Former Checks:

Daily Calibration Test End Time Valid

Applicability:
Description:

CEM Check

This check indicates if the reported test end date, hour, minute is consistent with the injection times.

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

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

Response

Severity

Usage:

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


-------
Check Code:

DAYCAL-23

Check Name:

Related Former Checks:

Reported Zero Injection Results Consistent with Recalculated Values

Applicability:
Description:

CEM Check

This check is to compare reported and recalculated results for each gas injection.

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.

Else, If the ComponentTypeCode of the associated component is equal to "HG",

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

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.

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

E
F

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 Indicatorfor [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


-------
Check Code:

DAYCAL-24

Check Name:

Related Former Checks:

Reported Upscale Injection Results Consistent with Recalculated Values

Applicability:
Description:

CEM Check

This check is to compare reported and recalculated results for each gas injection.

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 APS
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.

Else, if the ComponentTypeCode of the associated component is equal to "HG",

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


-------
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.

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

E
F

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 Indicatorfor [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


-------
Check Code:	DAYCAL-25

Check Name:	Determination of Overall Daily Calibration Test Result
Related Former Checks:

Applicability:	CEM Check

Description:	This check is to calculate daily calibration test results.

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.

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 for this test type,
in the field [fieldname] for [key].

The TestResultCode for [key] indicates a passing test, but the recalculated results
indicate a failing test.

The TestResultCode for [key] indicates an incomplete test, but the recalculated results
indicate a failing test. A test is considered to have failed if it fails to meet the
performance criteria for any injection.

You reported a TestResultCode of "FAILED" for [key], but the results recalculated or
determined from the other reported values indicate that the test passed.

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	Daily Calibration Test


-------
Check Code:

DAYCAL-26

Check Name:

Related Former Checks:

Upscale Gas Type Code Valid

Applicability:
Description:

CEM Check

This check determines whether the Upscale Gas Type Code is valid (PGVP).

Validation Tables:

Gas Type Code (Lookup Table)
Vw System Parameter (Lookup Table)

Specifications:

For the daily calibration test with an upscale injection:

UpscaleGasTypeValid = true.

Locate System Parameter lookup table record where Sys Param Name = 'PGVPAETBRULEDATE'.

Set Daily Cat PGVP Rule Date to System Parameter. ParamValuel.

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", "HCL", or "HG",

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.

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

UpscaleGasTypeValid = false
return result F.

Otherwise,


-------
Results:

Result
A

B

C

D

E
F

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, HC1, or HG 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

Usage:

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


-------
Check Code:

DAYCAL-27

Check Name:

Related Former Checks:

Cylinder ID Valid

Applicability:
Description:

CEM Check

This check determines whether the Cylinder ID is valid.

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

A

B

Response

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

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

Severity

Critical Error Level 1
Critical Error Level 1

C

cylinder gas, but you reported a Cylinderldentifier.

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

Usage:

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


-------
Check Code:	DAYCAL-28

Check Name:	Vendor ID Valid
Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the Vendor ID is valid.

Validation Tables:

Protocol Gas Vendor (Lookup Table)

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",
return result A.

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
January 1 after DeactivationDate + 8 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 + 8 years,

return result D.

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

Results:

Result	Response

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

B	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.

C	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.

D	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.

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

F	You have reported a Vendorldentifier for [key] of a vendor who is no longer

participating in the Protocol Gas Verification Program.

Seventy

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Non-Critical Error
Critical Error Level 2

Usage:

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


-------
Check Code:

DAYCAL-29

Check Name:

Related Former Checks:

Cylinder Expiration Date Valid

Applicability:
Description:

CEM Check

This check determines whether the Expiration Date of the cylinder is valid.

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 8 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 eight years after the

date of the test for [key]. Gas cylinders expire in less than eight years.

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

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 2

D

Critical Error Level 2

E

Non-Critical Error

Usage:

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


-------
Check Code:	DAYCAL-30

Check Name:	Upscale Gas Type Code Components Valid

Related Former Checks:	2013 Q1 replacement for DAYCAL-26

Applicability:	CEM Check

Description:	This check determines whether the Gas Components in the Upscale Gas Type Code are valid (PGVP).

Validation Tables:

Vw System Parameter (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. ParamValue 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.

Otherwise,

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

UpscaleGasTypeValid = false
return result B.

Else

Set Protocol Gas Invalid Component List to null.

Set Protocol Gas Exclusive Component List to null.

Set Protocol Gas Balance Component List to null.

Set Protocol Gas Duplicate Component List to null.

Set Protocol Gas Component List to null.

Set Protocol Gas Approval Requested = true.

Set Protocol Gas Component Count to 0.

Set Balance Component Count to 0.

For each GasComponentCode in UpscaleGasTypeCode ,

Locate a record in the GasComponentCodeLookupTable where GasComponentCode is equal to the
GasComponentCode in the UpscaleGasTypeCode .

If not found, or GasComponentCode is equal to "ZERO",

Add GasComponentCode to Protocol Gas Invalid Component List.

Else

If CanCombinelndicator is equal to 0,

Add GasComponentCode to Protocol Gas Exclusive Component List.

If BalanceComponentlndicator is equal to 1,

Add GasComponentCode to Protocol Gas Balance Component List.

Increament Balance Component Count by 1.


-------
If the GasComponentCode is equal to "APPVD",

Set Protocol Gas Approval Requested = true.

If GasComponentCode is not in Protocol Gas Component List,

add GasComponentCode to Protocol Gas Component List.

Else if GasComponentCode is not in Protocol Gas Duplicate Component List,
add GasComponentCode to Protocol Gas Duplicate Component List.

Increament Protocol Gas Component Count by 1.

If Protocol Gas Invalid Component List is not null,

UpscaleGasTypeValid = false
return result C.

Else if Protocol Gas Duplicate Component List is not null,
set Protocol Gas Component List Valid = false,
return result L.

Else if Protocol Gas Exclusive Component List is not null, and Protocol Gas Component Count is greater than 1,
UpscaleGasTypeValid = false
return result D.

Else if Protocol Gas Approval Requested is equal to true,
return result E.

Else if Protocol Gas Exclusive Component List is null, and Balance Component Count is equal to 0,

set UpscaleGasTypeValid = false,
return result J.

Else if Protocol Gas Exclusive Component List is null, and Balance Component Count is greater than 1,

set UpscaleGasTypeValid = false,
return result K.

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

If the ComponentTypeCode is equal to "S02" or "C02",

If no GasComponentCode in UpscaleGasTypeCode is equal to ComponentTypeCode,
UpscaleGasTypeValid = false
return result F.

Else if the ComponentTypeCode is equal to "02",

If UpscaleGasTypeCode is not equal to "AIR", and no GasComponentCode in
UpscaleGasTypeCode is equal to "02",

UpscaleGasTypeValid = false
return result G.

Else if UpscaleGasTypeCode is equal to "AIR", and the UpscaleGasCode is not equal to "HIGH",
UpscaleGasTypeValid = false
return result H.

Else if the ComponentTypeCode is equal to "NOX",

If no GasComponentCode in GasTypeCode is equal to "NO" or "N02",

UpscaleGasTypeValid = false
return result I.


-------
Results:

Result
A

B

C

D

E

F

G

H

I

J

K

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, HC1, or HG component.

You reported the values ([invalidlist]), in the field [fieldname] for [key], which are not
in the list of valid values.

You reported multiple gas components in the field [fieldname] for [key] that include
values ([exclusivelist]) that you should report by themselves.

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 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.

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

You reported an UpscaleGasTypeCode that does not contain a PGVP balance
component. A single balance component is required when reporting other individual gas
components.

You reported an UpscaleGasTypeCode that contains multiple PGVP balance
components ([balancelist]). A single balance component is required when reporting
other individual gas components.

Your reported one or more duplicate gas component records.

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

Usage:

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


-------
Check Category:
Daily Emissions Data


-------
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 CO2 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 for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for 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 Daily EmissionsData record

If (Daily Op Time == 0)
return result E


-------
Results:

Result	Response	Severity

A	You have reported more than one active method to determine C02 emissions in your	Critical Error Level 1

monitoring plan for this date.

B	You reported more than one Daily Emissions record for [param] for the day.	Critical Error Level 1

C	You reported a Daily Emissions record for C02M, but you did not report an active	Critical Error Level 1

C02M FS A method record in your monitoring plan for the day.

D	You did not report a Daily Emissions record for C02M for the day.	Critical Error Level 1

E	You reported a Daily Emissions record for C02M, but this is not appropriate for a	Critical Error Level 1

non-operating day.

Usage:

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


-------
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	To t a 1D a i ly E m i s s i o n s >= 0 AND Rpt Period C02 Mass Reported Accumulator Array for the

location >= 0)

Rpt Period C02 Mass Reported Accumulator Array for the location = Rpt Period C02 Mass Reported Accumulator
Array for the location + Current C02 Mass Daily	To ta 1Da i ly Emi ssio ns

if (Current C02 Mass Daily	U nadj us tcdDai ly E missio ns is not null OR Calc C02 Unadj is not null)

if (Current C02 Mass Daily Record. Ad)ustedDai ly Emissions is null)

Calc TDE = Calc C02 Unadj

else if (Current C02 Mass Daily /?6'ew= 0)

Calc TDE = Calc TDE + Current C02 Mass Daily Record. SorbcntRclatcdIVIassEmissions

else

Set Calc TDE to null.

else if (Current C02 Mass Daily	Unadj ustcdDaily Emissions is null AND Legacy Data Evaluation == true AND Current

C02 Mass Daily	Tota 1Da i ly E missions >= 0)

Calc TDE = Current C02 Mass Daily	Tota 1Da i ly Emi ssio ns

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)

Rpt Period C02 Mass Calculated Accumulator Array for the location = Rpt Period C02 Mass Calculated
Accumulator Array for the location + Calc TDE

If (Current C02 Mass Daily Record.Tota 1Dai ly Emi ssio lis >= 0)

If (Calc TDE is not null)


-------
Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M DAILY" AND
UOM = "TON"

if (ABS {Current C02 Mass Daily Record.TotalDaily Emissions - Cole TDE) > Tolerance)
return result A

return result C

else

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

Results:

Result	Response	Severity

A	The [fieldname] reported in the Daily Emissions record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

B	The [fieldname] reported in the Daily Emissions record for [param] is invalid. The Critical Error Level 1

value must be greater than or equal to 0.

C	The TotalDailyEmissions in the Daily Emissions record for [param] could not be	Informational Message

recalculated due to other errors listed in this report.

Usage:

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


-------
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 Daily	Adj ustcdDaily Emissions is not null),

If (Current C02 Mass Daily Record. AdjustcdDaily Emissions is less than 0),
return result A

else

If (Current CO2 Mass Daily Ttecon/.UnadjustedDailyEmissions is greater than or equal to 0 AND is less than
Current C02 Mass Daily	Adj ustcdDa i ly E missio lis).

return result B

Results:

Result
A

B

Response	Seventy

The [fieldname] reported in the Daily Emissions record for [param] is invalid. The	Critical Error Level 1

value must be greater than or equal to 0.

The AdjustedDailyEmissions in the Daily Emissions record for [param] is greater than	Critical Error Level 1

the UnadjustedDailyEmissions. The adjusted value should be less than the unadjusted

value.

Usage:

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


-------
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 CO2 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:

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


-------
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 Daily	Adj ustcdDa i ly E missio ns is not 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-2" or "G-3".

If not found,

return result A.

Results:

Result
A

You reported AdjustedDailyEmissions in the Daily Emissions record for C02M, but yon Critical Error Level 1
did not report a G-2 or G-3 formula in your monitoring plan.

Response

Severity

Usage:

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


-------
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 CO2 Mass Daily Record.SorbcntRclatcdMassEmissions 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

You reported SorbentRelatedMassEmissions in the Daily Emissions record for C02M, Critical Error Level 1
but you did not report [code] formula(s) in your monitoring plan.

Response

Severity

Usage:

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


-------
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	UnadjustedDailyEmissions is null OR is less than 0)

return result A

else if (Current C02 Mass Daily Tfecon/.UnadjustedDailyEmissions >= 0)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M DAILY" AND
UOM = "TON"

if (ABS(Current C02 Mass Daily /?6'ew Tolerance)
return result B

else if (Current C02 Mass Daily Ttecon/.UnadjustedDailyEmissions is null)

If (Legacy Data Evaluation == false)

return result A.

else if (Current C02 Mass Daily Ttecon/.UnadjustedDailyEmissions is less than 0)
return result A

else

Set Calc C02 Unadj to Current C02 Mass Daily /?6'ew
-------
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.UnitFuelCd

If not found,

return result A

Severity

Critical Error Level 1

Results:

Result	Response

A	You did not report an active Unit Fuel record for FuelCode [fueled] in your monitoring

plan.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions Fuel


-------
Check Code:

DAILY-9

Check Name:

Check Daily Fuel Feed

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current Daily Fuel Record.DailyFuelFeed is null)
return result A.

else if (CurrentDaily Fuel Record. Daily Fuc 1 Fccd is less than or equal to 0)
return result A.

Results:

Result
A

The [fieldname] reported in the Daily Fuel record for [key] is missing or invalid. The Critical Error Level 1
value must be greater than 0.

Response

Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report

C02 Daily Emissions Fuel


-------
Check Code:

DAILY-10

Check Name:

Check Carbon Content Used

Related Former Checks:

Applicability:

Description:

Specifications:

if (Current Daily Fuel Record. Carbo nCo ntc ntU scd is null)
return result A.

else if (Current Daily Fuel Record. C a rb o n C o lit c n t U s cd is less than or equal to 0 or greater than 100)
return result A.

Results:

Result
A

The CarbonContentUsed in the Daily Fuel record for [key] is invalid. The value must Critical Error Level 1
be greater than 0 and less than or equal to 100.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions Fuel


-------
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 Record .Di\W\ F uel Feed is greater than 0 and Current Daily Fuel 7tecw Calc Fuel Carbon Burned)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "CARBON" AND
UOM= "LB"

if (A B S(Current Daily Fuel Record. Fuel Ca rbo nB urued - Calc Fuel Carbon Burned) > Tolerance)
return result B.

Results:

Result	Response	Severity

A	The [fieldname] reported in the Daily Fuel record for [key] is missing or invalid. The Critical Error Level 1

value must be greater than 0.

B	The [fieldname] in the Daily Fuel record for [key] is inconsistent with the recalculated Critical Error Level 1

value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Daily Emissions Fuel


-------
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

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

C02 Daily Emissions Initialization


-------
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 Record.TotalCarbonBurncd is null)
if (Calc Total Carbon Burned is not equal to 0)
return result A.

else if (Current C02 Mass 7)ai/j7?ecor Calc Total Carbon
Burned)

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "CARBON" AND
UOM = "LB"

if (ABS (Current C02 Mass Daily Records otalCarbonBurncd - Calc Total Carbon Burned ) > Tolerance)
return result C.

else if (Calc Total Carbon Burned == 0 )

Set Calc Total Carbon Burned to Current C02 Mass Daily Record. Total Ca rbo nB urncd.

Results:

Result	Response

A	You did not report TotalCarbonBurned in the Daily Emission record for C02M. You

must report this value if you report Daily Fuel records.

B	The [fieldname] reported in the Daily Emissions record for [param] is invalid. The

value must be greater than or equal to 0.

C	The [fieldname] reported in the Daily Emissions record for [param] is inconsistent with

the recalculated value.

Seventy

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

Usage:

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


-------
Check Category:
Daily Interference Status


-------
Check Code:

INTSTAT-1

Check Name:

Related Former Checks:

Determine the Online Daily Interference Check

Applicability:
Description:

CEM Check

This check locates the most recent prior daily interference check for the FLOW monitor used during the current
hour.

Specifications:

Set OnlineDailylntRecord = null
Set OfflineDailylntRecord = null.

Set DailylntStatusResult = null

Locate the latest record in DailyIntCheckRecordsByLocationForQAStatus for the location:

a)	Date/Hour is on or prior to the Current MHVRecord.Date/Hour

b)	ComponentID is equal to the Current MH V Record. Co mpo ncnt ID AND

c)	TestResultCd is not equal to "IGNORED" //Ignored indicates an offline test

if (Daily IntCheckRecords By Location ForOAStatus is found)

Set OnlineDailylntRecord = the found record in DailylntCheckRecordsByLocationForQAStatus.

If (OnlineDailylntRecord.TestResultCd = "PASSED")

If (the number of clock hours between the OnlineDailylntRecord. EndDatc/Hour and the CurrentMHVRecord. Datc/Hour is
less than 26)

Set DailylntStatusResult = "IC"

else if (OnlineDailyIntRecord.TestResultCd = "FAILED")

Set DailylntStatusResult = "OOC-Test Failed"

else if (OnlineDailyIntRecord.TestResultCd = "ABORTED")

Set DailylntStatusResult = "OOC-Test Aborted"

Set DailylntStatusResult = "OOC-Test Has Critical Errors"

If (DailylntStatusResult is not equal to "IC")

Locate the latest record in DailylntCheckRecordsByLocationForQAStatus for the location where:

a)	Date/Hour is on or prior to the Current MHV Record. Date/Hour

b)	Date/Hour/Min is after the OnlineDailylntRecord.EndD'Mc/Hour/Min

c)	The ComponentID is equal to the CurrentMHVRecord.ComponentID AND

d)	TestResultCd is equal to "IGNORED"

if (DailylntCheckRecordsByLocationForQAStatus is found

else

Set OfflineDailylntRecord = the found record in DailylntCheckRecordsByLocationForQAStatus.

If (DailylntStatusResult is not null)

Set DailylntStatusResult = DailylntStatusResult &

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Interference Check Status Evaluation


-------
Check Code:	INTSTAT-2

Check Name:	Determine Daily Interference Status for No Prior Check

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines the daily inteference check status when there is no prior check.

Specifications:

If (DailylntStatusResult is null) and (OnlineDailylntRecord is null)

/ Determine whether check in previous quarter is possibly effective for current hour.

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 DailylntStatusResult = "IC-Undetermined".

else

/ If a non operating hour exists within the first 24 hours after the first operating hour in the quarter, a grace period exists
for seven hours after the operating hour subsequent to the non operating hour.

Locate the latest record in HourlyOpData where:

a)	Date/Hour is ON OR PRIOR to the 24th clock hour following the First Day of Operation/First Hour of Operation

b)	OpTime is equal to zero.

if (HourlyOpData is found)

Locate the first record in HourlyOpData where:

a)	Date/Hour is after the Date/Hour in the HourlyOpData record found above

b)	Date/Hour is ON OR PRIOR to the CurentMHVRecord.Date/Hour

c)	OpTime is greater than zero.

if (HourlyOpData is found) and (the number of clock hours starting at HourlyOpData.Date/Rour and up to the
hour before CurrentMHVRecord Date/Hour is greater than 7)

Set DailylntStatusResult = "OOC-No Prior Test".

else

Set DailylntStatusResult = "IC-Undetermined".

else

Set DailylntStatusResult = "OOC-No Prior Test".

If (DailylntStatusResult begins with "OOC")

Locate the record in DailylntCheckRecordsByLocationForQAStatus for the location where:

a)	Date/Hour is on or prior to the Current MHVRecord. Date/Hour

b)	the ComponentID is equal to the Current MHV Record Compo nc lit ID AND

c)	TestResultCd is equal to "IGNORED"

if (DailylntCheckRecordsByLocationForQAStatus is found)

Set OfflineDailylntRecord = the found record in DailyIntCheckRecordsByLocationForQAStatus.
Set DailylntStatusResult = DailylntStatusResult &

Results:

Result

Response

Severity


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Interference Check Status Evaluation


-------
Check Code:	INTSTAT-3

Check Name:	Determine Expiration Status for Prior Daily Interference Check

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines the daily interference status if the prior check is more than 26 hours prior to current hour.

Specifications:

If (DailylntStatusResult is null)

/ If a non operating hour exists within the first 27 hours after the hour of the online Daily Interference Check, a grace period exists
for seven hours after the operating hour subsequent to the non operating hour.

Locate the latest record in HourlyOpData where:

a)	DateHour is after the OnlineDailyCalRecord Date/Hour.

b)	Date/Hour is ON OR PRIOR to the 27th hour after the OnlineDailyCalRecord Date/Hour.

c)	OpTime is equal to zero.

if (HourlyOpData is found)

Locate the earliest record in HourlyOpData where:

a)	Date/Hour is after the Date/Hour in the HourlyOpData record found above.

b)	Date/Hour is on or before the CurrentMHVRecord.Date/Hour

c)	OpTime is greater than zero.

if (HourlyOpData is found) and (the number of clock hours starting at HourlyOpData.DatefRour and up to the hour before
CurrentMHVRecord Date/Hour is greater than 7)

Set DailylntStatusResult = "OOC-Expired".

else

Set DailylntStatusResult = "IC-Grace".

else

Set DailylntStatusResult = "OOC-Expired".

If {DailylntStatusResult begins with "OOC" and OfflineDailylntRecord is not null)

Set DailylntStatusResult = DailylntStatusResult &

If {DailylntStatusResult does not begin with "IC")

Return DailylntStatusResult.


-------
Results:

Result

OOC-Expired
OOC-Expired*

OOC-No Prior
Test

OOC-No Prior
Test*

OOC-Test
Aborted
OOC-Test
Aborted*

OOC-Test Failed

OOC-Test

Failed*

OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*

Response

The prior daily interference check for [compkey] completed on [date] expired.

The prior daily interference check for [compkey] completed on [date] expired. A daily
interference check completed on [invdate] was ignored because it was completed while
the unit was offline.

You did not report a prior daily interference check for [compkey] during the reporting
period. Any daily interference check that may have been completed in a prior reporting
period has expired.

You did not report a prior daily interference check for [compkey] during the reporting
period. Any daily interference check that may have been completed in a prior reporting
period has expired. A daily interference check completed on [invdate] was ignored
because it was completed while the unit was offline.

The prior daily interference check for [compkey] completed on [date] was aborted.

The prior daily interference check for [compkey] completed on [date] was aborted. An
daily interference check completed on [invdate] was ignored because it was performed
while the unit was offline.

The prior daily interference check for [compkey] completed on [date] failed.

The prior daily interference check for [compkey] completed on [date] failed. An daily
interference check completed on [invdate] was ignored because it was performed while
the unit was offline.

The prior daily interference check for [compkey] completed on [date] has critical errors.

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

The prior daily interference check for [compkey] completed on [date] has critical errors. Critical Error Level 1
An daily interference check completed on [invdate] was ignored because it was
performed while the unit was offline.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Daily Interference Check Status Evaluation


-------
Check Category:
Daily Test


-------
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	Response Severity

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

B	You reported a [Fieldname] of [Date], which is outside the range of acceptable values Critical Error Level 1
for this date for [key].

Usage:

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

2

Process/Category:

Emissions Data Evaluation Report	Miscellaneous Emission File Test


-------
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	Response	Severity

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

B	You reported a [Fieldname] of [Hour], which is outside the range of acceptable values Critical Error Level 1

for this hour for [key].

Usage:

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

2

Process/Category:

Emissions Data Evaluation Report	Miscellaneous Emission File Test


-------
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:

Severity
Fatal

Informational Message
Critical Error Level 1

2	Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test

Result	Response

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

B	You did not provide [fieldname] for [key]. This information will be required for

ECMPS submissions.

C	You reported a [Fieldname] of [Minute] for [key], which is outside the range of

acceptable values.

Usage:

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


-------
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 MonitoringSystemID is null,
return result D.

If the SystemTypeCode of the associated system is not equal to "NOXP",
return result E.

Results:

Result
A

You have reported both a MonitoringSystemID and a ComponentID for [key]. This is Critical Error Level 1
invalid.

Response

Severity

B
C
D

E

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.

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

2	Process/Category:

Emissions Data Evaluation Report	Miscellaneous Emission File Test


-------
Check Code:	EMTEST-5

Check Name:	Daily Test Span Scale Valid

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines whether the reported span scale is valid and consistent with the current analyzer range of

the component.

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:

1	Process/Category: Emissions Data Evaluation Report	Miscellaneous Emission File Test


-------
Check Code:	EMTEST-6

Check Name:	Daily Test Result Code Valid

Related Former Checks:

Applicability:	General Check

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".

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 type,	Critical Error Level 1

in the field [fieldname] for [key].

Usage:

1

Process/Category:

Emissions Data Evaluation Report

Miscellaneous Emission File Test


-------
Check Category:
EM Weekly System Integrity Test


-------
Check Code:	EMWSI-1

Check Name:	Check Hg Converter Indicator of the Component

Related Former Checks:

Applicability:

Description:	Ensures that the Hg Convert Indicator of the component associated with the test is set to 1.

Specifications:

If (CurrentWeeklySystemlntegrityTest .HgConverterlndicator is NOT equal to 1)

Set Weekly TestSummary V(did to false,
return result A.

Results:

Result	Response	Severity

A	For [key] you reported a HgConverterlndicator that is not equal to I, which indicates Critical Error Level 1

that a Weekly System Integrity Test is not necessary.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWSI-2

Check Name:	Check Gas Level

Related Former Checks:

Applicability:

Description:	Ensure that the Gas Level was reported and with a valid value.

Specifications:

For CurrentWeeklySystemlntegrifyTest

IF (GasLevelCode is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (GasLevelCode is NOT in set (HIGH, MID, LOW, ZERO))

Set Weekly TestSummary V(did to false,
return result B.

Else if (GasLevelCode is NOT in set (HIGH, MID))

Set Weekly TestSummary V(did to false,
return result C.

Results:

Result	Response	Severity

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

B	For [key] you reported a [levelcode] that is not in the list of valid [fieldname] for this	Critical Error Level 1

test type.

C	For [key], you reported an invalid Gas Level Code of [levelcode], for a [testype].	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWSI-3

Check Name:	Check Weekly System Integrity Reference Value

Related Former Checks:

Applicability:

Description:	Ensure that the Weekly System Integrity Test Reference Value was reported and with a valid value.

Specifications:

For CurrentWeeklySystemlntegrifyTest

Set InjectionReferenceValueValid to false.

If (ReferenceValue is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (ReferenceValue is NOT rounded to one decimal place)

Set Weekly TestSummary V(did to false,
return result B.

Else if (ReferenceValue is NOT greater than 0)

If (TestResultCode is NOT equal to "FAILED")

Set Weekly TestSummary V(did to false,
return result C.

Else

Set InjectionReferenceValueValid to true

Results:

Result	Response

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

B	The [fieldname] value for [key] should be reported to one decimal place.

C	Your reported CEM Value and/or Reference Value for [key] is less than or equal to

zero.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Seventy

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


-------
Check Code:	EMWSI-4

Check Name:	Check Weekly System Integrity Measured Value

Related Former Checks:

Applicability:

Description:	Ensure that the Weekly System Integrity Test Measured Value was reported and with a valid value.

Specifications:

For CurrentWeeklySystemlntegrifyTest

Set Injection Measured Value Valid to false.

IF (MeasuredValue is null)

Set Weekly TestSummaryValid to false,
return result A.

Else if (MeasuredValue is NOT rounded to one decimal place)

Set Weekly TestSummaryValid to false,
return result B.

Else if (MeasuredValue is NOT greater than 0)

If (TestResultCode is NOT equal to "FAILED")

Set Weekly TestSummary V(did to false,
return result C.

Else

Set Injection Measured Value Valid to true

Results:

Result	Response

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

B	The [fieldname] value for [key] should be reported to one decimal place.

C	Your reported CEM Value and/or Reference Value for [key] is less than or equal to

zero.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Seventy

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


-------
Check Code:	EMWSI-5

Check Name:	Calculate System Integrity Error and Alternate Performance Spec Indicator

Related Former Checks:

Applicability:

Description:	Use the Reference and Measured Values to calculate the System Integrity Error and the Alternate Performance

Spec. Also updates the calculated Weekly Test Summary Test Result.

Specifications:

For CurrentWeeklySystemlntegrifyTest

Set CalculatedSystemlntegrityApsIndicator to null.

Set CalculatedSystemlntegrityError to null.

If (InjectionReferenceValueValid AND InjectionMeasuredValueValid)

Set PercentError to (100 * ABS(ReferenceValue - MeasuredValue) / Reference Value), rounded to 1 decimal place.

If (PercentError is less than or equal to 10)

Set CalculatedSystemlntegrityApsIndieator to 0.

Set CalculatedSystemlntegrityError to PercentError.

Set CalculatedWeeklyTestSummaryResult to "PASSED".

Else

Set AbsoluteError to ABS(ReferenceValue - MeasuredValue), rounded to 2 decimal places.

If {AbsoluteError is less than or equal to 0.8)

Set CalculatedSystemlntegrityApsIndicator to 1.

Set CalculatedSystemlntegrityError to AbsoluteError.

Set CalculatedWeeklyTestSummaryResult to "PASSAPS".

Else

Set CalculatedSystemlntegrityApsIndicator to 0.

Set CalculatedSystemlntegrityError to PercentError.

Set CalculatedWeeklyTestSummaryResult to "FAILED".

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWSI-6

Check Name:	Check Weekly System Integrity Alternative Performance Spec

Related Former Checks:

Applicability:

Description:	Ensures that the APS indicator is a valid value and matches the calculate APS indicator.

Specifications:

For CurrentWeeklySystemlntegrifyTest

Set WeeklySystemlntegrityApsIsValid to false.

If (InjectionReferenceValueValid and InjectionMeasuredValueValid)

If (Apslndicator is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (Apslndicator is NOT equal to 0 OR 1)

Set Weekly TestSummary Valid to false,
return result B.

Else if (Apslndicator is NOT equal to CalculatedSystemlntegrityApsIndicator)

Set Weekly TestSummary Valid to false,
return result C.

Else

Set WeeklySystemlntegrityApsIsValid to true.

Results:

Result	Response

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

B	You did not report an APSIndicator of "0" or" 1" for [key].

C	The APSIndicator reported for [key] is inconsistent with the APSIndicator recalculated

from the reported reference and measured values.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Seventy

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


-------
Check Code:	EMWSI-7

Check Name:	Check Weekly System Integrity Error

Related Former Checks:

Applicability:

Description:	Ensure that the Weekly System Integrity Error was reported, has a valid value, and matches the calculated value

Specifications:

For CurrentWeeklySystemlntegrifyTest

Set WeeklySystemlntegrityErrorlsValid to false.

IF {InjectionReferenceValueValid and InjectionMeasuredValueValid)

IF (SystemlntegrityError is null)

Set Weekly TestSummary Valid to False,
return result A.

Else iF {WeeklySystemlntegrityApsIsValid)

IF (SystemlntegrityError is NOT rounded to one decimal place)

Set Weekly TestSummary Valid to False,
return result B.

Else iF (SystemlntegrityError is NOT equal to CalculatedSystemlntegrityError)

Set Weekly TestSummary Valid to False,
return result C.

Else

Set Weekly SystemlntegrityErr orlsValid to true.

Results:

Result	Response

A	You did not provide a [Fieldname], which is required, For [key].

B	[Fieldname] is not reported to one decimal place.

C	The [Fieldname] value For [key] is inconsistent with the value oF [value], recalculated

From the reported [testtype] records.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Seventy

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


-------
Check Code:

EMWSI-8

Check Name:

Related Former Checks:

Check Weekly Test Summary Result Against Calculated Value

Applicability:
Description:

Compares the calculated test result to the reported test result.

Specifications:

If (CalculatedWeeklyTestSummaryResult is NOT null) and (CurrentWeekly TestSummary. TcstRcsu 11Codc is NOT equal to
CalculatedWeekly TestSummary Result)

Set CalculatedWeekly TestSummary Result to null.

Set Weekly TestSummary V(did to false,
return result A.

Results:

Result
A

Response

For [key], the [fieldname] is not consistent with the test result recalculated from the
reported records.

Severity

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWSI-9

Check Name:	Update Weekly System Integrity Dictionary Component Entry

Related Former Checks:

Applicability:

Description:	Initializes a WsiTestDictionary entry for the CurrentWeeklySystemlntegrityTest Component Id if it does not

already exist.

If the LastEvaluatedTestRecord is not null and its TestDateHour is before the current hour, assign it as the
MostRecentTestRecord, and clear the operating date list and last operating date.

Finally always set the LastEvaluatedTestRecord to the CurrentWeeklySystemlntegrityTest.

Specifications:

If (WsiTestDictionary does NOT contain a key equal to Current Weekly Systemlntegrity Test.Compomntld)

Add an entry to WsiTestDictionary for CurrentWeeklySystemlntegrityTest.Componentld with the following fields:

a)	MostRecentTestRecord

b)	OperatingDateList initialized as an empty list.

For the WsiTestDictionary entry where the key is equal to CurrentWeeklySystemlntegrityTest.ComponQntld:

Set MostRecentTestRecord to CurrentWeeklySystemlntegrityTest.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWSI-10

Check Name:	Update Weekly System Integrity Dictionary Operating Date Information

Related Former Checks:

Applicability:

Description:	Updates the OperatingDateList with the current date if it is not in the list and the current hour is an operating

hour.

Specifications:

If (CurrentOperatingTime is greater than 0)

For each entry in WsiTestDictionary.

If (MostRecentTestRecord is NOT null) AND (MostRecentTestRecord .LocationKey is equal to
CurrentMonitorLocationld)

If (MostRecentTestRecord .TestDateHour is equal to CurrentDateHour)

Set OperatingDateList to an empty list.

If (MostRecentTestRecord.TestDate is prior to CurrentDateHour) AND (OperatingDateList does NOT contain
CurrentOperatingDate)

Add CurrentOperatingDate to OperatingDateList

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Operating Dates


-------
Check Code:	EMWSI-11

Check Name:	Ensure that Weekly System Integrity Test Occurred During an Operating Hour

Related Former Checks:

Applicability:	General Check

Description:	This check ensures that the Weekly System Integrity test occurred during an operating hour.

Specifications:

For CurrentWeeklySystemlntegrifyTest

IF (CurrentOperatingTime is equal to 0)

Return result A

Results:

Result	Response	Severity

A	Test [key] was performed while the unit was not operating even though [type] test are Critical Error Level 1

only allowed during operating hours.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Category:
EM Weekly Test Summary


-------
Check Code:	EMWTS-1

Check Name:	Initialize Parameters

Related Former Checks:

Applicability:

Description:	Initializes the updatable parameters used in weekly test summary evaluations.

Specifications:

Set Weekly TestSummary Valid to true.

Set CalculatedWeeklyTestSummaryResult to null.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-2

Check Name:	Check Weekly Test Type

Related Former Checks:

Applicability:

Description:	Ensures that the test type is for a weekly test.

Specifications:

For CurrentWeeklyTestSummary

If (TestTypeCode is not equal to "HGSI1"),

Set Weekly TestSummary V(did to false,
return result A.

Results:

Result	Response	Severity

A	You reported a [testtype] in [key] that is not a valid TestTypeCode for a weekly test. Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-3

Check Name:	Check Weekly Test System

Related Former Checks:

Applicability:

Description:	Ensures that the system identifer is either reported or not reported when expected, and if it is and should have

been reporte, that it was reported with the correct system type.

Specifications:

For CurrentWeeklyTestSummary

If (TestTypeCode is equal to "HGSI1"),

If (Systemld is NOT null),

Set Weekly TestSummary Valid to false,
return result A.

Results:

Result	Response	Severity

A	You reported a MonitoringSystemID for [key], which is not valid for a [testtype]. Only Critical Error Level 1

a ComponentID is reported for a [testtype].

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-4

Check Name:	Check Weekly Test Component

Related Former Checks:

Applicability:

Description:	Ensures that the system identifer is either reported or not reported when expected, and if it is and should have

been reporte, that it was reported with the correct system type.

Specifications:

For CurrentWeeklyTestSummary

If (TestTypeCode is equal to "HGSI1")

If (Componentld is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (ComponentTypeCode is NOT equal to "HG")

Set Weekly TestSummary Valid to false,
return result B.

Results:

Result	Response	Severity

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

B	The ComponentTypeCode for [key] is not appropriate for this type of test.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:

EMWTS-5

Check Name:

Related Former Checks:

Check Weekly Test Date

Applicability:
Description:

Ensures that an date was reported for the weekly test and that the value reported is valid.

Specifications:

For CurrentWeeklyTestSummary

Set TestDateValid to false.

If (TestDate is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (TestDate is before 01/01/1993) OR (TestDate is after CurrentReportingPeriodEndHour)

Set Weekly TestSummary V(did to false,
return result B.

Else

Set TestDateValid to true.

Results:

Result

A

B

Response

You did not provide a [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].

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-6

Check Name:	Check Weekly Test Hour

Related Former Checks:

Applicability:

Description:	Ensures that an hour was reported for the weekly test and that the value reported is valid.

Specifications:

For CurrentWeeklyTestSummary

Set TestHourValid to false.

If (TestHour is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (TestHour is NOT between 0 and 23)

Set Weekly TestSummary V(did to false,
return result B.

Else

Set TestHourValid to TestDateValid.

Results:

Result	Response	Severity

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

B	You reported a [Fieldname] of [Hour], which is outside the range of acceptable values Critical Error Level 1

for this hour for [key].

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-7

Check Name:	Check Weekly Test Minute

Related Former Checks:

Applicability:

Description:	Ensures that a minute was reported for the weekly test and that the value reported is valid.

Specifications:

For CurrentWeeklyTestSummary

Set TestDateTimeValid to false.

If (TestMinute is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (TestMinute is NOT between 0 and 59)

Set Weekly TestSummary V(did to false,
return result B.

Else if (TestHourValid')

Set TestDateTimeValid to true.

Results:

Result	Response	Severity

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

B	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	Weekly System Integrity Test Evaluation


-------
Check Code:	EMWTS-8

Check Name:	Check Weekly Test Span Scale

Related Former Checks:

Applicability:

Description:	Ensure that the Weekly Test Gas Level was reported and with a valid value.

Specifications:

For CurrentWeeklyTestSummary

IF (SpanScaleCode is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (SpanScaleCode is NOT in set (H, M, L))

Set Weekly TestSummary V(did to false,
return result B.

Else if (TestTypeCode is equal to "HGSI1")

If (SpanScaleCode is NOT equal to "H")

Set Weekly TestSummary V(did to false,
return result C.

Results:

Result	Response	Severity

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

B	For [key], you reported a SpanScaleCode that in not an appropriate code for a [testtype].	Critical Error Level 1

C	For [key], you reported a SpanScaleCode that in not an appropriate code for a [testtype].	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Code:

EMWTS-9

Check Name:

Related Former Checks:

Check Weekly Test Result

Applicability:
Description:

Ensure that the Weekly Test Result was reported and with a valid value.

Specifications:

For CurrentWeeklyTestSummary

Set TestResultValid = false.

If (TestResultCode is null)

Set Weekly TestSummary V(did to false,
return result A.

Else if (TestResultCode is not in TestResultCodeList)

Set Weekly TestSummary V(did to false,
return result B.

Else if (TestTypeCode is equal to "HGSI1")

ff (TestResultCode is NOT in set (PASSED, PASSAPS, FAILED))

Set Weekly TestSummary V(did to false,
return result C.

Else

Set TestResultValid = true.

Else

Set TestResultValid = true.

Results:

Result

A

B

Response

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

You reported the value [value], which is not in the list of valid values for this test type,

in the field [fieldname] for [key].

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

Severity

Critical Error Level 1
Critical Error Level 1

C

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation


-------
Check Category:
Flow-to-Load Status


-------
Check Code:	F2LSTAT-1

Check Name:	Determine Most Recent Flow-to-Load QA Operating Quarter

Related Former Checks:

Applicability:

Description:	This check finds the most recent QA operating quarter for flow-to-load checks.

Specifications:

Set F2LStatusPriorTestRequiredQuarter = null.

Set F2LStatusPriorTestRequiredQuarterMissingOpData = null.

If F2LStatusSystemResuItDictionary does not contain lookup value for CurrentMh vRecord.SystemID

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh v Record. SystcmID. EndDateHour is before the CurrentReportingPeriod, and TestResultCode is not equal to
"INVALID"

If found,

For each quarter before CurrentReportingPeriod beginning with the quarter immediately before CurrentReportingPeriod
and going back to later of the quarter of the located RataTestRecordsByLocationForQaStatus and the quarter of the
Earliest Location Report Date

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 ()peratingSuppl)ataRecordsIiyLocation.OpVa 1 lie >= 168

Locate a record in F2LCheckRecordsForQaStatus where SystemID is equal to
CurrentMhvRecord. SystemID, 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 quartervalue 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.

Else


-------
Set F2LStatusPriorTestRequiredQuarter = -1.

Set F2LStatusPriorTestRequiredQuarterMissingOpData = "No Prior RATA"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation


-------
Check Code:

F2LSTAT-2

Check Name:	Locate Most Recent Flow-to-Load Check Prior to the Current Hour

Related Former Checks:

Applicability:

Description:	This check locates the most recent passed or failed flow-to-load (F2L) check for the emission report, insures that

quarters between the quarter of the check and the emission report quarter were either not QA operating quarters
(less than 168 operating hours) or have an F2L with a result of EXC168H, indicating that the operating hours
minus exluded hours is less than 168.

If the check exist but an intervening quarter with more than 168 operating hours (excluding EXC168H) exists,
or a check does not exist a parameter indicating the ultimate result is set. If the check does not exist and the a
non load based unit is involved (directly or indirectly) or a Flow-to-Load exemption exist, then the result is
IC-Exempt. If a RATA exists in the prior quarter then the result is OOC-No Prior Check, and if it does not then
IC-No Prior RATA.

Specifications:

If F2LStatusSystemResu1tDietionary contains lookup value for CurrentMh vRecord. Sy stem ID

Set F2LStatusResult = F2LStatusSystemResultDictionary lookup value for CurrentMhvRecord.SystemID.

Set CurrentFlowToLoadStatusCheck = F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord .SystemID.

Set F2LStatusMissingOpDataInfo = F2lStatusSystemMissingOpDietionary lookup value for CurrentMhvRecord .SystemID.

Else

Set F2LStatusResult = null.

Set CurrentFlowToLoadStatusCheck = null.

Set F2LStatusMissingOpDataInfo = null.

Locate the most recent record in F2LCheckRecordsForQaStatus where SystemID is equal to CurrentMhvRecord. SystemID,
EndDate < CurrentReportingPeriodBeginDateHour, and TestResultCode is equal to "PASSED" or "FAILED"

If not found

Locate a record in MpLocationNonLoadBasedRecords where the location is the location in CurrentMhvRecord.

If found, and NonLoadBaselnd equals 1

Set F2LStatusResuh = "IC-Exempt".

Else

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the

Cu rrentMh v Record .SystemID. the ExtensionExemptionCode is equal to "F2LEXP", and the reporting period is the
period before the current reporting period.

If found

Set F2LStatusResuh = "IC-Exempt".

Else

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhvRecord. SystemID, EndDate < CurrentReportingPeriodBeginDateHour, and TestResultCode
is not equal to "INVALID"

If not found

Set F2LStatusResult = "IC-No Prior RATA".


-------
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
Rata TestRecordsByLocationForQaStatus record

Set F2LStatusResult = "IC".

Else if the quarter of the located RataTestRecordsByLocationForQaStatus record is the quarter before
CurrentReportingPeriod, the TestReasonCode equals "INITIAL" or "RECERT" and TestResultCode
equals "PASSED"

Set F2LStatusResult = "IC".

Else if CurrentMhvRecord.SyslcmDcslgnnUonCodc is equal to "RB"

Set F2LStatusResult = "Undetermined-No Prior Check reported for Redundant Backup Monitor".

Else

Set F2LStatusResult = "OOC-Prior Check Missing".

Else

Set CurrentFlowToLoadStatusCheck = the located F2LCheckRecordsForQaStatus record.

If the quarter of CurrentFlowToLoadStatusCheck is not the quarter before CurrentReportingPeriod
If F2LStatusPriorTestRequiredQuarter is equal to -1
Set F2LStatusResuh = 'Missing Op Data".

Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData.

Else if F2LStatusPriorTestRequiredQuarter is not null, and is after the quarter of
CurrentFlowToLoadStatusCheck

if CurrentMhvRecord.SystcmDcsignationCodc is equal to "RB"

Set F2LStatusResult = "Undetermined-No Prior Check reported for Redundant Backup Monitor".

Else

Set F2LStatusResult = "OOC-Prior Check Missing".

Else if CurrentFlowToLoadStatusCheckTestResultCode = "PASSED"

Set F2LStatusResult = "IC".

Else

If CurrentFlowToLoadStatusCheckTestResultCode = "PASSED"

Set F2LStatusResult = "IC".

Set F2LStatusSystemResultDictionary lookup value for CurrentMhvRecord. SystemID = F2LStatusResult.

Set F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord. SystemID = CurrentFlowToLoadStatusCheck.

Set F2lStatusSystemMissingOpDictionary lookup value for CurrentMhvRecord. SystemID = F2LStatusMissingOpDataInfo.


-------
Results:

Result

Usage:

1

Response	Severity

Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation


-------
Check Code:	F2LSTAT-3

Check Name:	Locate Intervening RATA

Related Former Checks:

Applicability:

Description:	This check locates RATA that occurred after the quarter of the (failed) most recent prior flow-to-load check and

prior to the current hour.

Specifications:

Set F2LStatusInterveningRata = null.

If F2LStatusResult is null

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh vRecord. Svstcml D. EndDateHour is after CurrentFlowToLoadStatusCheck EndDatoRour and before
CurrentMh vRecord. BeginDatc/Begi nHour. and TestResultCode is not equal to "INVALID"

If found,

Set F2LStatusResult = "IC-Subsequent RATA Performed".

Set F2LStatusInterveningRata = The located record in RataTestRecordsByLocationForQaStatus.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation


-------
Check Code:

F2LSTAT-4

Check Name:	Locate Most Recent QA Cert Event

Related Former Checks:

Applicability:

Description:	This check locates Abbreviated Flow-to-Load that occurred after the quarter of the (failed) most recent prior

Flow-to-Load check and prior to the current hour.

Validation Tables:

[Test Type to Required Test Code] (Cross Check Table)

Specifications:

Set F2LStatusQaCertEvent = null.

Set F2L Status Event Requires RA TA = false.

Set F2L Status Event Requires Abbreviated Check = false.

If F2LStatusResuh is null

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to CurrentMh vRecord. SystemID.
QaCertEventCode is equal to "312", QaCertEventDateHour is on or after CurrentFlow To I. oadStatusCh eck. E ndDa te H o u r. and
QaCertEventDateHour is on or before CurrentMh vRecord. Begi nDa tc/Begi nHour.

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. Rcqui rcdTcstCodc.

If found,

F2L Status Event Requires RA TA = true.

Locate a record in Cross-Check Table "Test Type to Required Test Code" where TestTypeCode is equal to "AF2LCHK"
and RequireTestCode equals F2LStatusQaCertEvent. Rcqui rcdT cstCodc.

If found,

F2L Status Event Requires Abbreviated Check = true.

If F2/..SY«?M.v(>c/C.'67*?£'v'6'rt?.LastTcstCoinplctcdDatcHour is on or before CurrentMh vRecord. BeginDatc/Begi nHour

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/..SY
-------
Set F2LStatusResult = "OOC-Check Failed".

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

Flow-to-Load Status Evaluation


-------
Check Code:

F2LSTAT-5

Check Name:	Locate Earliest Valid Required Test

Related Former Checks:

Applicability:

Description:

Specifications:

Set F2lStatusEarliestValidRequiredTest = null.

IF F2LStatusResuh is null

IF F2L Status Event Requires RA TA is true,

Locate earliest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to

Cur rentMh vReconl. Sy stcml D. EndDateHour is aFter Cu rrentMh v Record. B eg i n D a t c/B c g i n H o u r. and TestResultCode is

not equal to "INVALID".

IF Found,

Set F2LStatusEarliestValidRequiredTest = The located record in RataTestRecordsByLocationForQaStatus .

IF F2LStatusEarliestValidRequiredTest .TestResultCode is equal to "FAILED"

Locate records in RataTestRecordsIiy Location ForOaStatus w here the SystemID is equal to
CurrentMh vRecord. Sy stcml D. EndDateHour is aFter F2LStatusQaCertEvent.Q&CQr{EvQici\D?&QY[om and
beFore F2LSt(itusEarliestValidRequiredTest.EndDMcHour. 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".

This check locates the earliest RATA test iF the most recent event had a Require Test Code oF '5' or '6', or the
earliest Abbreviated F2L iF the Required Test Code is '26'. IF the test was Found and it Failed the F2L status is
OOC, but For RATA the OOC status depends on the existence oF an intervening invalid RATA.

IF the test does not exist or did not Fail, the F2L is IC iF the number oF operating hours is less than or equal to
720 For RATA and 168 For other tests. Otherwise the status is OOC, with the RATA OOC value depending on
whether an intevening invalid RATA exists.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation


-------
Check Code:

F2LSTAT-6

Check Name:

Determine Event Conditional Status and Final Status

Related Former Checks:

Applicability:
Description:

This check determines the status result when a QA Cert Event Conditional Data Period is involved.

Additionally, the check sets the final result for teh Flow-to-Load Status checks.

Specifications:

If F2LStatusResuh is null

Set F2L Status Missing Op Data Info = null.

If F2L Status Event Requires RA TA is true,

Set OperatingHourLimit = 720

else

Set OperatingHourLimit = 168

If (the quarter of the F2LStatusQaCertEvent.Conditiom]BQgmDate 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 F2LStatusQaCertEvent.CondL\tiow\BQgmDatQlYiom and ON OR BEFORE CurrentMhvRecord.Datc/Hour,

If the number > OperatingHourLimit,

Set F2LStatusResuh = "OOC-Conditional Period Expired".

else

Set F2LStatusResuh = "IC-Conditional".

if (F2 L Statu sO a CertEvcm?. IVI i nO p H o u rs P ri o rQ ua rt c r is null)

Set F2LStatusQaCertEvent.MmOpHomsPnorQuarter = 0
Set F2LStatusQaCertEvent.MaxOpHoursPnorQuarter = 0

for each quarter beginning with the quarter of the F2LStatusQaCertEvent.ConditionaiBeginDate and continuing
through the quarter BEFORE the CurrentMh vRecord. Date/Hour:

else

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 F2 LStatusOaCertE vent. IVT i nOpHoursP rio rQua rtc r = -1

Append " [YEAR] Q[QTR]" to F2L Status Missing Op Data Info (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
F2LStatusQaCertEvent.Con6ii\iom}LBQgvaD?Ae

If ((iperatingSuppDataRecordsbyLocation.Op Va 1 lie MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
F2/..SY«?M.v(>c/C.'67*?£'v'6'rt?.CoiiditioiialBcgiiiDatc/Hour > 0)

Set F2 LStatusOaCertE vent. IVT i nOpHoursP rio rQua rtc r =
(iperatingSuppDataRecordsbyLocation.Op Va 1 lie MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
F2LStatusOaCertEvent.Con&\\\om\\BcgmDi\\dY{oux

If ((iperatingSuppDataRecordsbyL ocation.Op V a 1 lie is less than the number of
calendar hours in the quarter begin checked that are ON OR AFTER the
F2 LStatusOaCertEvent.Conditiom\\Bcgh\D'Mc/Hour)

Set F2 LStatusOaCertE vent.MaxOpHoursPviorQunvlcr =
OperatingSuppDataRecords by Location. Op Value.

else

Set F2 LStatusOaCertE vent.MaxOpHoursPviorQunvlcr = the number of
calendar hours in the quarter being checked that are ON OR AFTER the
F2 LStatusOaCertE vent.CondiUom\\Bcg'u\D'Mc/Hour.

else

Set F2 LStatusOaCertE vent. IVT i nOpHoursP rio rQua rtc r =
F2 LStatusOaCertEvent.MlnOpHoursPvlorQunvlcr +
OperatingSuppDataRecordsby Location.OpVMuc.

Set F2 LStatusOaCertE vent. IVT a\Op H o u rs PriorQuarter =

F2 /. Status OaCertE vent. IVI a \ O p H o u rs P ri o rQ ua rt c r +
OperatingSuppDataRecordsby Location.OpVdhic.

If (F2 LStatusOaCertE vent. IVI i nOpHoursP rio rQua rtc r == -1)

set F2LStatusResult to "Missing Op Data"

Else if (F2 LStatusOaCertE vent. IVI i nOpHoursP rio rQua rtc r > OperatingHourLimit)

If F2L Status Event Requires RA TA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhvRecord.SystcmID. EndDateHour is on or after

F2A.SY«?M.s(>c/C.'67*?£'v'6'rt?.CoiiditioiialDataBcgiiiDatc/CoiiditioiialDataBcgiiiHoLir and on or before
CurrentMh vRecord. B eg i n Da tc/B eg i n H o u r. 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 F2LStatusResuh = "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. IVTi nOpHoursPriorQuartcr + Rpt Period Op Hours Accumulator Array for the Location >

OperatingHourLimit)

If F2L Status Event Requires RA TA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhv Record.SystcmID. EndDateHour is on or after

F2/.Af«fH.v(>«Ce/,f£Vewf. Condi tionalDataBcginDate/ConditionalDataBcginHour and on or before
CurrentMhvRecord.BcginDatc/BcginHour. 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 (F2/

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-Conditional
Period Expired
OOC-Conditional
Period

Expired-Invalid
RATA Ignored
OOC-Invalid Cert
Event

OOC-Prior Check
Missing

OOC-Recertificat
ion RATA Failed
OOC-Recertificat
ion RATA Failed
- Invalid RATA
Ignored

Undetermined-Co
nditional Data

U ndetermined-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 one or more
previous reporting periods. If you have submitted emissions data for prior quarters, you
should be able to synchronize these records to your Client Tool 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.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

The conditional data period for QACertEventCode [code] QACertEventDate [eventdate] Critical Error Level 1
for [SYSID] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate [eventdate] Critical Error Level 1

for SystemID [EVENTKEY] has expired. A prior 3 Level System Integrity test 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.

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

The software could not determine if the current hour was within the conditional data Informational Message

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 Informational Message
Backup Flow Monitor.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Flow-to-Load Status Evaluation


-------
Check Category:
Hourly Aggregation


-------
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 CO 2 Start Quarter to null.

Set Heat Input Start Quarter to null.

Set NOXStart 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 Record. Locat io nNa mc begins with "MS" OR Multiple Stack Configuration == false)

Locate the earliest Monitor Method for location 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.

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

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

else

Set Heat Input Start Quarter to the quarter of the BeginDate.

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.

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 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 NOX Start Quarter to the quarter of the BeginDate.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
Check Code:	HOURAGG-2

Check Name:	Compare S02 Mass Accumulator Values

Related Former Checks: HOURCV-22
Applicability:	General Check

Description:	This check compares the accumulator reported S02 Mass with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

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 for this location == true)
return result C

else

if (Expected Summary Value S02 Array for 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 SO2 Summary Value Record. Current 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 <> S02 Mass Quarterly Reported Value)

if (ABS(Rpt Period S02 Mass Calculated Value - S02 Mass Quarterly Reported Value) > S02 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 A B S( 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 CurrentReportingPeriodTotalof [sumval] reported in the Summary Value record for
S02M for the reporting period is inconsistent with the recalculated value of [calcval].
The CurrentReportingPeriodTotalof [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


-------
Check Code:	HOURAGG-3

Check Name:	Compare C02 Mass Accumulator Values

Related Former Checks: HOURCV-23
Applicability:	General Check

Description:	This check compares the accumulator reported C02 Mass with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

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-0LD" 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 for 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 for this location = (Rpt Period C02 Mass Reported Accumulator Array for
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 for 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 C02 Summary Value Record.Currclit 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)

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 ToleranceDeviators.


-------
else

if {Rpt Period C02 Mass Calculated Accumulator Array for this location == -1)
return result E

// if no result

if {Rpt Period C02 Mass Reported Accumulator Array for this location >= 0 AND ABS{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	Response	Severity

A	The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record for Critical Error Level 1

C02M for the reporting period is inconsistent with the recalculated value of [calcval].

B	The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record for Critical Error Level 1

C02M is inconsistent with [sum], the sum of the hourly values reported in the DHV
records for the reporting period.

C	The CurrentReportingPeriodTotal in the Summary Value record for C02M is missing or Critical Error Level 1

the record is missing.

D	You reported a value for the CurrentReportingPeriodTotal in the Summary Value record Critical Error Level 1

for [param], but there was no emissions data in your file or an appropriate C02 Method
defined in your monitoring plan.

E	The CurrentReportingPeriodTotal in the Summary Value record for [param] could not Critical Error Level 1

be recalculated because of errors listed above.

F	The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is Critical Error Level 1

invalid. The value must be greater than or equal to 0.

G	You reported [fieldname] in the [type] record for [param] that is not rounded to the Critical Error Level 1

appropriate precision for that parameter.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
Check Code:	HOURAGG-4

Check Name:	Compare HI Accumulator Values

Related Former Checks: HOURCV-24

Applicability:	General Check

Description:	This check compares the accumulator reported HI with the calculated value and generates an error message if

the difference is greater than the accepted tolerance.

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.

else

return result E
// if no result

if (Rpt Period HI Reported Accumulator Array for this location >= 0 AND ABS(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 CurrentReportingPeriodTotalof [sumval] reported in the Summary Value record for
HIT for the reporting period is inconsistent with the recalculated value of [calcval].
The CurrentReportingPeriodTotalof [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


-------
Check Code:	HOURAGG-5

Check Name:	Compare Op Hours Values

Related Former Checks: HOURCV-25
Applicability:	General Check

Description:	This check compares the accumulator reported Op Hours with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

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


-------
Results:

Result
A

B
C
D

E

Response

The CurrentReportingPeriodTotalof [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


-------
Check Code:	HOURAGG-6

Check Name:	Compare Op Time Values

Related Former Checks: HOURCV-26
Applicability:	General Check

Description:	This check compares the accumulator reported Op Time with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

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


-------
Results:

Result
A

B
C
D

E
F

Response

The CurrentReportingPeriodTotalof [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


-------
Check Code:	HOURAGG-7

Check Name:	Compare NOx Rate Accumulator Values

Related Former Checks: HOURCV-27
Applicability:	General Check

Description:	This check compares the accumulator reported NOx Rate with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

Validation Tables:

[Quarterly Emissions Tolerances] (Cross Check Table)

Specifications:

If (Expected Summary Value NOx Rate Array for this location == true)
if (LME Annual ==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

else

Rpt Period NOx Rate Calculated Value = null

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 = 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"

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

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. Current 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 (ABS{Rpt Period NOx Rate Calculated Value - NOx Rate Quarterly Reported Value) > NOx Rate Quarterly
Tolerance)

return result A

else

return result E
//if no result

if {LME Annual == false)

if {Current Monitor Plan Location Record. Locatio nNamc begins with "MS" OR Multiple Stack Configuration

== false)

if {Rpt Period NOx Rate Reported Accumulator Array for this location >= 0 AND ABS {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

Results:

Result
A

B

C
D

E
F

Response

The CurrentReportingPeriodTotalof [sumval] reported in the Summary Value record for
NOXR for the reporting period is inconsistent with the recalculated value of [calcval].
The CurrentReportingPeriodTotalof [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


-------
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
Check Code:	HOURAGG-8

Check Name:	Compare NOx Mass Accumulator Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the accumulator reported NOx Mass with the calculated value and generates an error

message if the difference is greater than the accepted tolerance.

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 (ABS{Rpt Period NOx Mass Calculated Value - NOx Mass Quarterly Reported Value) > NOx Mass
Quarterly Tolerance)

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 AB S(Rpt Period NOx Mass Reported
Accumulator Array fox 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 CurrentReportingPeriodTotalof [sumval] reported in the Summary Value record for
NOXM for the reporting period is inconsistent with the recalculated value of [calcval].
The CurrentReportingPeriodTotalof [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


-------
Check Code:	HOURAGG-IO

Check Name:	Compare C02 Mass YTD Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual C02 Mass with the calculated values and generates an error message if

the difference is greater than the accepted tolerance.

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 ToleranceDeviators contains "C02M")

Annual C02M Calculated Value = Current C02 Summary Value Record.Current Reporting Period Total

else

Annual C02M Calculated Value = Rpt Period C02 Mass Calculated Value

else if (Quarter of the Current Reporting Period is greater than 1)

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 is null AND Expected Summary Value C02 Array for this location == false)
return result G

0Current C02 Summary Value Ttecon/.YearToDateTotal is null or is less than 0)
return result B

0Current C02 Summary Value Record. Yca rTo DatcTota 1 is not rounded to one decimal place)
return result D

(Annual C02M Calculated Value is not null)

if {Annual C02M Calculated Value <> Current C02 Summary Value 7tecw
-------
return result E

else

Results:

Result
A

B
C

D

E

F
G

If (Expected Summary Value C02 Array for this location == false AND Annual C02M Calculated Value > 0)
return result F

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

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
Check Code:	HOURAGG-11

Check Name:	Compare S02 Mass YTD Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual S02 Mass with the calculated values and generates an error message if

the difference is greater than the accepted tolerance.

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")

AnnualS()2M Calculated Value = Current S02 Summary Value Record. Current Reporting Period Total

else

AnnualS02M Calculated Value = Rpt Period S02 Mass Calculated Value

else if (Quarter of the Current Reporting Period is greater than 1)

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 OpValue 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 is null AND Expected Summary Value S02 Array for this location == false)
return result H

else if (Current S02 Summary Value Record. YearToDateTotal is null or is less than 0)
return result B

else if (Current S02 Summary Value Record. YearToDateTotal is not rounded to one decimal place)
return result D

else if (AnnualS02M Calculated Value is not null)

if (AnnualS02MCalculated ValueO Current S02 Summary V(dueRecord.YcarToDatcTotal)
return result C

// if no result

if (Current S02 Summary Value Record. OzoneScasonToDatcTota 1 is not null)


-------
return result F

else if (I.ME Annual is equal to true and Current S02 Summary Value Record. Y ca rT o DatcT ota 1 is greater than 25)
return result E

else

Results:

Result
A

B
C

D

E

If (Expected Summary Value S02 Array for this location == false AND Annual S02M Calculated Value > 0)
return result G

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 [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

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

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
Check Code:	HOURAGG-12

Check Name:	Compare NOx Mass YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual and ozone-season NOx Mass with the calculated values and generates

an error message if the difference is greater than the accepted tolerance.

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

else

If (Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 1)

Annual NOXM Calculated Value = 0

If (OS Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 2)

OS NOXM 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 (NOXStart 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 Annual NOXM 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

else

set Annual NOXM Calculated Value to null
set OS NOXM Calculated Value to null

if (Current NOX Mass Summary Value Record is not null)

If (OS NOXM Calculated Value Value is null AND Annual NOXM Calculated Value is null AND Expected Summary
Value NOx Mass Array for this location == false)
return result K

Otherwise,

If (Current NOX Mass Summary Value Record. Y c a rTo D a t cTo t a 1 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 Record. Ozo lie S ea so nTo D ateTo ta 1 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 Record. Ozone SeasonToDateTotal is less thanO,

append "OzoneSeasonToDateTotal" to NOXM Summary Invalid Fields

If (Current NOX Mass Summary Value Record. Y earToDateTotal is not rounded to one decimal place)
append "YearToDateTotal" to Imprecise Fields


-------
If {Current NOXMass Summary Value /?ec«/Y/. OzoneSeasonToDateTotal 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. YearToDateTotal)

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. Ozone SeasonToDateTotal)

if (ABS(OS' NOXM Calculated Value - Current NOXM Summary Value

Record.OzoneSeasonToDateTotal) > 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")
return result D

else

return result H

else

return result I

// if no result

if {OS Reporting Requirement == false and Current NOXM Summary Value Record. OzoneSeasonToDateTotal is
not null)

return result G

else if {Annual Reporting Requirement == false and Current NOXM Summary Value Record. YearToDateTotal
is not null)

return result L

else if {{LME Annual is equal to true and Current NOXM Summary Value Record. YcarToDatcTotal is greater
than 100) OR {LME OS is equal to true and Current NOXM Summary Value Record. OzoneSeasonToDateTotal is
greater than 50))

return result F

else

If {Expected Summary Value NOx Mass Array for this location == false AND {OS NOXM Calculated Value > 0 OR
Annual NOXM Calculated Value > 0))
return result J


-------
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 OzoneSeasonToDateTotal
of [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


-------
Check Code:	HOURAGG-13

Check Name:	Compare NOx Rate YTD Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual and ozone-season NOx Rate with the calculated values and generates

an error message if the difference is greater than the accepted tolerance.

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 if (Quarter of the Current Reporting Period is greater than 1)

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

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.

else


-------
Set Total NOxMass to null.

If (Total NOxMass is not null AND Total HI is not null)

If (Total NOxMass == 0)

Set Annual NOXR 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 if ((Quarter of the Current Reporting Period is greater than 1)

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".
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

else

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 is null AND Expected Summary Value NOx Rate Array for this location == false)
return result H

else if (Current NOXR Summary Value	YcarToDatcTotal is null or is less thanO)

return result C

else if (Annual NOXR Calculated Value is not null)

if (Annual NOXR Calculated Value<> Current NOXR Summary Value 7?ecor
Tolerance)

return result D

// if no result

if (Current NOXR Summary Value /fecwY/.OzoncSeasonToDatcTotal is not null)
return result F

else

If (Expected Summary Value NOx Rate Array for this location == false AND Annual NOXR Calculated Value > 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


-------
Check Code:	HOURAGG-14

Check Name:	Compare Total Heat Input YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual and ozone-season heat input with the calculated values and generates

an error message if the difference is greater than the accepted tolerance.

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 for 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

If (Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 1)

Annual HI Calculated Value = 0

If (OS Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 2)

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))

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,

else


-------
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.

else

set Annual HIT Calculated Value to null
set Annual OS HIT Calculated Value to null

if (Current HI Summary Value Record is not null)

If (OS HIT Calculated Value is null AND Annual HIT Calculated Value is null AND Expected Summary Value HI
Array for this location == false and (LME HI Method <> "LTFF" or location does not start with "CP") )
return result K

Otherwise,

If (Current HI Summary V(due Record. YearToDateTotal is null and Annual Reporting Requirement == true) OR
(Current HI Summary Value Record. YearToDatcTota 1 is less than 0,
append "YearToDateTotal" to HIT Summary Invalid Fields

If (Current HI Summary Value 7?e£w
-------
If {Current HI Summary Value Record.O/.o nc Sea so 11T o DatcT ota 1 is not rounded to zero decimal places)

If {Legacy Data Evaluation == false OR Current HI Summary Value Ttecon/. 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 o 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. OzoneSeasonToDateTotal)

If {Legacy Data Evaluation == false)

if (ABS(YAV HIT Calculated Value - Current HI Summary Value

Record.O/o ne Seaso 11To DateTota 1) > Tolerance OR the quarter of the Current Reporting

Period is greater than 2)

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

else

if (ABS(YAV HIT Calculated Value - Current HI Summary Value

Record.OzoneSeasonToDateTotal rounded to the nearest integer) > 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 Record. OzoneSeasonToDateTotal is not
null)

return result G

else if {Annual Reporting Requirement == false and Current HI Summary Value Record. YearToDateTotal is not
null)

return result L

else


-------
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

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 OzoneSeasonToDateTotal
of [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


-------
Check Code:	HOURAGG-15

Check Name:	Compare Operating Time YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual and ozone-season operating time with the calculated values and

generates an error message if the difference is greater than the accepted tolerance.

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 ToleranceDeviators 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 fortius 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".

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 Record. YearToDateTotal is null and Annual Reporting Requirement == true) OR
{Current Op Time Summary Value Record. YcarToDatcTota 1 is less thanO,
append "YearToDateTotal" to OPTIME Summary Invalid Fields

If (Current Op Time Summary Value Record. Ozo lie S ca so nTo Da teTo ta 1 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
Record.OzoneSeasonToDateTotal is less thanO,

append "OzoneSeasonToDateTotal" to OPTIME Summary Invalid Fields

If (Current Op Time Summary Value Record. YearToDateTotal 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 Ttecor*/. OzoneSeasonToDateTotal)

if (ABS(YAV OPTIME Calculated Value - Current Op Time Summary Value

Record. O/o ne Seaso 11To DatcTotal) > 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 V(due Record. OzoneSeasonToDateTotal is not
null)

return result F

else if (Annual Reporting Requirement == false and Current Op Time Summary Value Record. YearToDateTotal is not
null)

return result I


-------
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 OzoneSeasonToDateTotal
of [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


-------
Check Code:

HOURAGG-16

Check Name:	Compare Operating Hours YTD and OS Values

Related Former Checks:

Applicability:	General Check

Description:	This check compares the reported annual and ozone-season operating hours with the calculated values and

generates an error message if the difference is greater than the accepted tolerance.

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 (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,

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 V(due Record. YcarToDatcTotal is null and Annual Reporting Requirement == true) OR
0Current Op Hours Summary Value Record. YearToDateTotal is less than 0,
append "YearToDateTotal" to OPHOURS Summary Invalid Fields

If (Current Op Hours Summary Value /fecwf/. 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 Hours Summary Value
Record. OzoneScasonToDateTotal is less thanO,

append "OzoneSeasonToDateTotal" to OPHOURS Summary Invalid Fields

If (Current Op Hours Summary Value Record. YearToDateTotal is not rounded to zero decimal places)
append "YearToDateTotal" to Imprecise Fields

If (Current Op Hours Summary Value Record. OzoneSeasonToDateTotal 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

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. Y carToDatcT otal)

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 (ABS(YAV OPHOURS Calculated Value - Current Op Hours Summary Value


-------
Record. Ozone Scaso nTo DatcTotal) > 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. O va ne Scaso nTo DateTota 1 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

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 OzoneSeasonToDateTotal
of [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


-------
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
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 RGGIBegin 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. Currcnt Reporting Period Total is not rounded to one decimal
place)

return result D

else

BC02 Quarterly Reported Value = Current BC02 Summary Valu e Record. C u rrc nt Reporting Period
Total


-------
Results:

Result

Response

Severity

A

You reported a Summary Value record for [param], but this value should only be
reported at the unit, not at a stack or pipe.

Critical Error Level 1

B

You reported a Summary Value record for BC02, but this location does not belong to
the RGGI program during this reporting period.

Critical Error Level 1

C

The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.

Critical Error Level 1

D

You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.

Critical Error Level 1

E

This check result is obsolete.

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation


-------
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 AnnualBC02 Calculated Value to null.

If (BC02 Quarterly Reported Value is not null)

AnnualBC02M Calculated Value = BC02 Quarterly Reported Value

else

AnnualBC02M 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 AnnualBC02 Calculated Value to null
return result A

Otherwise,

If {AnnualBC02M Calculated Value == -1)

Set AnnualBC02M Calculated Value to OpValue

else

add OpValue to AnnualBC02 Calculated Value.

If (Current BC02 Summary Value Record is not null)

If (AnnualBC02M Calculated Value = -1)

set AnnualBC02 Calculated Value to null
return result G

else if (Current BC02 Summary Value	YcarToDatcTotal is null or is less than 0)

return result B

else if (Current BC02 Summary Value Record. YearToDateTotal is not rounded to one decimal place)
return result C

else if (AnnualBC02 Calculated Value is not null)

if (AnnualBC02 Calculated Value <> Current BC02 Summary Value Ttecon/.YearToDateTotal)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"

if (ABS(AnnualHC()2 Calculated Value - CurrentBC02 Summary Value Record. YcarToDatcTotal) >
Tolerance)

return result D


-------
// If no result

If (Current BC02 Summary Value /?6'cw 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


-------
Check Category:
Hourly Appendix D


-------
Check Code:

HOURAD-1

Check Name:

Related Former Checks:

Initialize Accumulators for Appendix D Calculations

Applicability:
Description:

Appendix D Check

Set all Appendix D Accumulators to ZERO

Specifications:

HIApp D Accumulator = 0
SO2 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:

1	Process/Category: Emissions Data Evaluation Report	Appendix D/E Unit-Level Initialization


-------
Check Code:	HOURAD-3

Check Name:	Initialize Fuel Flow Record

Related Former Checks:

Applicability:	Appendix D Check

Description:	Initialization procedure for fuel flow category.
Specifications:

Current Fuel Group = Current Fuel Flow Record.Fuel Group Cd

if (Current Fuel Flow Record.UmtFuelCd in set {OGS, PRG,OOL})
Special Fuel Burned = true

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOUR AD-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 Record. Fucl U sagcTi mc is null OR Current Fuel Flow Record. Flie 1U sagcTi mc < 0 OR Current Fuel Flow
Record. F ucl U sagcTi mc > 1)

HFF Usage Time Status = false
return result A

else if (Current Hourly ()p Record.Opcrat ingTime > 0 AND Current Hourly Op /?6'ewY/.0pcrati ngTi mc <= 1)

if Current Fuel Flow Record. FuelCode is not in Fuels Used List

add 1 to Fuel Op Hours Accumulator Array for the location and fuel
append FuelCode to the Fuels Used List

if (Current Fuel Flow Record.FuelUsageTime > Current Hourly Op Ttecon/.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 (MPPipe Config for Hourly Checks is
null OR Current Hourly ()p Record. Lo c a t i o n N a mc begins with "CP") AND Current Fuel Flow Record.FuelUsageTime <>
Current Hourly Op Ttecon/.OperatingTime)

HFF Usage Time Status = false
return result B

Results:

Result
A

B

Response

The FuelUsageTime reported in the HFF record for FuelCode [fueled] is invalid. The
must be greater than 0 and less than or equal to 1.

The FuelUsageTime reported in the HFF record for FuelCode [fueled] is inconsistent
with the OperatingTime for the hour.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:
1

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOURAD-5

Check Name:

Related Former Checks:

Check Volumetric SODC Code

Applicability:
Description:

Appendix D Check

Validation checks on Volumetric SODC Code for the Current Fuel Flow Record

Specifications:

HFF SODC Status = true

If (Current Fuel Flow /?6'cwY/.SourceOfData VoluinetricCode is null)
If (Current Fuel Flow /?6'cwy/. VoluinetricFlow Rate is not null)
HFF SODC Status == false
return result A

If (Current Fuel Flow /?6'cwy/. VoluinetricFlow Rate is null)

HFF SODC Status == false
return result B

else if {Current Fuel Group == "GAS" and Current Fuel Flow /?6'«;/Y/.SourccOIT)ata VolumctricCodc in set {5, 6})
HFF SODC Status == false
return result C

else if (Current Fuel Flow /?6'cwY/.SourceOfData VoluinetricCode = "3" AND Current Unit Is Peaking == false)

HFF SODC Status == false
return result D
else if (HFF Fuel Indicator Code is not null)

if (Current Fuel Flow /?6'cwY/.SourceOfData VoluinetricCode == "4" AND HFF Fuel Indicator Code <> "E")
HFF SODC Status == false
return result E

else if (Current Fuel Flow /?6'cwY/.SourccOfDataVoluinctricCodc in set {5, 6} AND HFF Fuel Indicator CodeO "I")
HFF SODC Status == false

else

return result F

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 SourceOfDataVolumetricCode reported in the HFF record for FuelCode [fueled] is
invalid.

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 youi
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

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOUR AD-6

Check Name:

Related Former Checks:

Check Oil Mass SODC Code

Applicability:
Description:

Appendix D Check

Validation checks on Mass SODC Code for the Current Oil Fuel Flow Record

Specifications:

HFF Mass SODC Status == true

If (Current Fuel Flow Record. SowceOfDaXsMassCode is null)
If (Current Fuel Flow Record.MassFlowRate is not null)
HFF Mass SODC Status == false
return result A

If (Current Fuel Flow Record.MassFlowRate is null)

HFF Mass SODC Status == false
return result B

else if (Current Fuel Flow /fec-wrf. VolumetricFlowRate is not null AND Current Fuel Flow Record. SourceOfDataMassCode <>
"2")

HFF Mass SODC Status == false
return result C

else if (Current Fuel Flow Record. VolumetricFlowRate is null AND Current Fuel FlowRecord.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 Code<> "I")
HFF Mass SODC Status == false
return result G

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].

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 youi

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

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

Critical Error Level 1


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOUR AD-7

Check Name:	Check Fuel Flow Monitoring System

Related Former Checks:

Applicability:	Appendix D Check

Description:	Validates the Monitoring System reported in the HourlyFuelFlowData record

Specifications:

HFF System Type = null
FuelFlowComponentRecords = null
CurrentAppendixDStatus = null

f (Current Fuel Flow /?6'cw "GAS")
return result E

else if (Current Fuel Group == "OIL" AND Current Mon ,SV.v 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 ,SV.v 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. FuelCode
HFF System Fuel = Current Mon Sys Record FuelCode
return result H

else if (Current Fuel Flow Record. SourceOfDataVolumetricCode in set (0,9} OR (Current Fuel Group == "OIL"
AND Current Fuel Flow Record. SourceOfDataMassCode in set {0,9}))

if (Current Fuel Group = "OIL")

Locate MonitorSystemComponentRecordsByHourLocation where the SystemID is equal to
CurrentFuelFlowRecord. SystemID and the ComponentTypeCd = "OFFM" or "BOFF"

For each retrieved record found:


-------
If (MonitorSystemComponentRecordsByHourLocation.ComponenfTypeCd ==
"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.SystemlD 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.


-------
Results:

Result
A

B

C

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 OILV 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 OILV 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


-------
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 /?6'cwy/. VoluinetricUnitsOnvicasurcCodc is null)
If (Current Fuel Flow /?6'cwy/. VoluinetricFlow Rate is not null)
HFF UOM Status = false
return result A

If (Current Fuel Flow /?6'cwy/. VoluinetricFlow Rate is null)

HFF UOM Status = false
return result B

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record. VolumctricU nitsOflVIcasurcCodc 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	VolumctricUnitsOfTVIcasurcCodc <> "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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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. UnitFuclCd

If found,

HFF Fuel Indicator Code = Current Fuel Flow Record. I ndicatorCd

else

return result A

Results:

Result
A

You did not report an active Unit Fuel record for FuelCode [fueled] in your monitoring Critical Error Level 1
plan.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:	HOURAD-IO

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 /fec-wrf. VolumetricFlowRate is null)

If (HFF System Type<> "OILM")
return result A

else

If (HFFSystem Type == "OILM")
return result B

else if (Current Fuel Flow /?6'cwY/.SourccOfDataVoluinctricCodc == "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 greatei
thanO,

HFF Max Heat Input for Volume =

t/«iYCa/7ac%Bj//oMrZ,ocaft'o«.MaximuinHourlyHeat[nputCapacity

If (HFFGCV is not null)

If (Current Fuel Flow Record.MassFlowRate is null)

HFF Calc Volumetric Rate = HFF Max Heat Input for Volume / HFF GCV *
1000000, rounded to one decimal place.

else if (HFFDensity is not null)

HFF Calc Volumetric Rate = HFF Max Heat Input for Volume / HFF GCV /
HFF Density * 1000000, rounded to one decimal place.

else

return result M

else

If (Current Fuel Flow Record. VolumetricFlowRate <= 0)
return result E

else

HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate

else if (Current Fuel Flow /?6'cwY/.SourccOfDataVoluinctricCodc == "9"

If (Current Fuel Group == "GAS")

HFF Volumetric Default Parameter = "MNGF"

else

HFF Volumetric Default Parameter = "MNOF"

Count active Default Record for the location where

ParameterCode == HFF Volumetric Default Parameter
FuelCode == Current Fuel Flow Record .Vuc\CoAc

if (Count <> 1)

return result C


-------
else if (Defau It Record D c fa ill t V a 1 lie <= 0)
return result D

else if (Default /tecon:/. Default U nitsOfMeasureCode == Current Fuel Flow
Record. VolumetricU nitsOfMeasureCode)

HFF Calc Volumetric Rate = Default Record .DefaultValue
If (Current Fuel Flow	VolumetricFlowRate <= 0)

return result E

else if (Current Fuel Flow Record. VolumctricFlowRatc <> HFF Calc Volumetric Rate)
return result F

else

If (Current Fuel Flow	VolumetricFlowRate <= 0)

return result E

else

return result G

else if Current Fuel Flow	IVIo nito ri ngSy stc m ID is not null)

If (Current Fuel Flow	VolumetricFlowRate <= 0)

return result E

else

If (Current Fuel Flow /?6'co/Y/.SourccOfDataVolumctricCodc <> 3)

HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate

Count active System Fuel Flow Record for the system.

If (Count <> 1)

return result H

else if (System Fuel Flow Recor dMaximumFuelFlowRate <= 0)
return result I

else if (System Fuel Flow Record. SystemFuelFlowUOMCode == Current Fuel Flow
Record. VolumetricU nitsOfMeasureCode)

If (Current Fuel Flow /?6'cw HFF Calc Volumetric Rate)
return result J

else

If {HFF Calc Volumetric Rate > System Fuel Flow itecordMaximumFuelFlowRate
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


-------
Results:

Result	Response

A	You did not report a VolumetricFlowRate in the HFF record for FuelCode [fueled],

which is required when using [systype] MonitoringSystemID [ID],

B	You reported a VolumetricFlowRate in the HFF record for FuelCode [fueled], which is

invalid when using an OILM system.

C	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.

D	The DefaultValue reported in the active [parameter] default record for the hour is

invalid.

E	The VolumetricFlowRate reported in the HFF record for FuelCode [fueled] is invalid.

F	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.

G	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.

H	You did not report one and only one active SystemFuelFlow record for

MonitoringSystemID [ID] in your monitoring plan for the hour.

I	The MaximumFuelFlowRate reported in the active System Fuel Flow record for

MonitoringSystemID [ID] in your monitoring plan is invalid.

J	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.

K	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.

L	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.

M	You did not report one and only one valid active Unit Capacity record in your

monitoring plan for the unit for the hour.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow

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


-------
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 Record.MassFlowRate is null)

IF (HFF System Type== "OILM")

return result A
Else if (HFF System Type== "OILV"

IF (Current Fuel Flow Record. SourceOFDataMassCode == "2")

return result B
Else iF (Current Unit isARP == true)
return result C

else

IF (HFFSystem Type == "GAS")

return result D
elseiF (HFF System Type == "OILV")

IF (Current Fuel Flow Record. SourceOFDataMassCode == "2" AND Current Fuel Flow Record.MassFlowRate
<=0)

return result E

elseiF (Current Fuel Flow Record. SourceOFDataMassCode == "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 greatei
thanO,

HFF Max Heat Input for Mass =

t/wifCa/7ac%Bj//0Mj,Z,0cafi7w.MaximumHourlyHeatInputCapacity

IF (HFFGCV is not null)

HFF Calc Mass Oil Rate = HFF Max Heat Input for Mass / HFFGCV * 1000000,
rounded to one decimal place.

else

return result M

else

IF (Current Fuel Flow Record. MassFlow Rate <= 0)
return result E

else

HFF Calc Mass Oil Rate = Current Fuel Flow Record. MassFlow Rate

elseiF (Current Fuel Flow Record. SourceOFDataMassCode == "9")
HFF Mass Oil Default Parameter = "MNOF"

Count active Default Record For the location where

ParameterCode == HFF Mass Oil Default Parameter
FuelCode == Current Fuel Flow Record.¥uc\Co&c
iF (Count <> 1)

return result F

else iF (Defeat It Record. D c la ill t V a 1 lie <= 0 OR Default /tecwc/.DcFaultUnitsOrMcasurcCodc <> "LBHR")
return result G

else


-------
HFF CalcMass Oil Rate = Default /tecwc/. Default Value
If (Current Fuel Flow Record. MassFlowRate <= 0)
return result E

else if {Current Fuel Flow Record. MassFlowRate <>HFF CalcMass Oil Rate)
return result H

else if {Current Fuel Flow RecordMomtoxmgSystevaSD is not null)

If {Current Fuel Flow Record.MassFlowRate <= 0)
return result E

else

If {Current Fuel Flow Record.SourceOfDataMassCode <> 3)

HFF Calc Mass Oil Rate = Current Fuel Flow Record. MassFlow Rate

Count active System Fuel Flow Record for the system.

If {Count <> 1)

return result I

else if {System Fuel Flow Recor J.MaximumFuelFlowRate <= 0 OR System Fuel Flow
Record. SystemFuelFlowUOMCode <> "LBHR")
return result J

else

If {Current Fuel Flow Record. SourceOfDataMassCode == 3)

HFF Calc Mass Oil Rate = System Fuel Flow Recor J.MaximumFuelFlowRate
If {Current Fuel Flow Record. MassFlowRate <> HFF Calc Mass Oil Rate)
return result K

else

If {HFF Calc Mass Oil Rate > System Fuel Flow i?ecor
-------
Results:

Result
A

B

C

D

E
F

G

H

I
J

K

M

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Hourly FuclFlow ID AND

HourlyParamFuelFlow.ParameterCode = "DENSOIL"

If (Count >1)

return result A
Else If (Count == 0)

If (HFF System Type == "OILV" and Current Fuel Flow Ttecwrf.SourceOfDataMassCode == "2")
return result B

Else if (HFF System Type= "OILV" AND Current Fuel Flow Record. SourceOfDataMassCode == "2")

Current Density Record = matching record
Density UOM = Current Density Record. ParameterUOMCode

if (Density UOM not in set {LBGAL, LBBBL, LBM3, LBSCF})
return result C

else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D

else if (Current Fuel Flow Record VolumetricUnitsOfMeasureCode
return result D

else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D

else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode

return result D
else if {Current Density Record. Pa rain Va 1Flie 1 > 0)

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 .FuelCode

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.FuelCode,

" -Density UOM)

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.FuelCode,

" -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.FuelCode,

" -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.FuelCode,

== "GALHR" AND Density UOM <> "LBGAL")
== "BBLHR" AND Density UOM <> "LBBBL")
== "M3HR" AND Density UOM <> "LBM3")
== "SCFH" AND Density UOM <> "LBSCF")


-------
" -", Density UOM)

if {Max Allowed Density is not null AND Current Density Record. Para inValFucl > Max Allowed Density) OR
{Min Allowed Density is not null AND Current Density Record. Pa rain Va 1F lie 1  Max Expected Density)
return result F

else

else

if {Density Default == Current Density Record.ParamValFuel)
HFF Density = Current Density Record. ParamValFuel

else

return result G

else

return result H
return result I

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
Critical Error Level 2
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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

Results:

Result	Response	Severity

A	The SampleTypeCode reported in the HPFF record for DENSOIL for FuelCode [fueled] Critical Error Level 1

is missing or invalid.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Formula Identifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
IF (Current Density /?6'ew
-------
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 Record.MassFlowRate > 0)

if (ABS(Current Fuel Flow Record.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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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:

HFFGCV= null
Current GCV Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow	Hourly FuclFlow ID 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 GCV Record. Para mete rUOMCodc

if (GCVUOM not in set {BTUGAL, BTUBBL, BTUM3, BTUSCF, BTULB, BTUHSCF}
return result C

else if (Current Fuel Group == "GAS" AND GCVUOM <> "BTUHSCF")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record.MassFlowRate is not null AND GCVUOM <> "BTULB")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record. MassFlowRatc is null AND Current Fuel Flow
Record.Vo 1 u 1 lietricUnitsOHVIeasureCode == "GALHR" AND GCVUOM <> "BTUGAL")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record. MassFlow Ratc is null AND Current Fuel Flow
Record. Vo 1 u mc t ri c U n i t sO HVI c a s u rc C o dc == "BBLHR" AND GCVUOM <> "BTUBBL")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record.MassFlowRate is null AND Current Fuel Flow
Record. Vo 1 u mc t ri c U n i t sO fM ca s u rc C o dc == "M3HR" AND GCVUOM <> "BTUM3")
return result D

else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record.MassFlowRate is null AND Current Fuel Flow
Record. Vo 1 u mc t ri c U n i t sO HVI c a s u rc C o dc == "SCFH" AND GCVUOM <> "BTUSCF")

return result D
else if (Current GCV Record. Pa rain Va 1F uc 1 > 0)

GCV Default = null

If (Current G C V Record .Sample T\ pc Code == 8)

GCV Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "GCV -" + GCV UOM AND "FuelCode" column = Current Fuel Flow
Record. FuclCodc

If (GCVDefault == null)

GCV Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "GCV -" + GCV UOM and FuelCode column is null.

If (GCVDefault == 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 Record.FuelCode,

" -", 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.FuelCode,

" -", 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.FuelCode,

" -", 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.FuelCode,

" -", GCVUOM)

if (Max Allowed GCV is not null AND Current GCVRecord .ParamValFuel > Max Allowed GCV) OR (Min
Allowed GCV is not null AND Current GCV Record. ParamValFuel < Min Allowed GCV)
return result E

else if (Current GCV Record. Pa ra in ValFuel is not rounded to one decimal place)
return result J

else

HFF GCV = Current GCV Record. Param Val Fuel

if (Min Expected GCV is not null AND HFF GCV < Min Expected GCV) OR (Max Expected GCV is not
null AND HFF GCV > Max Expected GCV)
return result F

If (Current GCV Record. Pa ra in Val Fuel is not rounded to one decimal place)
return result J

else if (GCV Default == Current GCV Record. Pa ra in ValFuel)

HFF GCV = Current GCV Record. Param Val Fuel

else

return result G

else

return result H

else

return result I


-------
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


-------
Check Code:

HOURAD-17

Check Name:

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 C/C.'K/?6'cwY/.SainplcTypcCodc not in {1, 2, 5, 6, 7, 8})
return result A

else if (Current Fuel Group == "GAS" AND Current GCVRecord.Samp 1 cTypcCodc 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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 GC K	. Fo rm u 1 a I dc n t i fic r is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
IF (Current f/Y.'K	. Mo nito ri ngSy stcm ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF (Current GCVTtecon/.SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF (Current GCV Record. O pc ra t i ngCo ndi t io nCode is not null)

append "OperatingConditionCode" 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 GCV For FuelCode [Fueled]. This
data should be blank.

Severity

Non-Critical Error

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 /?6'cwy/.Hourly FuclFlow ID AND
HourlyParamFuelFlow.ParameterCode = "HI"

If (Count >1)

HI App 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 Record. MonitoringFormulald is null
return result C

else

Cur HIMon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current HI HPFF Record.MomtoringFormulalD

if (Cur HIMon Formula Record is null)
return result D

else if (Cur HIMon Formula Record. ParamctcrCodc <> "HI")

return result E
else if (Current Fuel Group == "GAS")

If (Cur HIMon Formula Record.EquationCodc not in set {D-6, F-20})
return result F

else if (Current Fuel Flow Record. MassFlowRate is not null)

If (Cur HIMon Formula Record.EquationCode not in set {D-8, F-19})
return result F

else

If {Cur HIMon Formula Record.EquationCode <> "F-19V")
return result F

else

return result G


-------
Results:

Result	Response	Severity

A	You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the Critical Error Level 1

hour.

B	You did not report an HPFF record for [parameter] for FuelCode [fueled] for the hour. Critical Error Level 1

C	You did not report a FormulalD in the HPFF record for HI for FuelCode [fueled].	Critical Error Level 1

D	You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but Critical Error Level 1

there is no active Formula record for this formula in your monitoring plan.

E	You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but this Critical Error Level 1

is not an HI formula.

F	The FormulaCode of FormulalD [ID] reported in the HPFF record for HI for FuelCode Critical Error Level 1

[fueled] is invalid.

G	You reported an HPFF record for GCV for FuelCode [fueled], but you have not reported Critical Error Level 1

an HPFF record for HI for the hour.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 Record. MomtoringSystemlD is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF (Current HI HPFF Record. SegmsntNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF (Current HI HPFF Record .0\~>cn\{\ngCondit ionCodc 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

You reported [Fieldnames] in the HPFF record For HI For FuelCode [Fueled]. This data Non-Critical Error
should be blank.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOUR AD-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 Record. SourceOfDataVolumetricCode == "4")
if {HFF Max Heat Input for Volume is not null)

HFF Calc HI Rate = HFF Max Heat Input for Volume

else

HIApp D Accumulator = -1
return result A

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 {HFFGCV 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 Record.MassFlowRate 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.

else

HI App D Accumulator = -1
return result A

else

if {HFF Calc Mass Oil Rate is not null)

HFF Calc HI Rate = HFF Calc Mass Oil Rate * HFF GCV / 1000000, and round the result to one
decimal place.

else

HI App D Accumulator = -1
return result A

If {HFF Calc HI Rate is not null)

If Current Fuel Flow Record.FuelUsageTime > 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
HIApp D Accumulator = HIApp D Accumulator + HFF Calc HI Rate * Current Fuel Flow
Record. FuelUsageTime

else

HIApp D Accumulator = -1


-------
If (Current HI HPFF Record. Pa rain ValFucl > 0)

If {Current Fuel Flow Record. SourceOfDataVolumetricCode == "4" OR Current Fuel Flow
wy/ . S o u rc c O ID a t a IVI a s s C o dc == "4")

if (HFF Calc HI Rate is equal to Current HI HPFF Record. P a ra m Va 1F lie 1)

if (Current Fuel Flow /?6'cwY/.SourccOfDataVoluinctricCodc == "4")

If (Current Fuel Flow /?6'cwy/. VoluinctricFlow Ratc is greater than 0, AND
HFF Calc Volumetric Rate is not equal to Current Fuel Flow
Record. Vo 1 u mc t ri c F1 o w R a t c)

Flow Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions
Tolerances" where Parameter = "FOIL"

if (ABS{HFF Calc Volumetric Rate - Current Fuel Flow
Record. Vol tunc trie Flow Rate) > Flow Tolerance)
return result C

else

If {Current Fuel Flow Record. IVIassF1 owRatc is greater than 0, AND

HFF Calc Mass Oil Rate is not equal to Current Fuel Flow	. IVI ass F1 o w Ra t c)

Flow Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions
Tolerances" where Parameter = "FOIL"

if (ABS{HFF Calc Mass Oil Rate - Current Fuel Flow Ttecon/.MassFlowRate)

> Flow Tolerance)

return result D

else

If (ABS( HFF Calc HI Rate - Current HI HPFF Record. Pa rain ValFucl) > HI HPFF Tolerance)
return result B

else

HIApp D Accumulator = -1
return result A

Results:

Result	Response	Severity

A	The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode [fueled] Informational Message

could not be recalculated due to errors listed above.

B	The ParameterValueForFuel reported in the HPFF record for HI for FuelCode [fueled] Critical Error Level 1

is inconsistent with the recalculated value.

C	You reported a SourceOfDataVolumetricCode of 4, indicating that you burned an	Critical Error Level 1

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.

D	You reported a SourceOfDataMassCode of 4, indicating that you burned an emergency Critical Error Level 1

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.


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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. FaramValFuel >= 0

IF (Current HI HPFF Record. Para in ValFuel is not rounded to one decimal place)
return result D

elseiF (Current Fuel Flow Record. SourceOfDataYolumstricCode == "4" and HFFMax Heat Input for Volume is not
null)

iF (Current HI HPFF Record. Pa ram Va 1F lie 1 is not equal to HFF Max Heat Input for Volume)
return result E

elseiF (Current Fuel Flow Record. SourceOfDataMassCode == "4" and HFF Max Heat Input for Mass is not null)
iF (Current HI HPFF Record. Pa ram Va 1F lie 1 is not equal to HFF Max Heat Inputfor Mass)
return result F

else

IF Current Entity Type == "CP",

Count active UnitCapacity record For each unit linked to the pipe
iF (Count <> 1 For any unit)
return result A

else

Calculate Max Heat Input as the sum oF Unit Capacity
itecorJ.MaximumHourlyHeatlnputCapacity For all units.

Count active UnitCapacity record For the associated unit.
iF (Count <> 1)

return result A

else

Max Heat Input = Unit Capacity itecordMaximumHourlyHeatlnputCapacity

iF Current HI HPFF Record. ParamValFuel > Unit Capacity itecor(i.MaximumHourlyHeatlnputCapacity
return result B

else

else

return result C


-------
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


-------
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)

ff (Current HI HPFF Record. ParamctcrUOMCodc <> "MMBTUHR")
return result A

Results:

Result	Response	Severity

A	The ParameterUOMCode reported in the HPFF record for HI for FuelCode [fueled] is Critical Error Level 1

missing or invalid. The value should be "MMBTUHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Hourly FuclFlow ID 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 (S()2 App D Method Active For Hour == true)

Current S02 HPFF Record = matching record

if {Current S02 HPFF	Mo ni to ri ng Fo rmu 1 a I d is null

return result C

else

Cur S02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current S02 HPFF	Mo ni to ri ngFo rmu 1 a ID

if (Cur S02 Mon Formula Record is null)
return result D

else if {Cur S02 Mon Formula Record.ParameterCode <> "S02")

return result E
else if {Current Fuel Group == "GAS")

If {Cur S02 Mon Formula Record.EquationCode in set {D-4, D-5})

HFF S02 Equation Code = Cur S02 Mon Formula Record.EquationCode

else

return result F

else

If {Cur S02 Mon Formula Record .EquationCode == "D-2")

HFF S02 Equation Code = Cur S02 Mon Formula Recor^.EquationCode

else

return result F

else

return result G


-------
Results:

Result	Response	Severity

A	You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the Critical Error Level 1

hour.

B	You did not report an HPFF record for [parameter] for FuelCode [fueled] for the hour.	Critical Error Level 1

C	You did not report a FormulalD in the HPFF record for S02 for FuelCode [fueled].	Critical Error Level 1

D	You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but	Critical Error Level 1

there is no active Formula record for this formula in your monitoring plan.

E	You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but	Critical Error Level 1

this is not an S02 formula.

F	The FormulaCode of FormulalD [ID] reported in the HPFF record for S02 for	Critical Error Level 1

FuelCode [fueled] is invalid.

G	You reported an HPFF record for S02 for FuelCode [fueled], but you do not have an	Critical Error Level 1

active Appendix D S02 method for the hour.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 /?6'cmy/. IVIo nito ri ngSy stc m ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF {Current S02 HPFF Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF {Current S02 HPFF Record.Opc rat i ngCo ndit ionCodc is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
IF {Current S02 HPFF Record. SampleT\ pc Code is not null)

append "SampleTypeCode" to Hourly Extraneous Fields

IF {Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

You reported [Fieldnames] in the HPFF record For S02 For FuelCode [Fueled]. This data Non-Critical Error
should be blank.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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)

ff (Current S02 HPFF Record.Pi\mmc{cr{iOMCoAc <> "LBHR")
return result A

Results:

Result	Response	Severity

A	The ParameterUOMCode reported in the HPFF record for S02 for FuelCode [fueled] is Critical Error Level 1

missing or invalid. The value should be "LBHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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:

HFFCalcS02 = null

If {Current S02 HPFFRecord is not null)

if (Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-4" AND HFFSulfur is not null AND HFF Calc
Volumetric Rate is not null

SO 2 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

SO 2 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

SO2 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
S02 App D Accumulator = S02 App D Accumulator + HFF Calc S02 * Current Fuel Flow
Record. F lie 1U sagcTi mc

else

S02 App D Accumulator = -1

If (Current S02 HPFF Record. ParamValFuel >= 0)

if (ABS (HFF Calc S02 - Current S02 HPFF Record. P a ra m Va 1F uc 1) > S02 HPFF Tolerance)
return result A

else

SO2 App D Accumulator = -1
return result B


-------
Results:

Result	Response	Severity

A	The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode [fueled] Critical Error Level 1

is inconsistent with the recalculated value.

B	The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode [fueled] Informational Message

could not be recalculated due to errors listed above.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Hourly FuclFlow ID 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 Record.ParameterUOMCode

If (Current Fuel Group == "GAS" AND Sulfur UOM <> "GRHSCF")
return result C

else if (Current Fuel Group == "OIL" AND Sulfur UOM <> "PCT")

return result C
else if (Current Sulfur Record. Pa ra m Va 1Flie 1 > 0)

Sulfur Default = null
If (Sulfur UOM == "GRHSCF")

Sulfur Precision = 1

else

Sulfur Precision = 4

If (Current Sulfur Record. SampleTypeCode == 8)

Sulfur Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "SULFUR" AND "FuelCode" column = Current Fuel Flow
Record .FuelCode

If (Sulfur Default == null)

Max Expected Sulfur = Lookup "Upper Value" in "Fuel Flow Warning Levels for Sulfur Content Cross Check
Table"

where "Fuel Code" column = Current Fuel Flow Record.FuelCode
Min Expected Sulfur = Lookup "Lower Value" in "Fuel Flow Warning Levels for Sulfur Content Cross Check
Table"

where "Fuel Code" column = Current Fuel Flow Record.¥uc\CoAc
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.¥uc\CoAc
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.¥uc\CoAc


-------
If {Max Allowed Sulfur is not null AND Current Sulfur Record.ParamValFuel > 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 Record. Parain ValFuel is not rounded to Sulfur Precision)
return result I

else

HFF Sulfur = Current Sulfur Record.ParamValFuel

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

If {Current Sulfur Record. P a ra in ValFuel is not rounded to Sulfur Precision)
return result I

else if Sulfur Default == Current Sulfur Record.ParamValFuel
HFF Sulfur == Current Sulfur Record. ParamValFuel

else

return result F

else

return result G

else

return result H

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 reported a formula with a FormulaCode of [code] in the HPFF record for S02 for
FuelCode [fueled], but you did not report an HPFF record for SULFUR. Use of this
formula to calculate S02 requires the reporting of the fuel's sulfur content.
The ParameterUOMCode reported in the HPFF record for SULFUR 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 [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 you do not
require this value to calculate S02.

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 2
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


-------
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 Su//m/*	. Fo rmu 1 a I dc n t i fic r is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If (Current Sulfur Record. IVTo ni to ri ngSy stem ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current Sulfur Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
If (Current SuIfur Record.Opcrati ngCondi tio nCode is not null)

append "OperatingConditionCode" 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 SULFUR for FuelCode [fueled].
This data should be blank.

Severity

Non-Critical Error

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOURAD-30

Check Name:

Related Former Checks:

Check Sulfur Sample Type

Applicability:

Description:

Specifications:

Appendix D Check

If {Current Sulfur Record is not null)

If (Current Fuel Group == "OIL" AND Current Sulfur Record.SampleTypeCode 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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Hourly FuclFlow ID 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 S()2RflecwY/.ParamctcrUOIVICodc <> "LBMMBTU"}

return result C
else if (Current S()2R Record. Para m Va 1Fuc 1 > 0)

HFF S02 Emission Rate = Current S02R Record. Pa ra m Va 1Flie 1

else

return result D

else

return result E
Results:

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
require this value to calculate S02.

Result	Response

A	You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the

hour.

B	You reported a formula with a FormulaCode of "D-5" in the HPFF record for S02 for

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 [fueled]

is missing or invalid. The value should be "LBMMBTU".

D	The ParameterValueForFuel reported in the HPFF record for [parameter] for 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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 Record. Mo ni to ri ngSy stem ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF (Current S()2R/?6'cwY/.ScgmcntNumbcr is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF {Current S02R Ttecon/.OperatingConditionCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
IF {Current S02R 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 S02R For FuelCode [Fueled]. This
data should be blank.

Severity

Non-Critical Error

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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/?6'cwY/.FonnulaIdcntiricr is null)

IF {Current Fuel Flow Record.FuelCode <> "PNG" OR Current S02RRecord.FammVaWuel <> 0.0006)
return result A

else

Cur S02R Mon Formula Record = Lookup active Formula in MonitoringFormula Table where
MonitoringFormulalD = Current S02R Record. MonitoringFormulalD

iF {Cur S02R Mon Formula Record is null)
return result B

else iF {Cur S02R Mon Formula Record.ParameterCode <> "S02R"
return result C

else iF {Cur S02R Mon Formula Record. EquationCodc <> "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


-------
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. ParamValFuel is null or is less thanO
return result A

else if {Current Fuel Group == "OIL" AND Current S02 HPFF Record. ParamValFuel is not rounded to one decimal place)
return result B

Results:

Result
A

B

Response	Seventy

The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode [fueled] Critical Error Level 1

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 Critical Error Level 1
appropriate precision for that parameter.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	Hourly FuclFlow ID 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 <> "SCFCBTU")

return result C
else if (Current Fc Factor Record. Pa rain Va 1F lie 1 >0)

if (Current FcFactor Record. Pa rain Va 1F uc 1 is not rounded to one decimal place)
return result G

else

HFF Fc Factor = Current Fc Factor Record. Pa ram Va 1F lie 1

Max Allowed Fc Factor = Lookup "Upper Value" in "Fuel Type Reality Checks for FC Factor Cross Check Table"

where "FuelType" column = Current Fuel Group
Min Allowed Fc Factor = Lookup "Lower Value" in "Fuel Type Reality Checks for FC Factor Cross Check Table"
where "FuelType" column = Current Fuel Group

If (Max Allowed FcFactor is not null AND Current Fc Factor Record.ParamValFuel > Max Allowed Fc Factor)
OR (Min Allowed FcFactor is not null AND Current Fc Factor Record. Param Va 1Flie 1 < Min Allowed Fc Factor)
return result D

else

return result E

else

return result F


-------
Results:

Result	Response	Severity

A	You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the Critical Error Level 1

hour.

B	You reported an HPFF record for C02 for FuelCode [fueled], but you did not report an Critical Error Level 1

HPFF record for FC for the hour.

C	The ParameterUOMCode reported in the HPFF record for FC for FuelCode [fueled] is Critical Error Level 1

missing or invalid.

D	The ParameterValueForFuel reported in the HPFF record for [parameter] for FuelCode Critical Error Level 1

[fueled] is outside the range of allowable values for the fuel type.

E	The ParameterValueForFuel reported in the HPFF record for FC for FuelCode [fueled] Critical Error Level 1

is invalid.

F	You reported an HPFF record for FC for FuelCode [fueled], but you have not reported Critical Error Level 1

an HPFF record for C02 for the hour.

G	You reported [fieldname] in the [type] record for [param] that is not rounded to the Critical Error Level 1

appropriate precision for that parameter.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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	. Fo rmu 1 a I dc n t i fic r is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
IF (Current Fc Factor Ttecon/.MonitoringSystemID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF (Current Fc Factor Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF (Current Fc Factor /?6'ewY/.OpcratingConditionCodc is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
IF {Current Fc Factor Record. SampleTypeCode is not null)

append "SampleTypeCode" to Hourly Extraneous Fields

IF (Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

You reported [Fieldnames] in the HPFF record For FC For FuelCode [Fueled]. This data Non-Critical Error
should be blank.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOURAD-37

Check Name:	Validate C02 Record

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

Current C02 HPFFRecord = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow /?6'cwy/.Hourly FuclFlow ID AND
HourlyParamFuelFlow.ParameterCode = "C02"

If (Count >1)

CO2 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 (CO 2 App D Method Active For Hour == true)

Current CO 2 HPFF Record = matching record

if (Current C02 HPFF Record. IVI o ni to ri ng Fo rmu laid is null
return result C

else

Cur C02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current C02 HPFF	M o n i t o ri ng Fo rm u 1 a ID

if (Cur C02 Mon Formula Record is null)
return result D

else if (Cur C02 Mon Formula i?ecor "C02")
return result E

else if (Cur C02 Mon Formula i?ecor "G-4")
return result F

else

return result G


-------
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


-------
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 HPFFRecord is not null)

IF (Current C02 HPFF Record. IVTo ni to ri ngSy stem ID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
IF (Current C02 HPFF Record. Scgmc ntNumbc r is not null)

append "SegmentNumber" to Hourly Extraneous Fields
IF (Current C02 HPFF Record. O pc ra t i ngCo ndi t i o nCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
IF (Current C02 HPFF Record. S a mp 1 cTy pc Code 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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 = Wl\\

If (Current C02 HPFFRecord is not null)

if (HFF Calc HI Rate is not null AND HFF Fc Factor is not null)

C02 HPFF 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 Record.FuelUsageTime > 0 AND Current Fuel Flow Record.FuelUsageTime <= 1 AND CO2 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
Record. FuelU sageT ime

else

CO2 App D Accumulator = -1

If (Current C02 HPFF Record. Pa ra m Va 1Flie 1 >= 0)

if (ABS (HFF Calc C02 - Current C02 HPFF Record. P a ra m Va 1F lie 1) > 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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:

HOURAD-40

Check Name:

Check Reported C02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Description:

Specifications:

If (Current C02 HPFFRecord is not null)

IF (Current C02 HPFF Record. Pa ra inValFuel is null or is less than 0
return result A

else if (Current C02 HPFF Record. Pa ra inValFuel 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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:	HOURAD-44

Check Name:	Check C02 Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Description:

Specifications:

If (Current C02 HPFFRecord is not null)

ff (Current C02 HPFF Record.?c\n\mc.icx\]OMCo&c <> "TNHR")
return result A

Results:

Result	Response	Severity

A	The ParameterUOMCode reported in the HPFF record for C02 for FuelCode [fueled] is Critical Error Level 1

missing or invalid. The value should be "TNHR".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 Record. SourceOfDataVolumstricCode i:
set {4, 5, 6} OR Monitor Measure Code Array for "FF" =="OTHER")

set Monitor Measure Code Array for "FF" to "OTHER"
else if (Current Fuel Flow Record. SourceOfDataMassCode in set {1, 3} OR Current Fuel Flow Record.SourceOfDataVolumstricCode
set {1, 3})

if (Monitor Measure Code Array for "FF" begins with "MEAS")

set Monitor Measure Code Array for "FF" to "MEASSUB"

else

set Monitor Measure Code Array for "FF" to "SUB"
else if (Current Fuel Flow Record. SourceOfDataMassCode in set {0, 9} OR Current Fuel Flow Record. SourceOfData Vo 1 ulliet ricCode

set {0, 9}))

if (Monitor Measure Code Array for "FF" contains "SUB")

set Monitor Measure Code Array for "FF" to "MEASSUB"

else

set Monitor Measure Code Array for "FF" to "MEASURE"

if (Current Sulfur Record is not null)

if (Current Sulfur Record. SampleTypeCode == 8)

if (Monitor Measure Code Array for "SULFUR" begins with "MEAS")

set Monitor Measure Code Array for "SULFUR" to "MEASSUB"

else

set Monitor Measure Code Array for "SULFUR" to "SUB"
else if (Current Sulfur Record.SampleTypeCode in set {0, I, 2, 4, 5, 6, 7})
if (Monitor Measure Code Array for "SULFUR" contains "SUB")

set Monitor Measure Code Array for "SULFUR" to "MEASSUB"

else

set Monitor Measure Code Array for "SULFUR" to "MEASURE"

if (Current GC V Record is not null)

if (Current GC VRecord. SampleTypeCode == 8)

if (Monitor Measure Code Array for "GCV" begins with "MEAS")

set Monitor Measure Code Array for "GCV" to "MEASSUB"

else

set Monitor Measure Code Array for "GCV" to "SUB"
else if (Current GCV Record. SampleTypeCode in set {0, 1, 2, 3, 4, 5, 6, 7})
if (Monitor Measure Code Array for "GCV" contains "SUB")

set Monitor Measure Code Array for "GCV" to "MEASSUB"

else

set Monitor Measure Code Array for "GCV" to "MEASURE"

if (Current Density Record is not null)

if (Current Density Record. SampleTypeCode == 8)

if (Monitor Measure Code Array for "DENSITY" begins with "MEAS")

set Monitor Measure Code Array for "DENSITY" to "MEASSUB"

else

set Monitor Measure Code Array for "DENSITY" to "SUB"
else if (CurrentDensity 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:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Category:
Hourly Appendix E


-------
Check Code:	HOURAE-1

Check Name:	Initialize AE Reporting Method

Related Former Checks:

Applicability:	Appendix E Check

Description:	Determines whether Appendix E Reporting is from a single fuel source, multiple fuel sources, or a Constant Mix

Fuel Source

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 {Current NOx Rate Method Code == "AE")

Total Fuel Sources = Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor 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


-------
Check Code:

HOURAE-2

Check Name:	Validate NOXR Record

Related Former Checks:

Applicability:	Appendix E Check

Description:	Locates the appropriate NOXR HourlyParamFuelFlow record for current fuel flow record

Specifications:

Current App E NOXR Record = null

App E NOXR HPFF Count for Gas = find matching HourlyParamFuelFlow records where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow	Hourly FuclFlow ID 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 Record. SegmentNumber
App E Reported Value = Current App E NOXR Record. Pa ra m Va 1Flie 1
App E Calc HI = HFF Calc HI Rate
App E Fuel Code = Current Fuel Flow Record. FlieICodc

if Current Appe E NOXR /?6'ewY/.OpcratingConditionCodc in set {E, X, Y, Z, U, W, N, M}

App E Op Code = Current App E NOXR Record. Opc ra t i ngC'o nditio nCodc

else

App E Op Code = null
return result C

else if (App E Reporting Method == "CONSTANT")
return result D

else

return result E


-------
Results:

Result	Response	Severity

A	You did not report an HPFF record for NOXR to report the NOx emission rate for Critical Error Level 1

individual fuels.

B	You reported more than one HPFF record for NOXR for FuelCode [fueled] for the hour. Critical Error Level 1

C	The OperatingConditionCode reported in the HPFF record for NOXR for FuelCode Critical Error Level 1

[FUELCD] is missing or invalid.

D	You reported an HPFF record for NOXR, but, according to your monitoring plan, you Critical Error Level 1

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.

E	You reported an HPFF record for NOXR, but you have not defined a NOXR AE method Critical Error Level 1

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.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 Record. SampleT\ pcCode is not NULL)
append "SampleTypeCode" to Hourly Extraneous Fields

if {Current App E NOXR	. Mo ni to ri ngFo rmu 1 a Id is not NULL)

append "MonitoringFormulalD" to Hourly Extraneous Fields

If {Hourly Extraneous Fields is not null)
return result A

Results:

Result
A

You reported [fieldnames] in the HPFF record for NOXR for FuelCode [fueled]. This Non-Critical Error
data should be blank.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:	HOURAE-5

Check Name:	Check Monitoring System Data for Appendix E NOXR

Related Former Checks:

Applicability:	Appendix E Check

Description:	Verifies whether monitoring system reported for Appendix E NOXR meets the reporting requirements
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	IVIo nito ri ngSystc m Id is null)

if (Current App E NOXR /?6'ewY/.0]xratingConditionCodc == "E")
if {HFF Fuel Indicator Code <> "E")
return result A

else

return result B
// report Monitoring System in all other cases
else

Current App E NOXR Mon Sys Record = find MonitoringSystem record where

MonitoringSystem.MonitoringSystemld = Current App E NOXR Record .MonitoringSystemld

if {Current App E NOXR Mon Sys Record is null)
return result C

else if {Current App E NOXR Mon Sys Record. SystemTypeCode <> "NOXE"
return result D

else if {Current App E NOXR Mon Sys Record.FuelCode <> Current Fuel Flow Record.FuelCode
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. Systemldentifier

Results:

Result
A

B

C

D

E

Response	Severity

The OperatingConditionCode of E reported in the HPFF record for NOXR for FuelCode Critical Error Level 1
[fueled] indicates that the fuel is an emergency fuel, but this is inconsistent with the
IndicatorCode in the UnitFuel record for the fuel.

You did not report a MonitoringSystemID in the HPFF record for NOXR for FuelCode Critical Error Level 1
[fueled], but you did not report an OperatingConditionCode of E. You must report a
NOXE MonitoringSystemID for non-emergency fuels.

You reported MonitoringSystemID [ID] in the HPFF record for NOXR for FuelCode
[fueled], but there is no MonitorSystem record for this system in your monitoring plan
that was active during the hour.

You reported MonitoringSystemID [ID] in the HPFF record for NOXR for FuelCode
[fueled], but this system is not a NOXE monitoring system.

You reported NOXE MonitoringSystemID [ID] in the HPFF record for NOXR, but the
FuelCode of this system is not equal to FuelCode [fueled] in the associated HFF record.

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
Check Code:	HOURAE-7

Check Name:	Retrieve Appendix E Correlation Test Results or Default Value

Related Former Checks:

Applicability:	Appendix E Check

Description:	Finds most recent successful test results for Appendix E Tests in QASupplementalData or TestSummary

Records

Specifications:

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

QASuppAttribute.QASuppDatald = Prior Appendix E /?6'ewY/.QASuppDataId
QASuppAttribute. AttributeName = "SEGMENTCOUNT"

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 App E 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.QASwppDatald
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. AttributeValue

App E Correlation NOx Rate Array[X] = QA Supp Attribute Segment NOx Record .Attribute Value

QA Supp Attribute Segment HI Record = matching record in QASuppAttribute where
QASuppAttribute.QASuppDatald = Prior Appendix E Record.QASwppDatald
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 Array[X\ = QA Supp Attribute Segment HI Record. Attribute Value

else if (App E Op Code in set {E, M, U} )

Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code

if (Count <> 1)

return result A

else

App E NOx MER Default Record = matching record
If (App E NOx MER Default Record.DefaultValue > 0


-------
App E NOx MER = App E NOxMER Default Record. Default Value

else

return result B

Results:

Result	Response	Severity

A	The NOx emission rate could not be determined, because you did not report one and Critical Error Level 1

only one missing data default record for NORX for FuelCode [fueled] in your
monitoring plan that was active during current hour.

B	The NOx emission rate could not be determined, because the DefaultValue in the	Critical Error Level 1

NORX default record for FuelCode [fueled] is invalid.

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


-------
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] <> 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)

/= 1

while (i <= App E Segment Total AND App EC 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 Array[i])

App E Calc Segment Num = i

if (App E Op Code == "Z")

if (App E Calc Segment Num <> 1)

return result C
else if App E Segment Number is null

if (Legacy Data Evaluation == false)
return result G
else if (App E Segment Number <> 1)
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 Array[i])


-------
if (App E Segment Number <> App E Calc Segment Nam AND App E Segment
Number <> App E Calc Segment Num +1)
return result E

else

if (App E Segment Number <> App E Calc Segment Num)
return result E

else

return result F

Results:

Result
A

B

C

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

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


-------
Check Code:	HOURAE-9

Check Name:	Calculate Appendix E NOx Rate

Related Former Checks:

Applicability:	Appendix E Check

Description:	For Appendix E data that was extrapolated to the piecewise linear curve under conditions where the Operating

Condition Code was reported as ""Y", this check ensures that the reported value matches the calculated value
based on heat input.

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 SegmentNum== 1)

App E Calculated NOx Rate for Source = App E Correlation NOx Rate Array[l\

else

y2 = App E Correlation NOx Rate Array[App E Calc Segment Num\
x2 = App E Correlation Heat Input Array[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 Array[App E Calc Segment Num - 1]

slope = (y2 - yl) / (x2 - xl)

App E Calculated NOx Rate for Source = slope * (App E Calc HI - xl) + 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

Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code

if (Count <> 1)

return result A

else

NOx MER Default Record = matching record
If (NOx MER DefaultRecord.DefaultValxie > 0)

If (App E Reported Value>= NOx MER Default Record. DefaultValue)

App E Calculated NOx Rate for Source = App E Reported Value


-------
else

if {AppE Reporting Method == "CONSTANT" or "APPORTIONED")
return result B

else

NOXRApp E Accumulator = -1
return result C

else

if {AppE Reporting Method == "CONSTANT" or "APPORTIONED")
return result D

else

NOXRApp EAccumulator = -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 for 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 ABS(App E Calculated NOx Rate for Source - App E Reported Value) > NOXR
HPFF Tolerance)

return result E

If Current Fuel Flow Record.FuelUsageTime > 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	FuelUsageTime * App E Calc HI)

else

NOXR App E Accumulator = -1

if (App E Reported Value >= 0 AND ABS(App E Calculated NOx Rate for Source - App E Reported Value) > NOXR
HPFF Tolerance)

return result F

else

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

Results:

Result
A

B

C

D

E
F
G
H

Usage:

1

2

3

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Informational Message

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


-------
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 Record.ParainValFuel is null or is less than 0
return result A

else iF (Current App E NOXR Record.ParamValFuel is not rounded to three decimal places)
return result B

Results:

Result
A

Response

The ParameterValueForFuel reported in the HPFF record For NOXR 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

B

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 Record .ParameterUOMCode <> "LBMMBTU")
return result A

Results:

Result	Response	Severity

A	The ParameterUOMCode reported in the HPFF record for NOXR for FuelCode [fueled] Critical Error Level 1

is missing or invalid. The value should be "LBMMBTU".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hourly Fuel Flow


-------
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 (App E Op Code = "E" or Monitor Measure Code Array for "NOXR" =="OTHER")

set Monitor Measure Code Array for "NOXR" to "OTHER"
else if (App E 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 "MEAS SUB"

else

set Monitor Measure Code Array for "NOXR" to "SUB"
else if (App E 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


-------
Check Category:
Hourly Apportionment


-------
Check Code:

HOURAPP-1

Check Name:

Determine Monitoring Plan Configuration

Related Former Checks: HOUROP-28

Applicability:
Description:

CEM Check

Determines whether the current MP is a Common Stack, Multistack, or simple Unit

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

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

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 NOXMethod 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

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 MonitorLocation 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 (StackPipe Unit 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

if (CS Count == 1)

CS Unit Count = Stack Unit Count

else if (A loniiorLocaiion. 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

add 1 to Unit Count

if (Unit Count == 1)

Unit MS Count = number of UnitStackConfiguration records where
UnitStackConfiguration .BeginDate <= Current Date AND
UnitStackConfiguration .EndDate >= Current Date AND
UnitStackConfiguration.UmtlD = 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


-------
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. StackPipc 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 Config for Hourly Checks == "CP" AND CP Fuel Count >1)

Apportionment HI Method Array for the location == "NOCALC"

If {Apportionment Op Time Array for the location > 0 AND Apportionment Op Time Array for the location <= 1)

// F-25

If {MP Stack Config for 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 for 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 StackLoadTimesOpTime Accumulator > 0 AND Unit
LoadTimesOpTime Accumulator > 0 AND abs{Stack LoadTimesOpTime Accumulator - Unit
LoadTimesOpTime Accumulator) >= number of items in the Apportionment OpTime Array)
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 for 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 MP Load UOM <> "INVALID"

if {{MP Pipe Config for Hourly Checks <> "CP" AND MP Stack Config for Hourly Checks == "CS"
AND StackLoadTimesOpTime Accumulator > 0 AND Unit LoadTimesOpTime 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 Config for Hourly Checks == "CP" OR MP
Pipe Config for Hourly Checks == "MULTIPLE") AND Apportionment HI Method Array for the location <>
"COMPLEX")

if {Apportionment NOXMethod 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")

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 for the location > Stack OpTime Accumulator
return result E

else if (Current Entity Type <>"Unit" AND Apportionment OpTime Array for 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 <> "INVALID" and MP Unit Load > 0 AND Apportionment Load Array for
the location > 0)

if {MP Unit Load o Apportionment Load Array for the location)
return result F

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


-------
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
App E 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

// F-25

IF {MP Stack Configfor 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 Apportionment Record. Ad) ustedHourly Value >= 0 AND ABS(Current HI Apportionment
Record. Ad) ustedHourly Value - HI Calculated Apportioned Value) > Heat Input Tolerance)
return result A

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

Parameter = "HI" AND
UOM = "MMBTUHR"

else

Calculate Apportioned HI = False


-------
else if {Current HI Entity Type<> "Unit")

If {Calculate Apportioned HI == true AND Current HI Apportionment Record. Adj ustedHourly Value >= 0)

HI Calculated Apportioned Value = Current HI Apportionment Record .AdjustedHourly 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 <> 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 Configfor Hourly Checks == "CS" OR MP Pipe Config for Hourly Checks == "CP") AND
(Apportionment HI Method Array for the location not in set {NOCALC, COMPLEX})

If (Apportionment NOXR Method Array for the location = "AE")

App E Checks Needed = true

If {Calculate Apportioned HI == true)

if {Unit LoadTimesOpTime Accumulator > 0 OR Current HI Apportionment	AdjustedHourly Value >=

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.

else

HI Calculated Apportioned Value = Current HI Apportionment Record .AdjustedHourlyValue

HI Calculated Apportioned Value = HI Calculated Apportioned Value + Apportionment Calc HI Array
for this Location

if {Current Month is not April OR Annua! 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	AdjustedHourly Value >= 0 AND ABS {Current HI

Apportionment Record. Adj us tcdHourly Va 1 lie - HI Calculated Apportioned Value) > Heat Input


-------
Tolerance)

return result A

else if {Apportionment Op Time 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

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

// Cannot apporition or Complex configuration

else if {MP Stack Configfor Hourly Checks begins with "CS" OR MP Stack Configfor Hourly Checks == "COMPLEX" OR MP
Pipe Config for Hourly Checks in set {CP, MULTIPLE})

If (Apportionment NOXR Method Array for the location = "AE")

App E Checks Needed = true

If {Calculate Apportioned HI == true)

If {ABS{Config HeatlnputTimesOpTime Accumulator - UnitHeatlnputTimesOpTimeAccumulator) <= 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 Ttecon/.AdjustedHourly 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 {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 <> 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. AdjustedHourly Value >0 AND Config HeatlnputTimesOpTime
Accumulator == 0)

return result D

else

return result B

else


-------
return result B

// F-21C

else if (MP Stack Configfor 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. AdjustedHourly Value >= 0 AND ABS(Current HI Apportionment
AdjustedHourly Value - HI Calculated Apportioned Value) > Heat Input Tolerance)
return result A

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

Results:

Result
A

B

C

D

Response	Severity

The AdjustedHourly Value reported in the DHV record for HI is inconsistent with the Critical Error Level 1

recalculated apportioned or summed value.

The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message
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.

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation


-------
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 Op Time 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 Op Time 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. AdjustedHourlyValue >= 0)

If (A B S( Current Hf Apportionment Record. Adj ustcdHourly V al lie - NOX Calculated Apportionment
Based Value) > NOX Tolerance)

If (Legacy Data Evaluation == false)
return result A

else if (Apportionment OpTime Array for this Location is greater than 0 and less than or equal to

1)

If (A B S( Current HI Apportionment Record. Adj ustcdHourly 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 NOXMass 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 with Critical Error Level 1

the recalculated value.

B	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to other errors listed in this report.

Usage:
1

Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation


-------
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 ConfigNOxRateTimesOpTime 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

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation


-------
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 Record. IVTo ni to ri ngSy stem ID is not null)

Mon Sys Record = find active MonitoringSystemData record for location where
MonitoringSy stemData.MonitoringSystemID = Current NOXR Apportionment Based
Record. Mo ni to ri ngSy stem ID

if (found AND Mon Sys Record. SystemTypeCode == "NOXE" AND Mon ,SV.v /tecwc/.FuclTvpcCodc is not null)

if (Current NOXR Apportionment Based Record.OperatingConditionCode in set {X, Y, Z, U, W, N, M})

App E Op Code= Current NOXR Apportionment Based Record.OperatingConditionCode
App E Calc HI = HI Calculated Apportioned Value

App E Reported Value = Current NOXR Apportionment Based Record. Adj us tedHourly Va 1 lie
App E Segment Number = Current NOXR Apportionment Based Record. SegmentNumber
App E NOXE System ID = Current NOXR Apportionment Based Ttecon/.MonitoringSy stemID
App E NOXE System Identifier = Current NOXR Apportionment Based
Record. Sy stemldentifier

App E Fuel Code = Mon Sys Record.Fuel Type Code

EarliestLocationReportDate = CurrentMonitor Plan Location Record. Ea rl icst Rcpo rt Date

else if (Current NOXR Apportionment Based Record.OperatingConditionCode == "E")
return result A

else

return result B

else

return result C


-------
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


-------
Check Code:	HOURAPP-7

Check Name:	Handle NOx Rate Summary Expected for ARP

Related Former Checks:

Applicability:

Description:	Sets Expected Summary Value NOx Rate Array value for a location to true when the location is a unit and the

unit is affected by ARP.

Specifications:

If CurrentHIEntityType is equal to "Unit", MPStackConfigForHourlyChecks is equal to "MS", and the
ExpectedSummaryValueNOxRateArray value fortius location is equal to false,

Locate a record in LocationProgramRecordsByHourAndLocation where:

1)	ProgramCode is equal to 'ARP', and

2)	Class is equal to 'PI' or 'P2'.

if found,

Set ExpectedSummaryValueNOxRateArray for this location to true

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation


-------
Check Category:
Hourly Calculated Data


-------
Check Code:

HOURCV-1

Check Name:

Related Former Checks:

Calculate Percent H20

Applicability:
Description:

CEM Check

If there was a valid equation code reported for a Derived H20 record and 02 monitored values were available,
this check reproduces the formula for calculating H20 and compares it to the reported H20 Percentage

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (H2() Method Code = "MWD" AND Current DHV Record ModcCode in set {01, 02, 03, 04, 53, 54})

if (H2() 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. A dj u s t ed H o u r ly Va 1 ue) > 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)

H20DHV Calculated Adjusted Value = Current DHV Record

else

return result B

else if (H20 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

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Calculation Verification


-------
Check Code:	HOURCV-3

Check Name:	Determine Diluent Cap and Moisture for C02 Concentration Calculation Verification

Related Former Checks:

Applicability:	CEM Check

Description:	Determines the moisture and diluent values used in the C02C calculation.

Specifications:

if (C()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 H20 MHVCalculated
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)
Calculated Moisture for C02C = H20 Default Value

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 (02X Count > 1)

return result A
else if (02X Count == 0)

return result B
else if MonitoringDefaultDefaultValue <= 0
return result C

else

Calculated Diluent for C02C = MonitoringDefaultDefaultValue

else

case (CO2 Cone CEM Equation Code)

"F-14A":

Calculated Diluent for C02C = 02 Drv Calculated Adjusted Value
"F-14B":

Calculated Diluent for C02C = 02 Wet Calculated Adjusted Value

Results:

Result	Response

A	You reported more than one diluent cap default record for 02X in your monitoring plan

that was active during current hour.

B	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.

C	The DefaultValue reported in the active Default record for 02X in your monitoring plan

is invalid. The value must be greater than 0.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1


-------
Check Code:

HOURCV-4

Check Name:

Calculate C02 Concentration

Related Former Checks:

Applicability:

Description:

Specifications:

CEM Check

Based on equation code in C02 Concentration record and reported values, calculate the C02 Concentration

If {CurrentDHVRecord.ModcCode 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 Diluentfor 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. FdFactor) * [(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(CY/2C DHV Calculated Adjusted Value -
Current /)//K/?6'cwY/.AdjustcdHourly Value) > C02 Cone Tolerance)
return result A

If {Current DHV Record Valid == true AND Calculated Diluentfor 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(CY/2C DHV Calculated Adjusted Value -
Current /)//K/?6'cwY/.AdjustcdHourly Value) > C02 Cone Tolerance)
return result A

else

return result B

'F-14B":

else

return result B

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 with Critical Error Level 1

the recalculated value.

B	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to errors listed above.

Usage:
1

Process/Category:

Emissions Data Evaluation Report

C02 Concentration Calculation Verification


-------
Check Code:	HOURCV-6

Check Name:	Determine Diluent Cap and Moisture for Heat Input Calculation Verification

Related Former Checks:

Applicability:	General Check

Description:	Ensures that all inputs are available for each equation type prior to performing the actual calculations

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 H20MHV
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 H20 DHV 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. Di lucntCtipI ndictitor == 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 {C02N Count == 0)

return result B
else if MonitoringDefaultDefaultValue <= 0
return result C

else

Calculated Diluent For HI = MonitoringDefaultDefaultValue

else if (CO2 Cone Checks Needed for 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 DH V Record. D i 1 ucntCap I ndicato r == 1)

02X Count = # of active MonitoringDefault records for the location where
ParameterCode = '02X' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if {02XCount > 1)

return result D
else if {02XCount == 0)

return result E
else if MonitoringDefaultDefaultValue <= 0
return result F

else

Calculated Diluent For HI = MonitoringDefaultDefaultValue
else if {Heat Input Equation Code = "F-17" AND 02 Wet Checks Needed for Heat Input == true)


-------
if (Current 02 Wet Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = 02CSD 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 = 02CSD 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 DefaultValue 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


-------
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 Record.OperatingTime is between 0 and 1 (inclusive))

Heat Input Total Reported Value = Current DHV Record. k&\\iS{cAHo\.tf\\V'c\\\iC * Current Hourly Op Ttecon/.OperatingTime.
if {Current Month is not April OR Annual Reporting Requirement == 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 + Heat Input Total Reported Value

else

Rpt Period HI Reported Accumulator Array for this location = Heat Input Total Reported Value

if {Current Entity Type == "Unit" AND Unit HeatlnputTimesOpTime Accumulator >= 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 {Current Entity 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 DHVRecord Valid == true AND Calculated Diluent for 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 ,¥c¥i\c\ox * 100.0), and round the result to 1 decimal place.

else

return result A

= "F-16":

If {Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FC Factor Exists
== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisturefor HI is not null)

HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (100 - Calculated Moisture 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 Diluentfor HI is not null AND Valid FD Factor Exists
== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisturefor HI is not null)


-------
HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (1 / Current Hourly Op
Record. FdFactor)* [ 0.209 * (100 - Calculated Moisture for HI) - Calculated Diluentfor HI] / 20.9) ],
and round the result to 1 decimal place.

else

return result A

= "F-18":

If (Current DHVRecord Valid == true AND Calculated Diluent for HI is not null AND Valid FD Factor Exists
== true AND FLO W 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 for
HI\ * [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 (MPStack Configfor 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 Configfor Hourly Checks == "MS")

Config Heatlnput Accumulator = -1

else if (Heat Input App D Method Active for Hour == true)

if (HI App D Accumulator >= 0)

Total Heat Input from Fuel Flow = HI App D Accumulator

if (HI App D Accumulator >= 0 AND Current Hourly Op Record.0\~>crat ingTi me is greater than 0 and less than or equal to 1)

Apportionment Calc HI Array at this Location = HI App D Accumulator / Current Hourly Op Record. OperatingTime,
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 /?6'ewY/.0pcrati ngTi mc is between 0 and 1 inclusive)

Heat Input Total Calculated Value = HI Calculated Adjusted Value * Current Hourly Op Record.OperatingTime.

if ( Config HeatlnputTimesOpTime Accumulator >= 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 for this location >= 0)

Rpt Period HI Calculated Accumulator Array for this location = Rpt Period HI Calculated
Accumulator Array fox 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 fox this location = Heat Input Total Calculated Value

else

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 Record. Ad) ustedHourly Value is less than 1
AND Current DHV Record. MOD C Code is not equal to "26" and Legacy Data Evaluation == false)
return result C

else

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI" AND
UOM = "MMBTUHR"

if (ABS(Current /)//K/?6'cwY/.Adj ustedHourly Value - HI Calculated Adjusted Value) > 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 Record.OperatingTime is between 0 and 1 inclusive)

Heat Input Total Calculated Value = Apportionment Calc HI Array at this Location * Current Hourly Op
Record. OperatingTime.

if ( Config HeatlnputTimesOpTime Accumulator >= 0)


-------
Config HeatlnputTimesOpTime Accumulator = Config HeatlnputTimesOpTime Accumulator + Heat Input
Total Calculated Value

else

Config HeatlnputTimesOpTime Accumulator = -1

else if {Heat Input Method Code not 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

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

C	You reported in AdjustedHourly Value of less than 1 in the DHV record for [param]. Critical Error Level 1

You must report a minimum heat input of 1 and a MODCCode of "26".

Usage:

1	Process/Category: Emissions Data Evaluation Report	Heat Input Calculation Verification


-------
Check Code:	HOURCV-9

Check Name:	Calculate S02 Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:	Based on values from S02 Monitor Hourly and Stack Flow Monitor Hourly, plus moisture values if applicable

and the current equation code, the S02 Mass emissions rate is calculated

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecwrf.OperatingTime is between 0 and 1 (inclusive))

S02 Total Reported Value = Current I)HV Record. Ad) ustedHourly Value * Current Hourly Op Ttecon/.OperatingTime.
if (Rpt Period S02 Mass Reported Accumulator Array for this location is not null)

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 + 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 (S02 CEM Method Active for Hour == true)

if (S()2 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 (SO2 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 not
null)

SO2 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 (SO 2 App D Method Active for Hour == true)

if (S()2 App D Accumulator >= 0 AND Current Hourly Op Ttecwrf.OperatingTime is between 0 and 1 (inclusive))
SO2 Calculated Adjusted Value = S02 App D Accumulator / Current Hourly Op /?6'tw= 0)

Rpt Period S02 Mass Calculated Accumulator Array for 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 for this location = -1

If {Derived Hourly Adjusted Value Status == true)

SO2 Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02" AND
UOM = "LBHR"

if (ABS(Current DHV	AdjustedHourly Value - SO2 Calculated Adjusted Value) > S02 Tolerance)

return result B

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification


-------
Check Code:	HOURCV-12

Check Name:	Determine Diluent Cap, Moisture, and NOXC for NOx Rate Calculation Verification

Related Former Checks:

Applicability:	CEM Check

Description:	For each possible formula, ensure that all required components are available. Note that no responses are output,

because each missing part should have generated an earlier error message.

Specifications:

If 0Current NOx Rate Method Code == "CEM" AND Current DHV Record ModcCode in set {0 \ 02, 03, 04, 14, 22, 53, 54})

if (NOx Cone Monitor Hourly Count == 1 AND Current NOx Cone Monitor Hourly Ttecwrf.UnadjustedHourly Value is not null)
NOx Cone for NOx Rate Calculation = Current NOx Cone Monitor Hourly ./tetwrf.UnadjustedHourly Value

else

NOx Cone for NOx Rate Calculation = null

if (NOx Rate Equation Code in set {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9})

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for NOXR = 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 NOXR = 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 NOXR = 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 NOXR = H20 Default Value

if (NOx Rate Equation Code in set {19-3D, 19-5D} OR Current DHV Record.ModcCode == 14)

If (NOx Rate Equation Code in set {F-5, 19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D})

02 Monitor Default Matches = count of # active MonitoringDefaultData records for location where

MonitoringDefaultData.ParameterCode = "02X" AND MonitoringDefaultData.DefaultPurposeCode =
"DC" AND MonitoringDefaultData.FuelCode = "NFS"

if 02 Monitor Default Matches > 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 (NOx Rate Equation Code in set {F-6, 19-6, 19-7, 19-8, 19-9})

C02 Monitor Default Matches = count of # active MonitoringDefaultData records for location where

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

CO2 Monitor Default Record = the single matched record

if (C02 Monitor Default Record.DefaultValue is NULL OR C02 Monitor Default Record.DefaultValue
<=0)

return result F

else

Calculated Diluent for NOx Rate = C02 Monitor Default Record .DefaultValue

If (NOx Rate Equation Code in set {F-5, 19-1, 19-4} AND 02 Dry Checks Neededfor 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 (NOx Rate Equation Code in set {F-6, 19-6, 19-7, 19-8, 19-9} AND CO2 Cone Monitor Hourly Checks Needed
== true)

Calculated Diluent for NOx Rate = C02C MHV Calculated Adjusted Value

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification


-------
Check Code:	HOURCV-13

Check Name:	Calculate Unadjusted NOx Emissions Rate
Related Former Checks:

Applicability:	CEM Check

Description:	Based on equation code in NOx Emission Rate record and reported values, calculate the NOx Emissions Rate

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 DHV Record. ModcCodc in set {01, 02, 03, 14, 22, 53})

If {Current DHV Record. SystemTypeCode == "NOX")

RA TA 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. FdFactor * [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

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current Hourly
Op Record. ¥w¥i\c\ox * [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 )/100 - 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 .FdFactor / [ (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":

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. Fd Fa c t o r * 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. FcFactor * 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)
return result A

else

NOXR Calculated Unadjusted Value = 0.0000001194 * NOX Cone for NOx Rate Calc * Current Hourly
Op Record. FcFactor / [ (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	UnadjustedHourly Value - NOXR Calculated Unadjusted Value) > Tolerance)

return result C

else

Derived Hourly Unadjusted Calculation Status = true

else if (Current NOx Rate Method Code == "PEM" AND Current I)HVRecord. ModcCodc in set {01, 02, 03})
If (CurrentDHVRecord. SystemTypeCode == "NOXP")

RA TA Status Required = true

If Current	UnadjustedHourly Value >= 0

NOXR Calculated Unadjusted Value = Current	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 DHV Record. ModcCode == 21)

If (Current DHV Record. SystemTypeCode in set {NOX, NOXP})

RA TA Status Required = true

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


-------
Check Code:

HOURCV-15

Check Name:

Related Former Checks:

Determine Moisture for NOx Mass Calculation Verification

Applicability:
Description:

CEM Check

Verifies that all elements are present to support the equation code indicated by the current NOx Mass Rate
record

Specifications:

If (NOx Mass Monitor Method Code begins with "CEM")
If (NOxMass Equation Code== "F-26B")

ff (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 H20MHV
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 H20 DHV 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:

1	Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification


-------
Check Code:	HOURCV-16

Check Name:	Calculate NOx Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:	Based on Formula Code and all reported values, the NOx Mass Calculation is verified

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecwrf.OperatingTime is between 0 and 1 (inclusive))

NOXMass Total Reported Value= Current DHV Record. Ad) ustedHourly Value * Current Hourly Op Record. OperatingTime.
if {Current Month is not April OR Annual Reporting Requirement == true)

if (Rpt Period NOX Mass Reported Accumulator Array for this location is not null)

if (Rpt Period NOX Mass Reported Accumulator Array fortius location >=0)

Rpt Period NOX Mass Reported Accumulator Array for this location = Rpt Period NOX Mass Reported
Accumulator Array for this location + NOXMass 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 FLO W 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 NOXMass Calculated Accumulator Array for this location = -1
return result A

else if (NOXMass Equation Code== "F-26B")

If (Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLO W Calculated
Adjusted Value is not null AND Calculated Moisturefor NOX is not null)

NOX Calculated Adjusted Value= 0.0000001194 * NOXC Calculated Adjusted Value* FLOW Calculated
Adjusted Value * (100.0 - Calculated Moisturefor NOX) /100.0, ROUNDED to one decimal place.

else

if (Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOXMass Calculated Accumulator Array for this location = -1
return result A

else if (NOXMass 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)


-------
else

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 for this location = -1
return result A

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

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

else

NOX Calculated Adjusted Value = Current DHV Calculated Adjusted Value

If {NOX Calculated Adjusted Value is not null)

If {Current Hourly Op Record.0\~>crati ngTime is between 0 and 1 inclusive)

NOxMass Total Calculated Value = NOX Calculated Adjusted Value * Current Hourly Op Record.Opc rat i ngTi mc.

if {Current Month is not April OR Annual Reporting Requirement == true)

if (Rpt Period NOX Mass Calculated Accumulator Array for this location is not null)

if {Rpt Period NOXMass 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 + NOXMass Total Calculated Value

else

Rpt Period NOXMass Calculated Accumulator Array for this location = NOXMass Total Calculated
Value

if {Current Month is April)

if {April NOXMass Calculated Accumulator Array for this location is not null)

April NOXMass Calculated Accumulator Array for this location = April NOXMass Calculated
Accumulator Array for this location + NOXMass Total Calculated Value

else

April NOXMass Calculated Accumulator Array for this location = NOXMass Total Calculated
Value

else

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 DHV Method in set {CEM, NOXR, CEMNOXR})

NOX Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOX" AND
UOM = "LBHR"

if (A B S(Current DH V Record. Adj ustcdHourly Val lie - NOX Calculated Adjusted Value) > NOX Tolerance)
If {Legacy Data Evaluation == false)
return result B

else if {Current Hourly Op /Jafa.OpTimc is greater than 0 and less than or equal to 1)

if (A B S( Current DHV Record. Adj ustcdHourly V al lie - NOX Calculated Adjusted Value) > NOX
Tolerance / Current Hourly Op Record. OperatingTime)
return result B


-------
else if (NOXMass Equation Code<> "F-24A" OR Current DHVRecord Valid == false OR NOXR Calculated Adjusted Value is null OR
Heat Input Method Code NOT 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

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

Usage:
1

Process/Category:

Emissions Data Evaluation Report

NOx Mass Rate Calculation Verification


-------
Check Code:	HOURCV-18

Check Name:	Determine Diluent Cap and Moisture for C02 Mass Calculation Verification

Related Former Checks:

Applicability:	CEM Check

Description:	For each possible formula, ensure that all required components are available. Note that no responses are output,

because each missing part should have generated an earlier error message.

Specifications:

If (C02 Method Code == "CEM")

if (CO 2 Mass Equation Code== "F-2")

ff (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 H20MHV
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 H20 DHV 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 C02 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 (CO2N Count > 1)

return result A
else if (C02N Count == 0)

return result B
else if MonitoringDefaultDefaultValue <= 0
return result C

else

Calculated Diluent for C02 = MonitoringDefaultDefaultValue

else if (C02 Cone Derived Checks Needed == true)

Calculated Diluent for C02 = C02C DHV Calculated Adjusted Value

else if (CO2 Cone Checks Neededfor CO2 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

Results:

Result
A

B

C

Response	Severity

You reported more than one diluent cap default record for C02N in your monitoring Critical Error Level 1

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 Critical Error Level 1
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 DefaultValue reported in the active Default record for C02N in your monitoring Critical Error Level 1
plan is invalid. The value must be greater than 0.


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification


-------
Check Code:	HOURCV-19

Check Name:	Calculate C02 Mass Emissions

Related Former Checks:

Applicability:	CEM Check

Description:	Based on values from C02 Monitor Hourly and Stack Flow Monitor Hourly, plus moisture values if applicable

and the current equation code, the C02 Mass emissions rate is calculated

Validation Tables:

Hourly Emissions Tolerances (Cross Check Table)

Specifications:

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecwrf.OperatingTime is between 0 and 1 (inclusive))

C02 Total Reported Value = Current DHV Record. k&\\iS{cAHo\.tf\\V'c\\\iC * Current Hourly Op Ttecon/.OperatingTime.

if (Rpt Period C02 Mass Reported Accumulator Array for this location is not null)

if {Rpt Period C02 Mass Reported Accumulator Array for this location >= 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 (C02 Method Code == "CEM")

if (C02 Mass Equation Code== "F-ll")

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)

CO 2 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)

if (CO2 App D Accumulator >= 0 AND Current Hourly Op Record.Operat ingTime is between 0 and 1 (inclusive))

CO2 Calculated Adjusted Value = C02 App D Accumulator / Current Hourly Op Record. OperatingTime, rounded to one
decimal place.

else

if {Legacy Data Evaluation == false)

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 = -2

else

CO 2 Calculated Adjusted Value = Current DHV Calculated Adjusted Value

If (CO2 Calculated Adjusted Value is not null)

If {Current Hourly Op Record.0\~>crati ngTime is between 0 and 1 inclusive)

C02 Total Calculated Value = C02 Calculated Adjusted Value * Current Hourly Op Record.OperatingTime.

if {Rpt Period C02 Mass Calculated Accumulator Array for this location is not null)

if {Rpt Period C02 Mass Calculated Accumulator Array for this location >= 0)

Rpt Period C02 Mass Calculated Accumulator Array for 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 Record. Adj ustcdHourly V al lie - CO 2 Calculated Adjusted Value) > 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

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message

to errors listed above.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification


-------
Check Code:	HOURCV-25

Check Name:	Determine BAF Value for NOx Emission Rate System

Related Former Checks:

Applicability:	CEM Check

Description:	Retrieves and sets as an output parameter the Bias Adjustment factor for the NOX Rate Monitoring System

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 Current I)H V Record. Mode Code in set {01, 02, 03, 14, 22, 53})

If (RATA Status BAF is not null)

Current NOX System BAF = RA TA Status BAF

else

return result A

Results:

Result	Response	Severity

A	The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, because the Informational Message

prior RATA had critical errors or because of a RATA Status error listed on this report.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOX RATA Status Evaluation


-------
Check Code:

HOURCV-30

Check Name:	Initialize S02 Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for S02.

Specifications:

Current DHV Parameter = "S02"

Current DHVRecord Valid = SOI 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:

1	Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification


-------
Check Code:	HOURCV-31

Check Name:	Initialize NOX Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for NOX.

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:

1	Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification


-------
Check Code:

HOURCV-32

Check Name:	Initialize NOXR Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for NOXR.

Specifications:

Current DHV Parameter = "NOXR"

Current DHVRecord Valid = NOXR Derived Hourly Status

NOXR Calculated Adjusted Value = null

Calculated Diluent for NOXR = null

Calculated Moisture for NOXR = null

Current DHVHBHA Value = Current NOXR HBHA Value

Current DHV Record = Current NOx Rate Derived Hourly Record

Current Appendix E Status = null

RA TA Status Required = false

RA TA Status BAF = null

Current Hourly Record for RA TA Status = Current NOx Rate Derived Hourly Record

Set QaStatusComponentld = null

Set QaStatusComponentldentifier = null

Set QaStatusComponentTypeCode = null

Set QaStatusSystemDesignationCode = CurrentDHVRecord.S\s{cmr>cs'\gK\{\o\\CoAc
Set QaStatusSystemld = CurrentDHVRecorcl. Sy stemId
Set QaStatusSystemldentifier = CurrentDHVRecord. Sy stem I dc nti fie r
Set QaStatusSystemTypeCode = CurrentDHVRecord.SystemTypeCode

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification


-------
Check Code:

HOURCV-33

Check Name:	Initialize C02 Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02.

Specifications:

Current DHV Parameter = "C02"

Current DHVRecord Valid = CO2 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:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification


-------
Check Code:

HOURCV-34

Check Name:	Initialize C02C Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02C.

Specifications:

Current DHV Parameter = "C02C"

Current DHVRecord Valid = C02C Derived Hourly Status
C02C DHV Calculated Adjusted Value = null
Calculated Diluent for C02C = null
Calculated Moisture for C02C = null

Current DHVHBHA Value = Current C02C DHVHBHA Value
Current DHV Record = Current C02 Cone Derived Hourly Record

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Calculation Verification


-------
Check Code:

HOURCV-35

Check Name:	Initialize H20 Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02C.

Specifications:

Current DHV Parameter = "H20"

Current DHVRecord Valid = H20 Derived Hourly Status
H20 DHV Calculated Adjusted Value = null
Current DHVHBHA Value = Current H20 DHVHBHA Value
Current DHV Record = Current H20 Derived Hourly Record

Set QaStatusComponentld = null

Set QaStatusComponentldentifier = null

Set QaStatusComponentTypeCode = null

Set QaStatusSystemDesignationCode = CurrentDHVRecord.S\s{cmr>cs'\gK\{\o\\CoAc
Set QaStatusSystemld = CurrentDHVRecord. Sy s t e m I d
Set QaStatusSystemldentifier = CurrentDH VRecord. Sy stem I dc nti fie r
Set QaStatusSystemTypeCode = CurrentDHVRecord.SxsicmTxpcCodc

if {Current DHV Record. MODCCode in set {01, 02, 03, 21, 53} AND Current DHV Record. SystemTypeCode == "H20")

RA TA Status Required = true

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Calculation Verification


-------
Check Code:	HOURCV-36

Check Name:	Initialize HI Calculated Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HI.

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

Set QaStatusComponentld = null

Set QaStatusComponentldentifier = null

Set QaStatusComponentTypeCode = null

Set QaStatusSystemDesignationCode = CurrentDHVRecord.SxsicmDcsigmiionCodc
Set QaStatusSystemldentifier = CurrentDHVRecord. Sy stem I dc nti fie r
Set QaStatusSystemTypeCode = CurrentDHVRecord.SyslcmTypcCodc

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Heat Input Calculation Verification


-------
Check Code:

HOURCV-37

Check Name:

Related Former Checks:

Check Unadjusted Value

Applicability:
Description:

CEM Check

This check ensures that the UnadjustedValue in the DHV record for NOXR is valid.

Specifications:

Derived Hourly Unadjusted Value Status = false

If (Current NOx Rate Method Code in set {CEM, PEM})

ff (Current DHV Record. ModcCodc in set {01, 02, 03, 04, 14, 21, 22, 53, 54})

If (Current DHV Record. U nadj ustedHourly Value is not null)

If (Current /)//K/?6'cwY/.UnadjustcdHourly Value < 0.0 AND

Current DHV Record. ModcCodc <> "21")
return result A

Else if (Current DHV Record!] nadj ustedHourly Value > 0 AND

Current DHV Record. ModcCode == 21)
return result B

Else if (Current DHV Record. U nadj us tcdHourly Va 1 uc 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 ConcMODC is null OR is NOT in set {19, 20}))
if (Current DHV Record.UnadjustedHourly Value > 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 DHV Record. U nadj ustedHourly Value is not null)
return result D

Else

Derived Hourly Unadjusted Value Status = true
Else If (Current DH V Record. U nadj ustedHourly Va 1 uc is not null)
return result E

Else

Derived Hourly Unadjusted Value Status = true

Else


-------
Results:

Result
A

B

C

D

E
F

Usage:
1

Response

The UnadjustedHourlyValue reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.

You reported anMODCCode of 21 in the DHV record for [param], but the
UnadjustedHourlyValue is greater than 0.

Warning: The UnadjustedHourlyValue 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 anMODCCode of [modcCode] in the DHV record for [param], so you

should not have reported a value for the UnadjustedHourlyValue.

You reported an UnadjustedHourlyValue 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


-------
Check Code:	HOURCV-38

Check Name:	Determine Maximum or Minimum Value for Parameter in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines the maximum or minimum value for the parameter from the span or default table based

on MODC.

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 DHVDefault 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})
ff (NOx Rate Bypass Code== "BYMAXFS")

Current DHV Fuel Specific Hour = true

else

Current DHV Fuel Specific Hour = false
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 (CO 2 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,
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 (Current Hourly Op Record.FuelCode is not null)


-------
Current DHVMissing Data Fuel = Current Hourly Op Record. Fucl Code

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = Current Hourly Op Record.FuelCode
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 (Default Record. Dc Paul t Va 1 uc > 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 .FuelCode is not null

Current DHV Missing Data Fuel = Current Hourly Op Record ,¥uc\Co 1)

return result B
else if (count == 0)

return result C

else

Default Record = the single matched record


-------
if (Default Record DefaultYalue > 0)

Current DHV Max Min Value = Default Record. DefaultValue

else

return result D

else if (Current DHV Record. ModcCodc <> "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 i?ecor 0)

Current DHV Max Min Value = Current Monitor Span Record.MPCVahiQ

else

return result G

else if (count == 0 ANDCurrent 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 (Default /fecort/. Default Value >= 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 (Default Record. Default Value > 0)

Current DHV Max Min Value = Default Record. DefaultValue

else

return result D

Results:

Result	Response	Severity

A	The missing data default parameter for H20 could not be determined, because you used Critical Error Level 2

both Standard and Inverse Part 75 missing data approaches during the hour.

B	You reported more than one applicable [param] Default record with a FuelCode of Critical Error Level 1

[FuelCode] in your monitoring plan for the hour.

C	You did not report an applicable [param] Default record with a FuelCode of [FuelCode]. Critical Error Level 1

D	The values reported in the applicable [param] Default record with a FuelCode of	Critical Error Level 1

[FuelCode] are invalid.

E	You reported more than one active span record for [key] in your monitoring plan for the Critical Error Level 1

hour.

F	You did not report a missing data maximum default for C02 in a span or default record Critical Error Level 1

in your monitoring plan.

G	The values reported in the applicable span record for [key] are invalid.	Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Calculation Verification

2

Process/Category:

Emissions Data Evaluation Report —

— H20 Calculation Verification

3

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Calculation Verification

4

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Calculation Verification


-------
Check Code:	HOURCV-39

Check Name:	Check Adjusted Hourly Value in DHV Record
Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that AdjustedHourly Value is valid and does not conflict with the reported MODC codes.

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 Lin its of Measure. D cc i ma 1 s_ H rly.

if (Current DHV Record. ModcCode is not null)

case (Current DHV Record. ModcCode)

= 21: Current DHV Calculated Adjusted Value = 0

if (Current DHV Record. AdjustedHourlyValue == 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. AdjustedHourlyValue == Current DH V 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. AdjustedHourlyValue == Current DH V Max Min Value)

Derived Hourly Adjusted Value Status = true

else

return result C

= 06:

If (Current DHV Parameter in set {C02C, H20} AND (Current DHV Record .kA\us{cAHow\\V'c\\uc is null or
Current DHV Record. AdjustedHourlyValue < 0 or Current DHV Record. AdjustedHourly Value > 100))
return result L

else if (Current DHVHBHA Value is not null)

Current DHV Calculated Adjusted Value = Current DHV HBHA Value


-------
If (Current DHVRecord. Ad)ustcdHourly Value >= 0)

if ( Current 1)HV /?6'cwY/.AdjustcdHourly Value == Current DHV Calculated Adjusted Value)
Derived Hourly Adjusted Value Status = true

else

return result D

else

return result E

else

If (Current /)//K/?6'cwY/.Adj ustcdHourly Value >= 0)

If (Current DHV Record. Ad) ustcdHourly Value is not rounded to Current DHV Precision)
return result M

else

Current DHV Calculated Adjusted Value = Current DH V Record. Adj ustcdHourly Val lie
Derived Hourly Adjusted Value Status = true

if {Current DHV Parameter in set {C02C, H20, NOXR} AND Current DHV Max Min
Value is not null)

If {Current DHV Parameter == "H20" AND H2() Missing Data Approach ==

"MIN")

if (Current /)//K/?6'cwy/. Adj ustcdHourly Value < Current DHV Max
Min Value)

return result H

else

if (Current /)//K/?6'cwy/. Adj ustcdHourly Value > Current DHV Max
Min Value)

If {Current DHV Parameter == "NOXR" and Current DHV
/?6'cwY/.AdjustcdHourly Value > Current DHV Max Min Value

*2)

return result O
Otherwise,

return result G

Else

return result E

= 08 OR 09:

If {Current DHV Parameter in set {C02C, H20} AND (Current /)//K/?6'cwy/. Adj ustcdHourly Value is null or
Current DHV Record. AdjustedHourlyValue < 0 or Current DHV /?6'cwy/. Adj ustcdHourly Value > 100))
return result L

else if (Current DHV/?£6y>/y/. AdjustedHourly Value >= 0)

If {Current DHV HBHA Value is not null AND Current DHV Parameter == "H20" AND H20 Missing
Data Approach == "MIN" AND Current DHV HBHA Value < Current DHV
/?6'«;/y/. AdjustedHourly 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
Record. A dj us tcdH o u rly V a 1 lie AND {Unit is Load Based == true ox Current DHV Parameter <>
"NOXR"))

Current DHV Calculated Adjusted Value = Current DHV HBHA Value
return result F

elseif (Current /)//K/?6'cwy/. Adj ustcdHourly Value is not rounded to Current DHV Precision)
return result M

else

Current DHV Calculated Adjusted Value = Current DHV Record. Adj ustcdHourly Value


-------
Derived Hourly Adjusted Value Status = true

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 Record. Adj ustcdHourly Value < Current DHV Max Min
Value)

return result H

else

if (Current DHV /?£6y>/y/. AdjustcdHourly Value > Current DHV Max Min
Value)

If (Current DHV Parameter == "NOXR" and Current DHV
Record. Adj ustcdHourly Value > 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 ustcdHourly Value is null or
Current DHV /?6'cwY/.AdjustcdHourly Value < 0 or Current DHV Record. Adj ustcdHourly Va 1 lie > 100))
return result L

else if (Current DH V Record .Adj ustcdHourly V alue >= 0)

If (Current DHV Record. AdjustedHourlyValue is not rounded to Current DHV Precision)
return result M

else

Current DHV Calculated Adjusted Value = Current DHV Record. Adj ustcdHourly Value
Derived Hourly Adjusted Value Status = true

if (Current DHV Parameter in set {C02C, H20, NOXR} AND Current DHV Max Min Value is
not null)

If (Current DHV Parameter == "H20" AND H2() Missing Data Approach == "MIN")
if (Current DHV /?£?6Y>/Y/,AdjustcdHourly Value < Current DHV Max Min
Value)

return result H

else

if (Current DHV /?£?6Y>/Y/,AdjustcdHourly Value > Current DHV Max Min
Value)

If (Current DHV Parameter == "NOXR" and Current DHV

wy/ . A dj u s t c d H o u r ly V a 1 u c > Current DHV Max Min Value * 2)
return result O
Otherwise,

return result G

Else

return result E

= 26: If (Current /)//K/?6'cwy/. Adj ustcdHourly Value == 1)

Derived Hourly Adjusted Value Status = true

else

return result I

= All Other Codes except 40:

If (Current DHV Parameter in set {C02C, H20} AND (Current DHV Record. k&\us{cAHo\.tf\\V'c\\\iC is null or
Current DHV /?6'cwY/.AdjustcdHourly Value <0 or Current DHV /?6'cwy/. Adj ustcdHourly Value > 100))


-------
return result L

else if (Current DHV Record. Ad)ustedHourly Value >= 0)

If {Current DHV Record. A dj u s t e d H o u r ly Va 1 lie 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 /?£6Y>/Y/.AdjustcdHourly Value < Current DHV Max Min
Value)

return result H

else

if {Current DHV /?£6Y>/Y/.AdjustcdHourly Value > Current DHV Max Min
Value)

return result G

Else

return result E

If (Current DHV/?£6Y>/Y/.AdjustcdHourly Value >= 0)

If (Current DHV /?£?6Y>/Y/,AdjustcdHourly Value is not rounded to Current DHV Precision)
return result M

else

Derived Hourly Adjusted Value Status = true

If {Current DHV Parameter == "HI")

if {Heat Input Method Code not in set {AD, ADCALC, CALC})

Current DHV Calculated Adjusted Value = CurrentDHV Record. k&\us{cAHo\.tf\\V'c\\\iC

If (Current /)//K/?6'cwY/.Adj ustedHourly Value == 0.0)

If {Heat Input Method Code == "CEM")

If Legacy Data Evaluation = true

If {Current Hourly Op Record.0\iT\mc > 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 /)//F7?ec0r 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 /?6'cwY/.Adj ustedHourly Value

else if {Current DHV Parameter == "S02")

if (SO2 App D Method Active for Hour == false)

Current DHV Calculated Adjusted Value = Current DH V Record. Adj ustedHourly Val lie

else if {Current DHV Parameter == "C02")

if (CO 2 App D Method Active for Hour == false)


-------
Current DHV Calculated Adjusted Value = Current DHV /?6'cw
-------
Results:

Result
A

B

C

D

E
F

H

I
J
K

L

M

N

O

Response

You reported anMODCCode of 21 in the DHV record for [param], but the
AdjustedHourly Value does not equal 0.

You reported anMODCCode 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 anMODCCode 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 anMODCCode 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 anMODCCode 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 anMODCCode 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 anMODCCode 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.

The AdjustedHourly Value reported in the DHV record for NOXR is in excess of 200%
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


-------
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 —

— H20 Calculation Verification

4

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Calculation Verification

5

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Calculation Verification

6

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Calculation Verification

7

Process/Category:

Emissions Data Evaluation Report —

— S02 Calculation Verification


-------
Check Code:

HOURCV-40

Check Name:

Related Former Checks:

Determine Moisture for S02 Mass Calculation Verification

Applicability:
Description:

CEM Check

Verifies that all elements are present to support the equation code indicated by the current S02 Mass Rate
record

Specifications:

If (S02 Method Code begins with "CEM")

if (S02 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 H20MHV
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 H20 DHV 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:

1	Process/Category: Emissions Data Evaluation Report	S02 Calculation Verification


-------
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 fortius location + Current DHV Record. AdjustedHourly Value

else

Rpt Period NOx Rate Reported Accumulator Array fortius location= Current DHV Record. AdjustedHourly Value

else

Rpt Period NOx Rate Reported Accumulator Array for this location = -1

if (RATA Status Required == true AND Current NOX System BAF is not null)

NOXR Calculated Adjusted Value = NOXR Calculated Unadjusted Value * Current NOX System BAF, and round the result to
three decimal places

else if (Current NOx Rate Method Code == "AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor Oil > 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
Record.OperatingTime is between 0 and 1 (inclusive))

If (NOXR App E Accumulator == 0)

NOXR Calculated Adjusted Value = 0

else

NOXR Calculated Adjusted Value = NOXR App E Accumulator / Total Heat Input from Fuel Flow, and round
the result to three decimal places

else

Apportionment Calc NOXR Array at this Location = -1

Rpt Period NOx Rate Calculated Accumulator Array for this location = -1

return result A

If (NOXR Calculated Adjusted Value is not null)

Apportionment Calc NOXR Array at this Location = NOXR Calculated Adjusted Value

if (MP Stack Configfor Hourly Checks == "MS" AND Expected Summary Value NOx Rate Array for the location == true)
if (Config NOxRateTimesHeatlnput Accumulator >= 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

if (Config NOxRateTimesOpTime Accumulator >= 0 AND Current Hourly Op Record.Opc ra t i ngT i mc is between 0 and 1
(inclusive))

Config NOxRateTimesOpTime Accumulator = Config NOxRateTimesOpTime Accumulator + (Current Hourly
Op Record.Opc rat i ngTi me * NOXR Calculated Adjusted Value)

Config OpTime Accumulator = Config OpTime Accumulator + Current Hourly Op Record. OperatingTime

else

Config NOxRateTimesOpTime Accumulator = -1


-------
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 DH V Record. Adj ustcdHourly Va 1 lie) > 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 {MPStack Configfor Hourly Checks == "MS")

Config NOxRateTimesHeatlnput Accumulator = -1

if (RA TA Status Required == true AND Current NOX System BAF is null AND NOXR Calculated Unadjusted Value is not null)
return result A

Results:

Result
A

Response

The AdjustedHourly Value in the DH V 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:

1	Process/Category:
Conditions:

2	Process/Category:

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

RATA Status Required Equals false

Emissions Data Evaluation Report	NOX RATA Status Evaluation


-------
Check Code:

HOURCV-42

Check Name:

Related Former Checks:

Check HI System in DHV Record

Applicability:

Description:

Specifications:

CEM Check

This check ensures that a valid Monitoring System is indicated in the DHV record.

If Current DHV Parameter == "HI" AND Heat Input Method Code in set {CEM, AMS})

IF (Current DHV Record.MomtormgSystemlD is null

IF (Heat Input Method Code == "CEM" AND

(CO2 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 Needed for 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 Needed for Heat Input == true AND Current 02 Dry Monitor Hourly Record is not null
AND Current 02 Dry Monitor Hourly Record.ModcCode 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.ModcCode 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 MonitoringSy stemData record For location where
MonitoringSystemData.MonitoringSystemID = Current DHV Record Momion ngSystcmID

iF (HI DHV Mon Sys Record is null)
return result C

elseiF (HI DHV Mon Sys Record. SystemTypeCode not in set {C02, 02})
return result D

else

iF (CO2 RATA Required == true)

RATA Status Required = true

return result A

else


-------
Results:

Result	Response	Severity

A	You did not report MonitoringSystemID in the DHV record for HI. While this was Critical Error Level 1

acceptable for legacy data, this field is required when you report measured data.

B	You reported a MonitoringSystemID in the DHV record for [param]. This field should Non-Critical Error

be blank when missing data substitution is used.

C	You reported MonitoringSystemID [ID] in the DHV record for [param], but according Critical Error Level 1

to your monitoring plan this system was not active during the hour.

D	You reported MonitoringSystemID [ID] in the DHV record for HI, but this system is not Critical Error Level 1

a C02 or 02 monitoring system.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Heat Input Calculation Verification


-------
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})

ff (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")

Set Monitor Measure Code Array for "C02C" to "MEASSUB".

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 inset {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, 13, 15, 23, 24, 25, 55})

Set Current Measure Code to "SUB"

if {NOx Rate Equation Code inset {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")

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 "MEASSUB".

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 "MEASSUB".

else if {Heat Input Equation Code in set {F-17})

If {Monitor Measure Code Array for "02 W" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if {Monitor Measure Code Array for "02 W" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".

else if {Monitor Measure Code Array for "02 W" 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".

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 {SO 2 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 (S()2 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 {S02 F23 Method Active for Hour == true)

set Current Measure Code to HI Measure Code.

else if (S()2 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".

else if {Current DHVParameter == "C02")

If {C02 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 (CO2 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 (TVOx Mass Equation Code== "F-24A")


-------
If {HIMeasure Code and NOXR Measure Code are both equal to "MEASURE")
set Current Measure Code to "MEASURE".

else if {HIMeasure Code and NOXR Measure Code are both equal to "SUB")
set Current Measure Code to "SUB".

else if {HI Measure Code and NOXR Measure Code are both not null)
set Current Measure Code to "ME AS SUB".

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")
{Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == 'MEASURE"))
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)


-------
Check Category:
Hourly Derived Data


-------
Check Code:

HOURDHV-1

Check Name:	Initialize S02 Derived Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for S02.

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:

1	Process/Category: Emissions Data Evaluation Report	S02 Derived Hourly Evaluation


-------
Check Code:	HOURDHV-2

Check Name:	Initialize NOX Derived Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for NOX.

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:

1	Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation


-------
Check Code:	HOURDHV-3

Check Name:	Initialize NOXR Derived Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for NOXR.

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. IVIodcCode

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:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation


-------
Check Code:

HOURDHV-4

Check Name:	Initialize C02 Derived Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for C02.

Specifications:

Current DHV Parameter = "C02"

CO2 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:

1	Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation


-------
Check Code:	HOURDHV-5

Check Name:	Initialize C02C Derived Hourly Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for C02C.

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:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation


-------
Check Code:	HOURDHV-6

Check Name:	Initialize H20 Derived Hourly Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for H20.

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 RA TA Status = Current H20 Derived Hourly Record

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation


-------
Check Code:	HOURDHV-7

Check Name:	Initialize HI Derived Hourly Data

Related Former Checks:

Applicability:	General Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HI.

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:

1	Process/Category: Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation


-------
Check Code:	HOURDHV-8

Check Name:	Initialize S02R Derived Hourly Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for S02R.

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:

1	Process/Category: Emissions Data Evaluation Report	S02R Derived Hourly Evaluation


-------
Check Code:	HOURDHV-9

Check Name:	Initialize S02M Derived Hourly Data

Related Former Checks:

Applicability:	LME Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for S02M.

Specifications:

Current DHV Parameter = "S02M"

S02MDerived 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:

1	Process/Category: Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)


-------
Check Code:	HOURDHV-IO

Check Name:	Initialize NOXM Derived Hourly Data

Related Former Checks:

Applicability:	LME Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for NOXM.

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:

1	Process/Category: Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)


-------
Check Code:	HOURDHV-11

Check Name:	Initialize C02M Derived Hourly Data

Related Former Checks:

Applicability:	LME Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for C02M.

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:

1	Process/Category: Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)


-------
Check Code:	HOURDHV-12

Check Name:	Initialize HIT Derived Hourly Data

Related Former Checks:

Applicability:	LME Check

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HIT.

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:

1	Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)


-------
Check Code:	HOURDHV-13

Check Name:	Check MODC in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	Basic check to ensure that MODC reported in the DHV record is valid for the parameter. Also initializes

variables for the category.

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. ModcCode is not null)
return result B

Else

Derived Hourly Mode Status = true

NOX: ff {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. ModcCode is not null)
return result B

Else

Derived Hourly Mode Status = true

NOXR: ff {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 Record. ModcCode 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: ff {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 Mode Status = true

C02: 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, 53, 54,
55})


-------
return result A

Else

Derived Hourly Mode Status = true

else

If (Current I)HV Record. ModcCodc is not null)
return result B

Else

Derived Hourly Mode Status = true

HI: 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, 26, 53,
54, 55})

return result A

Else

Derived Hourly Mode Status = true

else

If (Current DHV Record. ModcCode is not null and Current DHV Record. ModcCode <> "26")
return result B

Else

Derived Hourly Mode Status = true

H20: H20 DHVMODC = Current DHV Record. ModcCodc

if {Current DHV Method == "MWD")

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 <> "40")
return result A

else

Derived Hourly Mode Status = true

S02R: If {S02 F23 Method Active For Hour == true)

If {Current DHV Record. ModcCode <> "40")
return result A

else

Derived Hourly Mode Status = true

HIT: If {Current DHV Record. ModcCode == "45")

If {LME HI Substitute Data Code== "MHHI")

Derived Hourly Mode Status = true

else

return result D
else if (Curren t DHV Record. ModcCodc is not null)
return result A

Else

Derived Hourly Mode Status = true

S02M, NOXM, C02M:

If {Current DHV Record. ModcCode is not null)
return result B

Else

Derived Hourly Mode Status = true


-------
A

B

C

D

ige:

1

2

3

4

5

6

7

8

9

10

11

12

Response	Severity

The MODCCode reported in the DHV record for [param] is invalid.	Critical Error Level 1

You reported an MODCCode in the DHV record for [param]. This field should be Non-Critical Error
blank.

You reported an MODCCode in the DHV record for NOXR. This field should be blank Critical Error Level 1
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	Critical Error Level 1

reported a SubstituteDataCode of MHHI in the active heat input method record in your
monitoring plan.

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02M Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation


-------
Check Code:	HOURDHV-14

Check Name:	Check Percent Monitor Availability in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	Performs a series basic checks to ensure that the reported monitor percent available is between 0 and 100,

inclusive, then checks to see that percent available is within permitted ranges for specific MODC codes

Specifications:

Derived Hourly Pma Status = false
Derived Hourly Missing Data Status = true

If (Derived Hourly Mode Status == true)

If ( Current DHV Record. PercentAvailable 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 I)H V Record. Mode Code == "40")

Derived Hourly Pma Status = true

else

if {Current DHV Record.Mo AcCo Ac 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. Percent Axa\\ ab 1 c> 100.0 OR

Current DHV Record. Pc rcc lit Ay a i 1 ab 1 c < 0.0)
return result D

Else

case {Current DHV Record. ModcCode)

= 06: If CurrentDHVRecord.PercentAvailable >= 90.0
Derived Hourly Pma Status = true

Else

return result E

= 08: If Current DHV Record .Percent Ax aMcfole >= 95.0
Derived Hourly Pma Status = true

Else

return result E

= 09: If Current DHV Record. PercentAvailable >= 90.0 AND Current DHV Record. PercentAvailable < 95.0
Derived Hourly Pma Status = true

Else

return result E

= 10: If Current DHV Record.Percent Available >=80.0 AND Current DHV Record.Percent Available < 90.0


-------
A

B

C

D

E

F

ige:

1

2

3

4

5

6

7

8

9

10

11

Derived Hourly Pma Status = true
Else If CurrentDHVParameter == "NOXR" and CurrentDHVRecord.PercentAvailable >=90.0
Derived Hourly Pma Status = true
return result F

Else

return result E

= 11: If Current DHV Record. PercentAvailable >=90.0
Derived Hourly Pma Status = true

Else

return result E

All other MODC Codes:

Derived Hourly Pma Status = true

Response

You reported anMODCCode 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).)

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02M Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

Severity

Informational Message

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Process/Category:

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation


-------
Check Code:

HOURDHV-15

Check Name:	Check Prior QA'd Hours for MODC 07

Related Former Checks:

Applicability:	CEM Check

Description:	For Method of Determination Code 07, all prior hours in reporting period are checked to ensure that total of

QA'd hours is below a certain threshold

Specifications:

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
if (Current DHV Record ModcCodz == 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

DerivedHourlyValueData.ParameterCode = Current DHV Record.FammsterCode 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 prior Critical Error Level 1
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


-------
Check Code:

HOURDHV-16

Check Name:

Check for Correct Use of Missing Data MODCs

Related Former Checks:

Applicability:

Description:

Specifications:

CEM Check

Current DHVHBHA Value = null

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)

case (Current DHV Parameter)

NOXR: MODCSet = {01, 02, 03, 04, 14, 21, 22, 53, 54}
C02C: MODCSet = {01, 02, 03, 04, 21, 53, 54}
H20: MODCSet = {01, 02, 03, 04, 21, 53, 54}

if (Current DHV Record .ModcCode in set {06, 08, 09})

If (CurrentMHVParameter 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 Pr/'or.Record.AdjustedHourlyValue >= 0 AND Xext Record. Adi]ustedHourly Value >= 0

Current DHV HBHA Value = (Prior Record. Ad) ustedHourly Value + Next
Record. Adj ustedHourly Value) / 2, ROUNDED to a single decimal.

else

Derived Hourly Missing Data Status = false
return result A

Prior DHV Record = latest DerivedHourly ValueData record where

DerivedHourly ValueData.ParameterCode = Current DHV Parameter AND
DerivedHourValueData.ModcCode in set MODC Set AND
[DerivedHourly ValueData.Date < Current Date OR

(DerivedHourly ValueData.Date = Current Date AND DerivedHourly ValueData.Hour < Current Hour )]
If Prior DHV Record is not null and is in current reporting period

else

Next DHV Record = earliest DerivedHourly ValueData record where

DerivedHourly ValueData.ParameterCode = Current MHV Parameter AND


-------
DerivedHourValueData.ModcCode in set MODC Set AND
[DerivedHourlyValueData.Date > Current Date OR

(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour > Current
Hour)]

If Next DHVRecord is not null and is in current reporting period

If Prior DII] 7^£'6r;«/,AdjustcdHourly Value >= 0 AND Xext Dill 7^6r;«/,AdjustcdHourly Value

>=0

Current DHV HBHA Value = {Prior DHV Record. AdjustedHourly Value + Next DHV
Record. AdjustedHourly Value) / 2, ROUNDED to three decimal places.

else

Derived Hourly Missing Data Status = false
return result A

else if {Current DHV Record. ModcCode == "11")

Prior Measured DHV Record = DerivedHourly ValueData record at latest time for the location where
DerivedHourlyValueData.ModcCode in set MODC Set AND
DerivedHourly ValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourly ValueData.BeginDate < Current Date OR

(DerivedHourly ValueData.BeginDate = Current Date AND DerivedHourly ValueData.BeginHour < Current
Hour))

If Prior Measured DHV Record is not null and is in the current reporting period

PriorDate = Prior Measured DHVRecord.BeginDate
PriorHour = Prior Measured DHVRecordBsgmRour

else

PriorDate = the day prior to the beginning of the current reporting period

PriorHour = 23

Next Measured DHV Record = DerivedHourly ValueData record at earliest time for the location where
DerivedHourly ValueData.ModcCode in set MODC Set AND
DerivedHourly ValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourly ValueData.BeginDate > Current Date OR

(DerivedHourly ValueData.BeginDate = Current Date AND DerivedHourly ValueData.BeginHour > Current
Hour))

If Next Measured DHV Record is not null and is in the current reporting period

NextDate = Next Measured DHV Record .BeginDate
NextHour = Next Measured DHVRecord .BeginHour

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
DerivedHourly ValueDataParameterCode = Current DHV Parameter 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 DH V Record. Perce nt Ay ai lab lc is null OR Current DHV Record. PercentAvailable >= 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	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] either before or after Critical Error Level 1

the current hour is invalid.

B	You reported an MODCCode of 11 in the DHV record for [param], but the length of the Critical Error Level 1

missing data period exceeds the allowable value for use of this missing data procedure.

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


-------
Check Code:	HOURDHV-17

Check Name:	Check Extraneous Data in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that certain fields are null in the DHV record.

Specifications:

Derived Hourly Null Status = false
Hourly Extraneous Fields = null

if (Current DHV Record X) litidjustedHourly Vtilue is not null)

append "UnadjustedHourly Value" to Hourly Extraneous Fields

if (Current /)//K/?6'ewY/.ScgmcntNumbcr is not null)

append "SegmentNumber" to Hourly Extraneous Fields

if (Current /)//K/?6'cwY/.OperatingConditionCode is not null)
if {Current DHV Parameter is not equal to "NOXM")

append "OperatingConditionCode" to Hourly Extraneous Fields

if (Current DHV Record. Flie ICodc is not null)

if (Current DHV Parameter not in set {N0XM,S02M,C02M})
append "FuelCode" to Hourly Extraneous Fields

if (Hourly Extraneous Fields is not null)
return result A

else

Derived Hourly Null Status = true

Results:

Result
A

Response	Severity

You reported [fieldnames] in the DHV record for [param]. This data should be blank. Non-Critical Error

Usage:

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 Mass Rate Derived Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

9

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

10

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

11

Process/Category:

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation


-------
Check Code:

HOURDHV-18

Check Name:	Check System in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that a valid Monitoring System is indicated in the DHV record.

Specifications:

Current DHVMon Sys Record = null
Derived Hourly System Status = false

if {Current DHV Parameter == "NOXR")
App E Constant Fuel Mix = false

ff {{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 DHV Record. IVT o ni to ri ngSy stem ID is NOT null
return result A

else

Derived Hourly System Status = true

else if {Current DHV Parameter <> "HI")

case {Current DHV Parameter)

NOXR: MODC Set = {01, 02, 03, 04, 14, 21, 22}
C02C: MODC Set = {01, 02, 03, 04, 21}
H20: MODC Set = {01, 02, 03, 04, 21}

If {Current DHV Record MomtormgSystQmK) is null)

If {Current DHV Method == "AMS")

Derived Hourly System Status = true

Else If {Current DHV Method == "AE")

If Current DHV Record.0\~>crc\{\\\gCo\\(h{\o\\CoAc is null
Derived Hourly System Status = true

else

return result J

Else If (Current DHV Record. ModcCodc in set MODC Set)
return result C

else

Derived Hourly System Status = true

If {Derived Hourly MODC Status == true AND Current DHV Method in set {CEM, PEM, MWD} AND Current DHV
Record. ModcCodc not in set {05, 53, 54} AND Current DHV Record. ModcCode not in set MODC Set)
return result B

else

Current DHV Mon Sys Record = find active MonitoringSy stemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHV wy/ . IVI o n i to ri ng Sy s t c m ID

if {Current DHV Mon Sys Record is null)
return result D


-------
else if (Derived MHV Mon Sys Record.SysicmTy pc C ode <> Current DHV System Type)
return result E

else if (Current DHV Method == "AE" AND Hourly Fuel Flow Countfor Gas + Hourly Fuel Flow Countfor
Oil > 0)

If (Derived DHV Mon Sys Record.FudCodc == 'MIX" OR Current DHV
Record. Ope rat i ngCo ndit io nCodc is not null)

if (Current DHV Record. Ope rat i ngCo ndit io nCodc == "E")
return result F

else

App E Constant Fuel Mix = true

App E Reporting Method = "CONSTANT"

App E Reported Value = Current DHV Record. Adj ustcdH ourly Value
App E Segment Number = Current DHV Record. SegmentNumber
App E Fuel Code = 'MIX"

App E NOXE System ID = Current DHV Record.MomtoringSystemlD
App E NOXE System Identifier = Current DHV 7te£w "MIX")
return result G

else

return result H

else

return result I

else

Derived Hourly System Status = true

else

Derived Hourly System Status = true


-------
Results:

Result	Response

A	You reported [fieldnames] in the DHV record for [param]. This data should be blank.

B	You reported a MonitoringSystemID in the DHV record for [param]. This field should

be blank when missing data substitution is used.

C	You did not report a MonitoringSystemID in the DHV record for [param]. This

information is required when you report measured data.

D	You reported MonitoringSystemID [ID] in the DHV record for [param], but according

to your monitoring plan this system was not active during the hour.

E	You reported MonitoringSystemID [ID] in the DHV record for [param], but the

SystemTypeCode of this system is not appropriate.

F	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.

G	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.

H	The OperatingConditionCode reported in the DHV record for NOXR is missing or

invalid.

I	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.

J	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.

Usage:

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

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


-------
Check Code:	HOURDHV-19

Check Name:	Check System Designation Code for System in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that the SystemDesignationCode of the monitoring system is compatible with reported

MODC.

Specifications:

If (Derived Hourly Mode Status == true AND Derived Hourly System Status == true AND Current DHVMon Sys Record is not null)
case (Current DHV Record. ModcCode)

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 <> "RM")
return result C

22: If {Current DHV Mon Sys Record. SystemDesignationCode <> "CI")
return result D

Results:

Result
A

B

C

D

Response

You reported anMODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a primary system.

You reported anMODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a backup system.

You reported anMODCCode of [modcCode] in the DHV record for [param], but
MonitoringSystemID [ID] is not a reference method system.

You reported anMODCCode 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

Usage:
1

Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report

NOx Emissions Rate Derived Hourly Evaluation


-------
Check Code:	HOURDHV-24

Check Name:	Check Formula in DHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	Checks the Formula ID in the DerivedHourly Value record and ensures that it can be used for the calculation.

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 DHV Record Formula I DKcy is null)

If (Current DHV Method in set {AMS, LME}) OR

(Derived Hourly Mode Status == true AND Current DHV Record. ModcCode == "40") OR
LME HI Method is not null)

Derived Hourly Formula Status = true

else if (Current DHV Parameter = "AE" AND App E Constant Fuel Mix == true)

Derived Hourly Formula Status = true

else if (Current DHV Parameter in set {NOXR, S02, HI, C02}) AND Current DHV Method in set {AD, AE})

Derived Hourly Formula Status = true

If (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil >1)

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-4 A"

HI: Current DHV Multiple Fuel Equation Code = "D-15A"

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 = "PEM")

Derived Hourly Formula Status = true

else if (Current DHV Parameter == "NOX" AND Current NOx Rate Method Code == "AE" AND Hourly Fuel Flow Countfor
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)

If (Current DHV Record. 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 DHVParameter in set {S02R, H20} AND Current I)HVRecord. MODCCodc == "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,MonitoringFormulaIDKey = Current DHV Record. Fo rmu 1 a ID K cy

If {Current DHV Formula Record is null)
return result E

else if {Current DHV Formula Record. ParameterCode is not equal to Current DHV Parameter)

If Current DHV Parameter == "HI" AND Current DHV Method = "AD" AND Hourly Fuel Flow Count for Gas
+ Hourly Fuel Flow Countfor Oil > 1 AND Current DHV Formula Record. Para mctc rCodc == "HIT" AND
Current DHV Formula Record. Eq ua t i o n Co dc == "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
Record.EquationCodc not in {F-21A,F-2]B,F-21D}

Count all active MonitoringFormulaData record for location where
EquationCode in {F-21A,F-2]B,F-21D}

if (Count =1)

Current DHV Formula Record = Find active MonitoringFormulaData record for location where
EquationCode in {F-21A,F-2]B,F-21D}

else if {Current DHV Method == "AE")

if (App E Constant Fuel Mix == true OR Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count
for Oil== 0)

return result H

else if {Derived Hourly Mode Status == true)

If {Current DHV Parameter in set {NOXR, H20, C02C} AND Current DHV Record. MOD C C ode NOT
in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54} AND Legacy Data Evaluation == false)
return result G


-------
A

B

C

D

E

F

G

H

I

J

ige:

1

2

3

4

5

6

7

8

9

10

11

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

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02M Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

Process/Category:

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation


-------
Check Code:

HOURDHV-25

Check Name:	Check Heat Input Equation Code

Related Former Checks:

Applicability:	General Check

Description:	Looks up the equation code for the current Heat Input Derived Hourly Record and verifies that it is appropriate

for heat input calculations.

Specifications:

CO 2 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 DHVFormula Record is not null)

Heat Input Equation Code= Current DHV Formula Record. EquationCode
if (Heat Input CEM Method Active For Hour == true)

if (Heat Input Equation Code in set {F-15, F-16, F-17, F-18} )

Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true

if (Heat Input Equation CodeO "F-15")

Moisture Needed = true
append "MIN" to H20 Missing Data Approach

if (Heat Input Equation Code= "F-15" OR Heat Input Equation Code = "F-16")

CO2 Cone Checks Needed for Heat Input = true
FC Factor Needed = true
else if (Heat Input Equation Code= "F-17")

02 Wet Checks Needed for Heat Input = true
FD Factor Needed = true
else if (Heat Input Equation Code = "F-18")

02 Dry Checks Needed for Heat Input = true
FD Factor Needed = true
else if (Heat Input Equation Code is null)
return result A

else

return result B

else if (Heat Input App D Meth od Active For Hour == true)
if (Heat Input Equation Code== "D-15A")

Derived Hourly Equation Status = true
else if (Heat Input Method Code == "ADCALC" and Heat Input Equation Code in set {F-21A, F-21B, F-21C,
F-21D, F-25})

Derived Hourly Equation Status = true
if (Heat Input Equation Code== "F-21D")

Apportionment HI Method Array fox the location = "NOCALC"
elseif (Heat Input Equation Code inset {F-19, F-19V, F-20, D-6, D-8} AND (Legacy Data Evaluation == true
OR Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for 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 {CurrentDHVMethod in set {CALC, ADCALC})

if (Heat Input Equation Code in set {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

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 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
Critical Error Level 1
Informational Message

Usage:

1	Process/Category: Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation


-------
Check Code:	HOURDHV-26

Check Name:	Check NOX Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:	Retrieves and validates NOx Mass Equation Code as a valid formula code for calculating NOx Mass

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 DHVFormula Record is not null)

NOx Mass Equation Code = Current DHV Formula Record. EquationCode
if (Current DHV Method == "CEM")

if (NOx Mass Equation Code in set {F-26A, F-26B} )

Derived Hourly Equation Status = true

Flow Monitor Hourly Checks Needed = true

if (NOx Mass Equation Code= "F-26B") // note that the old name fortius formula was "N-2"

Moisture Needed = true
append "MIN" to H20 Missing Data Approach

else if (NOx Mass Equation Code is null)
return result A

else

return result B

else if (Current DHV Method == "NOXR")

if (NOx Mass Equation Code== "F-24A")

Derived Hourly Equation Status = true

Heat Input Checks Needed for NOx Mass Calc = true

Nox Rate Checks Neededfor NOx Mass Calc = true

else if (NOx Mass Equation Code is null)
return result A

else

return result C

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true

if (Current NOx Rate Method Code == "AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor Oil
> 1 AND Legacy Data Evaluation == true)

NOx Mass Equation Code= "F-24A"

Results:

Result
A

B

C

Response	Severity

You reported FormulalD [ID] in the DHV record for [param], but you did not report a	Critical Error Level 1

FormulaCode for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for NOX, but the FormulaCode of this	Critical Error Level 1
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	Critical Error Level 1
formula is not appropriate for calculating NOX from a NOx-diluent system.


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation


-------
Check Code:	HOURDHV-27

Check Name:	Check NOXR Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:	Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for

calculation of NOx Rate.

Specifications:

02 Dry Checks Neededfor NOx Rate Calc = false
02 Wet Checks Neededfor NOx Rate Calc = false
CO2 Diluent Checks Neededfor NOx Rate Calc = false

if {CurrentDHVMethod == "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 Record. EquationCode

if (Current NOx Rate Method Code == "CEM")

if (NOx Rate Equation Code in set {19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D, 19-6, 19-7, 19-8, 19-9, F-5, F-6}
)

Derived Hourly Equation Status = true

ff (Current DHV Record.ModcCode in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})

if (NOx Rate Equation Code i 11 set {19-1, 19-4, F-5} )

02 Dry Checks Neededfor NOx Rate Calc = true
FD Factor Needed = true

else if (NOx Rate Equation Code in set {19-3, 19-5} )

02 Wet Checks Neededfor NOx Rate Calc = true
FD Factor Needed = true

else if (NOx Rate Equation Code in set {19-3D, 19-5D})

FD Factor Needed = true

else if (NOx Rate Equation Code in set {19-6, 19-7, 19-8, 19-9, F-6} )

CO2 Diluent Checks Neededfor NOx Rate Calc = true
FC Factor Needed = true

else if (NOx Rate Equation Code =="19-2")

02 Wet Checks Needed for NOx Rate Calc = true
FW Factor Needed = true

if (NOx Rate Equation Code in set {19-3, 19-3D, 19-4, 19-8}

Moisture Needed = true

append "MAX" to H20 Missing Data Approach

else if (NOx Rate Equation Code in set {19-5, 19-9}

Moisture Needed = true
append "MIN" to H20 Missing Data Approach

else (if (NOx Rate Equation Code is null)
return result A


-------
else

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

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 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

Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation


-------
Check Code:	HOURDHV-28

Check Name:	Check C02C Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:	Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for

calculation of C02 Cone (Either F-14A or F-14B)

Specifications:

CO 2 Cone CEM Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

if {Current DHVFormula Record is not null)

CO 2 Cone CEM Equation Code= Current DHV Formula Record. FormulaCode
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	Response	Severity

A	You reported FormulalD [ID] in the DHV record for C02C, but the FormulaCode of Critical Error Level 1

this formula is not appropriate for calculating C02C.

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation


-------
Check Code:

HOURDH V-29

Check Name:	Check C02 Equation Code

Related Former Checks:

Applicability:	General Check

Description:	Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for

calculation of C02 Mass (Either F-2 or F-l 1)

Specifications:

CO 2 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 DHVFormula Record is not null)

CO2 Mass Equation Code = Current DHV Formula Record.FormulaCode
if (CO 2 CEM Method Active For Hour == true)

Flow Monitor Hourly Checks Needed = true

CO2 Cone Checks Neededfor C02 Mass Calc = true

if (CO2 Mass Equation Code== "F-2" OR CO2 Mass Equation Code== "F-ll")

Derived Hourly Equation Status= true

If (C02 Mass Equation Code== 'F-2')

Moisture Needed = true
append "MIN" to H20 Missing Data Approach

if (Current I)H V Record. D i 1 ucntCap I ndicato r == 1)

Use C02 Diluent Cap for Co2 Mass Calc = true
Use 02 Diluent Cap for Co2 Cone Calc = true

else

return result A
else if (CO2 App D Method Active For Hour == true)
if (CO2 Mass Equation Code == "G-4A")

Derived Hourly Equation Status= true

else if (CO2 Mass Equation Code== "G-4" AND (Legacy Data Evaluation == true OR Hourly Fuel Flow Count
for Gas+ Hourly Fuel Flow Count for Oil == 1))

Derived Hourly Equation Status= true
return result B

else

return result A

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status= true


-------
Results:

Result
A

B

Response

You reported FormulalD [ID] in the DHV record for C02, but the FormulaCode of this
formula is not appropriate for calculating C02.

You reported FormulalD [ID] in the DHV record for C02, but a formula with a
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.

Severity

Critical Error Level 1
Informational Message

Usage:
1

Process/Category: Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation


-------
Check Code:

HOURDHV-30

Check Name:	Check S02 Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:	Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for

calculation of S02 Mass (Either F-l or F-2)

Specifications:

SO2 Monitor Hourly Checks Needed = false
if (S02 App D Method Active For Hour == true)

Hourly Fuel Flow Checks Needed for SQ2 = true

else

Hourly Fuel Flow Checks Needed for SOI = false

S()2 Equation Code = "" II null string
if (Derived Hourly Formula Status == true)

If {Current DHVFormula Record is not null)

SO2 Equation Code= Current DHV Formula Record. FormulaCode

if (S()2 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 (SO2 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 (S()2 Equation Code== "F-23" AND S02 F23 Method Active For Hour == true)

Derived Hourly Equation Status = true

else

return result B

else if (S()2 F23 Method Active For Hour == true)
if (SO2 Equation Code== "F-23")

Derived Hourly Equation Status = true

else

return result B

else if (SO2 App D Method Active For Hour == true)
if (S02 Equation Code= "D-12")

Derived Hourly Equation Status = true
else if (S()2 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

else

return result B

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true


-------
Results:

Result	Response

A	You did not report an MHV record for [param] for the hour.

B	You reported FormulalD [ID] in the DHV record for S02, but the FormulaCode of this

formula is not appropriate for calculating S02.

C	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.

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Informational Message


-------
Check Code:

HOURDHV-31

Check Name:	Check H20 Equation Code

Related Former Checks:

Applicability:	CEM Check

Description:	Looks up the Formula Identifier defined in the H20 Derived Hourly Record and ensures that it is a valid formula

for H20 calculations

Specifications:

H20 CEM Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

If {Current DHVFormula Record is not null)

H20 CEM Equation Code= Current DHV Formula Record. FormulaCode
if (H20 CEM Equation Code in set (F-31, M-1K)

Derived Hourly Equation Status = true

else

return result A

else

Derived Hourly Equation Status = true

Results:

Result	Response	Severity

A	You reported FormulalD [ID] in the DHV record for H20, but the FormulaCode of this Critical Error Level 1

formula is not appropriate for calculating H20.

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation


-------
Check Code:	HOURDHV-32

Check Name:	Verify Correct Reporting of NOXC MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

If {CurrentDHVMethod in set {CEM, CEMNOXR})

If {Current DHV Parameter == "NOXR")

Nox Cone Needed for NOx Rate Calc = false

If Current DHV Record. ModcCodc 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 Needed for 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 {Derived Hourly 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] in Non-Critical Error

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


-------
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 DHV Record. Adj ustedHourly Value is null OR

Current	Adj ustedHourly Value <= 0 OR

Current /)//K/?6'cwy/. Adj ustedHourly Value >= 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. AdjustedHourlyValue <> 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 DHV Record. Adj\istedHo\irlyVal\ie H20 Default Max Value)

Derived Hourly Default Status == false
return result C

Else

H20 Default Value = Current DHV Record Ad^u^cdHourhV^uc

Else if {Current DHV Parameter == "S02R")

If Current DHV Record. Adj ustedHourly Value is null OR

Current /)//K/?6'cwy/. Adj ustedHourly Value <= 0
Derived Hourly Default Status == false
return result D

If F23 Default Max Value is null
If (F23 Default Value > 0)

if {Current DHV/?£6Y>/Y/.AdjustcdHourly 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. AdjustedHowlyVaiue/Y/.AdjustcdHourly Value > F23 Default Max Value)

Derived Hourly Default Status == false
return result C

Else

F23 Default Value = Current DHVRecord Ad}ustcdHourly Value


-------
Results:

Result	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] is invalid. The value Critical Error Level 1

must be between 0 and 100.

B	You reported an MODCCode of 40 in the DHV record for [param], but the	Critical Error Level 1

AdjustedHourly Value is not equal to the active default value in your monitoring plan.

C	You reported an MODCCode of 40 in the DHV record for [param], but the	Critical Error Level 1

AdjustedHourly Value is outside the range of the active default values in your
monitoring plan.

D	The AdjustedHourly Value reported in the DHV record for [param] is invalid. The value Critical Error Level 1

must be greater than 0.

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

2	Process/Category:

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation


-------
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 NOXRHBHA 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)

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

C02C:	C02C Derived Hourly Status = false

H20:	H20 Derived Hourly Status = false

S02R:	S02R Derived Hourly Status = false

S02M:	S02M Derived Hourly Status = false
NOXM: NOXM Derived Hourly Status = false

C02M:	C02MDerived Hourly Status = false

HIT:	HIT Derived Hourly Status = false

Results:

Result

Response

Severity


-------
Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02 Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation


-------
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 Countfor Gas + Hourly Fuel Flow Countfor Oil > 0 AND App E Constant
Fuel Mix == false)

if (Current DHV Record.ScgmcnlNumbcr is not null)

append "SegmentNumber" to Hourly Extraneous Fields

if (Current DHV /?£6y>/y/.OpcFtitingConditionCodc is not null)

if {Current DHV Method <> "LME")

if (Current DHV Record. F uclCodc is not null)

append "FuelCode" to Hourly Extraneous Fields

if (Hourly Extraneous Fields is not null),
return result A

append "OperatingConditionCode" to Hourly Extraneous Fields

Results:

Result
A

You reported [fieldnames] in the DHV record for [param]. This data should be blank. Non-Critical Error

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation


-------
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 DHV Record MOBCCode = "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. Default Value is greater than 0, AND Monitor
Default.DclaultUnitsOnvicasiircCodc is equal to "MMBTUHR")

If {Current Hourly Op Record.0\iT\mc 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 Op
Record.OpTime is greater than 0 and less than or equal to 1)

If {LME OS is equal to true, AND the Quarter of the Current Reporting Period is equal to 2)

If the Current Month is April,

If {LME April 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 April Heat Input *
Current Hourly Op RecordHomLoaA * Current Hourly Op Record.OpTime /
LME April Load) + {LME April Heat Input Array for the location * Current
Hourly Op	HourLoad * Current Hourly Op Record.OpTime / LME

April Load Array for the location), and round the result to 1 decimal place.

else if {LME April Optime is greater than 0)

Calculate HIT Calculated Adjusted Value = {LME CP April Heat Input * Current
Hourly Op Record. OpTime / LME April Optime) + {LME April Heat Input Array for
the location * Current Hourly Op Record:OpTime / LME April 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

Calculate HIT Calculated Adjusted Value = ((LME CP Total Heat Input -
LME CP April Heat Input) * Current Hourly Op Record. HourLoad * Current
Hourly Op Record. OpTime / (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.HourLoad * Current Hourly Op
Record. OpT ime / (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
Op Time Array for the location - LME April Op Time Array for the location)), and round
the result to 1 decimal place.

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 * Current
Hourly Op RecordHomhoaA * Current Hourly Op Record.OpTime / LME Total Load)
+ (LME Total Heat Input Array fox the location * Current Hourly Op Record .HourLoad
* Current Hourly Op Record OpTime / 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,

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)


-------
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 (CurrentDHVRecord.AdiustQiMomXyVdlxiQ is null or is less than 0)

Rpt Period HI Reported Accumulator Array for this location = -1
return result A

else if (CurrentDHVRecord AA]ustedHourly Value 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 Record. A dj u s t cd H o u r ly Va 1 lie

else

Rpt Period HI Reported Accumulator Array for this location = Current DHV Record. A dj u s t ed H o u r ly Va 1 lie

If (HIT Calculated Adjusted Value is not null and Current DHV Record AA^u^cAHouxhV^uc is not equal to HIT Calculated
Adjusted Value)

If (HIT Calculated Adjusted Value is greater than 1 OR Current DHV Record A&\\iS{cAHo\.tf\\V'c\\\iC is greater than 1)

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"

if (ABS(Current DHV /fecwf/. AdjustedHourly Value - HIT Calculated Adjusted Value) > Heat Input Tolerance)
return result B.

Results:

Result	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] is invalid. The value Critical Error Level 1

must be greater than or equal to 0.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

C	You reported [fieldname] in the [type] record for [param] that is not rounded to the Critical Error Level 1

appropriate precision for that parameter.


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)


-------
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 DHVRecord.FuelCode is null,

Rpt Period S02 Mass Calculated Accumulator Array for 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 DHV Record. 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.

Otherwise,

S02R Default Value = MonitorDefault. Dc fau 11Va 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 for 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.

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 for this location = Rpt Period S02
Mass Calculated Accumulator Array for this location + S02M Calculated Adjusted
Value

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = SO 2 Mass Calculated
Adjusted Value


-------
Results:

Result
A

B

C

D

Response

The AdjustedHourly Value in the DH V 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)


-------
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 DerivedHourlyValue. FuelCode 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 for 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 for
this location + HIT Calculated Adjusted Value

else

April HI Calculated Accumulator Array for this location = HIT Calculated Adjusted Value

if {Current Month is not April OR LME Annual == true)

Rpt Period HI Calculated Accumulator Array for this location = -1

return result A

else

Results:

Result	Response	Severity

A	The AdjustedHourly Value in the DHV record for HIT could not be recalculated due to Informational Message

another error listed in this report.

Usage:
1

Process/Category: Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)


-------
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 (CurrentDHVRecord.AdiustQiMomXyVdlxiQ is null or is less than 0)

Rpt Period S02 Mass Reported Accumulator Array for this location = -1
return result A

else if (Current DHVRecord. Ad)ustcdHourly Value 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 DHV Record .AA) ustcdH ourly Value

Rpt Period S02 Mass Reported Accumulator Array for this location = Current DHV Record. A dj u s t ed H o u r l y Va 1 lie

If (S02M Calculated Adjusted Value is not null AND Current DHV Record. A dj u s t ed H o u r ly Va 1 lie is not equal to S02M
Calculated Adjusted Value)

S02Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02M" AND
UOM = "LB"

if (ABS (Current DHV Record .Adi) ustcdH ourly Value - S02M Calculated Adjusted Value) > S02 Mass Tolerance)

else

return result B

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)


-------
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 DHVRecord.FuelCode is null,

Rpt Period C02 Mass Calculated Accumulator Array for 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 DHV Record. 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.

Otherwise,

C02R Default Value = MonitorDefault.DefaultValue

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 for 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.

if (Rpt Period C02 Mass Calculated Accumulator Array for this location is not null)

if (Rpt Period C02 Mass Calculated Accumulator Array for 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


-------
Results:

Result
A

B

C

D

Response

The AdjustedHourly Value in the DH V 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)


-------
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 (CurrentDHVRecord.AdiustQiMomXyVdlxiQ is null or is less than 0)

Rpt Period C02 Mass Reported Accumulator Array for this location = -1
return result A

else if (CurrentDHVRecord AA)ustedHourly Value 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 DHV Record Ad) ustedHourly Value

Rpt Period C02 Mass Reported Accumulator Array for this location = Current DHV Record. A d j us tcdH o u rly Va 1 lie

If (C02M Calculated Adjusted Value is not null AND Current DHV Record Ad) ustedHourly Value is not equal to C02M
Calculated Adjusted Value)

C02Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"

if (A B S( Current DHV Record. Adj ustedHourly V al lie - C02M Calculated Adjusted Value) > C02 Mass Tolerance)

else

return result B

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)


-------
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 DHVRecord.FuelCode 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

Otherwise,

Default Condition = null

If Current	OperatingConditionCode is null,

Default Condition = "A"

else if Current DHV Record.Opc rat i ngCo ndit io nCodc in set {C, U, P, B}

Default Condition = Current DHV Record.0\~>cri\{\ngCo\\&\{\o\\CoAc

If Default Condition 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 B

else

if (Current DHV/?£6y>/y/. 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 CurrentDHV
Record. FuelCode.

else

Locate MonitorDefault record for the hour and location where ParameterCd = "NOXR". DefaultPurposeCd =
"LM", OperatingConditionCode is equal to Default Condition, and FuelCode is equal to CurrentDHV
Record. Fuel Code.

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".

if {Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1

return result C

Otherwise,

NOXR Default Value = MonitorDefault.DefaultValue

if {Default Condition is in set { A,C,B,P} AND Mon;Yw/)m/?.Dcfau 11SourccCodc == "TEST")
if (MonitorDefault. G roup 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
CurrentOperatingD ate/Hour.

else if {Default Condition == "B")

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the
FuelCode = Current DHV Record. FuelCode, OperatingConditionCode ==
and EndDate/EndHour is on or before the CurrentOperatingD ate/Hour.

else if (Default Condition == "P")

Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the
FuelCode = Current DHV Record. FuelCode, OperatingConditionCode ==
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
UnitDefaultTestRecordsByLocationForQAStatusEndDatQ.

Otherwise,

UDEFStatus = "GROUP"

Set UDEFExpiration Date to 5 years after the end of the quarter of the
MonitorDefault.BcginDMc.

if {Current DHV Record. OperatingConditionCode is equal to "U")

Locate MonitorDefault record for the hour and location where ParameterCd= "NORX",

DefaultPurposeCd = 'WD", OperatingConditionCode is equal to Default Condition, FuelCode is in LME
Fuel Code List, FuelCode is not equal to Current DHV Record. FuelCode, Default Value is greater than
NOXR Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".

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. FuelCode, Default Value is greater than
NOXR Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".

If found,

if {Current Month is not April OR LME Annual == 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

location where
"A" or "B",

location where
"A" or "P",


-------
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 for this location =
NOXM Calculated Adjusted Value

Results:

Result	Response

A	The AdjustedHourly Value in the DH V record for [param] could not be recalculated,

because you did not report a FuelCode in this record.

B	You reported an invalid OperatingConditionCode in the DHV record for [param]. The

AdjustedHourly Value could not be recalculated.

C	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.

D	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.

E	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.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Severity

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

Critical Error Level 1

Informational Message


-------
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 (CurrentDHVRecord.AdiustQiMomXyVdlxiQ is null or is less than 0)

Rpt Period NOx Mass Reported Accumulator Array for this location = -1
return result A

else if (CurrentDHVRecord AA]ustedHourly Value 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 DHV Record. Adj us t edH o u rly Va 1 lie

else

Rpt Period NOx Mass Reported Accumulator Array for this location = Current DHV
Record. A dj us tcdH o u rl v Va 1 uc

If (NOXM Calculated Adjusted Value is not null AND Current DHV Record. k^]u^[cAY{oux\\\/i\\uc 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 (A B S( Current DHV Record. Adj ustedHourly V al uc - NOXM Calculated Adjusted Value) > NOX Mass Tolerance)
return result B

Results:

Result	Response	Severity

A	The AdjustedHourly Value reported in the DHV record for [param] is invalid. The value Critical Error Level 1

must be greater than or equal to 0.

B	The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1

the recalculated value.

C	You reported [fieldname] in the [type] record for [param] that is not rounded to the Critical Error Level 1

appropriate precision for that parameter.

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)


-------
Check Code:	HOURDHV-46

Check Name:	Equation Code Consistent with Moisture Basis

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Severity

S02M Derived Hourly Evaluation (LME)

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report


-------
Check Code:

Check Name:

Related Former Checks:

Applicability:

Description:

Specifications:

If UDEF Status is not null,

ff {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 uclCodc 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.

HOURDHV-47

Unit Default Test Expiration Check
LME Check

Results:

Result

A

B

C

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)


-------
Check Category:
Hourly General


-------
Check Code:	HOURGEN-1

Check Name:	Initialize Accumulators for Summary Value Data

Related Former Checks: HOUROP-27
Applicability:	General Check

Description:	Initializes summary value data: the operating time, operating hours, and reported and calculated values for each

parameter.

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 for 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 Op Time 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
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

Operating Date Array for the location = empty date list


-------
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:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-2

Check Name:	Reporting Period Details

Related Former Checks:

Applicability:	General Check

Description:	Checks the current reporting period to see if the monitoring plan is active. Also sets a parameter indicating

whether legacy data is being processed.

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	. Bcgi nRcpo rt Pcriod) OR

{Current Monitoring Plan Record. E ndRepo rt Pc riod is not null AND Current Monitoring Plan Record. EndRcportPcriod <
Current Reporting Period))

Abort Hourly Checks = true
return result A

else

Locate a UnitProgram record for any unit in the configuration where ProgramCode in set {NBP, CAIROS, TRNOXOS, NHNOX,
SIPNOX}, UnitMonitorCertBeginDate is on or before the December 31 of the year 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,

OS Reporting Requirement = true

Locate all LocationReportingFrequency record for any unit in the configuration where BeginQuarter is on or before the Current
Reporting Period, and the EndQuarter is null or is on or after the Current Reporting Period.

If found, and the ReportingFrequencyCode in all records == "Q",

Annual Reporting Requirement = true

else if found, and the ReportingFrequencyCode in all records == "OS",

If OS Reporting Requirement == false
Abort Hourly Checks = true
return result B

else if the Quarter of the Current Reporting Period is equal to 1 or 4,

Abort Hourly Checks = true
return result C

Otherwise,

Abort Hourly Checks = true
return result B

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 thanO,

If found,

Reporting Period Operating = true

else,

Reporting Period Operating = false

Set LMEAnnual to false.

Set LME OS to false.

Set AnyMonitoringMethodFound to false.

Set OsMonitoringMethodFound to false.

Locate MonitorMethod record for ANY location in the file where:

1)	ParameterCode in set {S02M, NOXM, C02M}.

2)	MethodCode = "LME".

3)	BeginDate is on or before the first day of the Current Reporting Period.

4)	EndDate is null or is on or after the last day of the Current Reporting Period.

If found,

Set AnyMonitoringMethodFound to true

If Current Reporting Period is for the 2nd or 3rd Quarter,

Set OsMonitoringMethodFound to true

Locate all MonitorQualification records for all units in the monitoring configuration where:

1)	QualificationTypeCode is equal to "LMEA".

2)	BeginDate is on or before the last day of the reporting period.

3)	EndDate is null or is on or after January 1 of the year of the Current Reporting Period.
If found,

Set LME Annual to true.

If OsMonitoringMethodFound is false, AND Current Reporting Period is for the 2nd Quarter,
Locate MonitorMethod record for ANY location in the file where:

1)	ParameterCode in set {S02M, NOXM, C02M}.

2)	MethodCode = "LME".

3)	BeginDate is on or before May 1st of the year of the Current Reporting Period.

4)	EndDate is null OR is on or after the last day of the Current Reporting Period.

If found,

Set AnyMonitoringMethodFound to true.

Set OsMonitoringMethodFound to true.

If OsMonitoringMethodFound,

Locate all MonitorQualification records for all units in the monitoring configuration where:

1) QualificationTypeCode is equal to "LMES".


-------
2)	BeginDate is on or before the last day of the reporting period.

3)	EndDate is null OR is on or after January 1 of the year of the Current Reporting Period.

If found,

Set LME OS to true.

If AnyMonitoringMethodFound,

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:

1)	ParameterCode = "HIT".

2)	BeginDate is on or before:

a)	If Current Reporting Period is for the 2nd quarter AND LME Annual is false, then May 1st of the year of the
Current Reporting Period.

b)	Otherwise, the first day of the Current Reporting Period.

3)	EndDate is null OR is on or after the last day of the Current Reporting Period.

If not found for any location,

Abort Hourly Checks = true
return result G

Else

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 thsCurrent
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" or "TRNOXOS" 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

Results:

Result	Response	Severity

A	The locations in the file do not represent a valid monitoring configuration during the Fatal

reporting period. The file will not be evaluated.

B	The active Reporting Frequency records for this configuration are missing or invalid. Fatal

The file will not be evaluated. Please contact ECMPS technical support for assistance
with this matter.

C	According to the Reporting Frequency records, this monitoring configuration is an Fatal

ozone-season-only reporter, however the reporting period is not within the ozone season.

The file will not be evaluated.

D	You have reported an LME Annual Qualification record in your monitoring plan, but, Fatal

according to the Reporting Frequency records, this configuration is not an annual
reporter. The file will not be evaluated.

E	You have reported an LME Ozone Season Qualification record in your monitoring plan, Fatal

but, according to the Unit Program records, this configuration does not report ozone
season totals. The file will not be evaluated.

F	You have reported an LME method in your monitoring plan for one or more units in this Fatal

configuration, but you have not reported an LME qualification record. The file will not
be evaluated.

G	You did not report an active heat input method for one or more locations in the file. The Fatal

file will not be evaluated.

H	The active heat input methods reported for the locations in the file are inconsistent. The Fatal

file will not be evaluated.

I	This file contains at least one unit that is retired. Please contact EPA if you believe that Critical Error Level 2

all units in this configuration should report emissions data during this reporting period.


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-3

Check Name:

Related Former Checks:

Calculate Total Load for LME Configuration for Reporting Period

Applicability:

Description:

Specifications:

LME Check

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

ff {LME HI Method is not null)

ff {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 DataOpTime is not equal to 0 or Hourly Op /.)
-------
If found, AND LME April Load is equal to 0 and LME April Optime is equal to 0,
set Abort Hourly Checks to true, and return result C.

else if not found AND {LME April Load is greater than 0 ox LME April Optime is greater than 1),
return result F.

Locate an LTFF record for any location in the monitoring configuration during the reporting period where
the FuelFlowPeriodCode is equal to "MJ".

If found,

If {LME Total Load - LME April Load) is equal to 0 and {LME Total Optime - LME April
Optime) is equal to 0,

set Abort Hourly Checks to true, and return result E.

else

If {LME Total Load - LME April Load) is greater than 0 or {LME Total Optime - LME April
Optime) is greater than 1,
return result G.

Locate an LTFF record for any location in the monitoring configuration during the reporting period.
If found,

If LME Total Load is equal to 0 and LME Total Optime is equal to 0,
set Abort Hourly Checks to true, and return result B.

else

If LME Total Load is greater than 0 or LME Total Optime is greater than 1,
return result D.

else

else

Results:

Result
A

Response

You have reported MHHI as the heat input method for this configuration, but you have
reported a long-term fuel flow record.

You have reported a long-term fuel flow record for this reporting period, but the sum of
the load and operating time values in the hourly records (where MHHIIndicator is not
equal to 1) are equal to 0.

You have reported a long-term fuel flow record for April, but the sum of the load and
operating time values in the hourly records (where MHHIIndicator is not equal to 1) are
equal to 0.

You have reported LTFF as the heat input method for this configuration, but you have
not reported a long-term fuel flow record for this reporting period.

You have reported a long-term fuel flow record for May and June, but the sum of the
load and operating time values in the hourly records (where MHHIIndicator is not equal
to 1) are equal to 0.

You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for April.
You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for May/June.

Severity
Fatal

B

Fatal

C

Fatal

D

Critical Error Level 1

E

Fatal

F

Critical Error Level 1

G

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:	HOURGEN-7

Check Name:	Validate LME Eligibility

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

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 {LMEAnnual == 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 Annual S02 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 OpValue to Annual NOx.

Locate an Op Supp Data record for the location and quarter/year being checked where the
OpTypeCode = "S02M".

If (found)

add OpValue to Annual S02.

If (the year being evaluated is the year prior to the Current Reporting Period Year)

If {Annual NOx is greater than 100 or Annual S02 is greater than 25)
set Final LME Year to true.

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.

Results:

Result
A

Response

You have reported an active LME A 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

B

Fatal

C

Critical Error Level 2

D

Informational Message


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-8

Check Name:

Monitor Plan Evaluation Check

Related Former Checks:
Applicability:

General Check

Description:

Specifications:

Set MpSuccessfulfyEvaluated = 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 MpSuccessfulfyEvaluated = 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:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-9

Check Name:	QA/Cert Test Evaluation Check

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

Locate any QA/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 QA/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	Response	Severity

A	At least one QA/certification test associated with this monitoring configuration has Critical Error Level 1

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.

B	At least one QA/certification test associated with this monitoring configuration has not Critical Error Level 1

been evaluated. You must evaluate all prior or concurrent QA/certification tests in order
to complete the evaluation of this quarterly emissions file.

C	The emissions quarterly reported cannot be submitted, because EPA has required the Critical Error Level 1

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.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-IO

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 SeverityCd 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:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:	HOURGEN-11

Check Name:	Test Extension/Exemption Evaluation Check

Related Former Checks:

Applicability:	General Check

Description:

Specifications:

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	Response	Severity

A	At least one test extension/exemption associated with this monitoring configuration has Critical Error Level 1

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.

B	At least one test extension/exemption associated with this monitoring configuration has Critical Error Level 1

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.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
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 (CANSUBMIT = '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 ATA1).

If found,

return result C.

Results:

Result
A

B

C

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


-------
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

B

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

Informational Message

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
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


-------
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 RA TA TestRecordsByLocationForOAStatus 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,

If RA TA TestRecordsByLocationForOAStatus.TcstRcasonCodc equal to "INITIAL" then

Locate the latest QACertEventsForEMEvaluation where SystemID is equal to the SystemID being
checked and QACertEventCode equal to "305"

If QACertEventforEMEvaluation.TestCompletionDate is after the
RA TA TestRecordsByLocationForOAStatus.EndDalc

Set ExpirationDate to five years after the end of the quarter of the
OA CertEventforEMEvaluation. T e stCompletionD ate

Else

Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecordsByLocationForOAStatus.EndD'Mc

Else

Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecordsByLocationForQAStatusHndDate.

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 AppendbcETestRecordsBy Location ForOAStatus for 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
Appen dixETestRecordsIiy Location ForQAStatusM\\(\DMc.

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 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
UnitDefaultTestRecordsByLocation ForQAStatus.EndDnic.

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


-------
Results:

Result	Response

A	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.

B	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.

C	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 RATAs expire after five years.

D	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.

E	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.

F	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.

G	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.

H	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.

I	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.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Evaluation

Severity

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message

Informational Message


-------
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 testing Informational Message

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


-------
Check Code:	HOURGEN-17

Check Name:	Missing Peaking or Gas Fired Qualification Percent Check

Related Former Checks:

Applicability:	General Check

Description:	This check determines whether qualification percent rows are missing for a Year Round or Ozone Season

Monitor Qualification record.

Specifications:

If Mp Successfully Evaluated equals true,

Set Qualification Percent Missing List = null.

For each QualificationRecord record in MpOualification Records where QualificationTypeCode is equal to "PK", "SK" or "GF",
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
gMa//y?cafto«i?ecor
-------
Check Code:	HOURGEN-18

Check Name:	Validate Unit Fuel

Related Former Checks:

Applicability:

Description:	Validate that the fuel designated as primary is used at least 60 percent for the entire year of the time for a unit

which has operated greater 168 op hours

Specifications:

If Quarter of the Current Reporting Period is equal to I,

For each unit in MonitoringPlanLocationRecords

Locate all Facility Unit Fuel Records for the unit where :

1)	Indicator Code is equal to "P"

2)	BeginDate is prior to the end date of Current Reporting Period.

3)	EndDate is null OR is after the begin date of Current Reporting Period.

If found,

Set Sum of Op Hours to 0

Locate all Facility Operating Supp Data Records for the unit where:

a)	The calendar year is the year prior to the calendar year of Current Reporting Period.

b)	Parameter Code is equal to "OPHOURS".

c)	Fuel Code is equal to NULL.

For each located record

Increment Sum of Op Hours by Facility Operating Supp Data Records:OpValue

If Sum of Op Hours > 168

Set Sum of Op Hours by Fuel to null

Locate all Facility Operating Supp Data Records for the unit where:

a)	The calendar year is the year prior to the calendar year of Current Reporting Period.

b)	Parameter Code is equal to "OPHOURS".

c)	Fuel Code is NOT equal to NULL.

For each located record

Increment Sum of Op Hours by Fuel for Facility Operating Supp Data Records.¥uc\C.odc by
Facility Operating Supp Data Records. O p Va 1 lie

For each FuelCode in Sum of Op Hours by Fuel

If (Sum of Op Hours by Fuel / Sum of Op Hours is greater than or equal to 0.60)

For each located Facility Unit Fuel Records record

If Facility Unit Fuel Records. FuclCodc is not equal to the FuelCode for Sum of

Op Hours by Fuel

return A


-------
Results:

Result	Response	Severity

A	The current active primary fuel type defined in the monitoring plan is inconsistent with Informational Message

the prior year operating hours by fuel type. Please update the primary fuel type in the
monitoring plan to match the prior year predominant fuel type by operating hours.

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-19

Check Name:	Initialize Sorbent Trap Check Parameters

Related Former Checks:

Applicability:

Description:	Initializes Sorbent Trap Dictionary and Sorbent Trap Record. Sorbent Trap Record is always initialized to null,

but is initialized here so that it always exists and is owned by an ancestor category.

Specifications:

Set MatsSorbentTrapEvaluationNeeded to false.

Initialize MatsSorbentTrapDictionary to an empty dictionary.

Initialize MatsSamplingTrainDictionary to an empty dictionary.

Initialize MatsSorbentTrapListByLocationArray with the number of elements equal to CurrentLocationCount.

For each record in MatsSorbentTrapSupplementalDataRecords

II Note that MatsSorbentTrapSupplementalDataRecords only contains records for which the begin date of the reporting period
// is between the BeginDate and EndDate of the Sorbent Trap Supplemental Data record.

Set SorbentTrapInformation record with:

1)	SorbentTrapValidExists set to false .

2)	SorbentTrapForQuarterBoarder set to true.

3)	SorbentTrapBeginDateHour set to BeginDateHour for the current record in MatsSorbentTrapSupplementalDataRecords

4)	SorbentTrapEndDateHour set to EndDateHour for the current record in MatsSorbentTrapSupplementalDataRecords

5)	SamplingTrainProblemComponentExists set to false.

6)	SamplingTrainDictionary set to an empty dictionary.

7)	OperatingDateList set to an empty list of dates.

Set MatsSorbentTrapDictionary entry to SorbentTrapInformation, where key is equal to Trapld for the current record in
MatsSorbentTrapSupplementalDataRecords.

Set LocationPosition to the postion of the MatsSorbentTrapSupplementalDataRecords LocatiovKey in
MonitoringPlanLocationRecords.

Append SorbentTrapInformation to MatsSorbentTrapListByLocationArray element for LocationPosition.

If Count of records in MatsSorbentTrapRecords is greater than 0,

Set MatsSorbentTrapEvaluationNeeded to true.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-20

Check Name:

Related Former Checks:

Initialize Weekly System Integrity Test Dictionary

Applicability:
Description:

Initializes the weekly system integrity test dictionary to have a Componentld key and an entry with the followinj

fields:

1)	MostRecentTestRecordto hold a CurrentWeeklySystemlntegrity record.

2)	LastEvaluatedTestRecord to hold a CurrentWeeklySystemlntegrity record.

3)	OpertingDateList to hold a date list.

4)	LastOperatingDate to hold a date.

Specifications:

Initialize WsiTestDictionary with a string key for Componentld, and an entry with the following fields:

1)	MostRecentTestRecord to hold a CurrentWeeklySystemlntegrity record.

2)	LastEvaluatedTestRecord to hold a CurrentWeeklySystemlntegrity record.

3)	OperatingDateList to hold a date list.

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:	HOURGEN-21

Check Name:	Initialize General Lists

Related Former Checks:

Applicability:

Description:	Initializes list used during the evaluation process by individual checks.

Validation Tables:

Test Result Code (Lookup Table)

Specifications:

Append each TestResultCodeLookupTable.TestResultCode to TestResultCodeList delimited by a comma.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:

HOURGEN-22

Check Name:

Related Former Checks:

Initialize System Parameters

Applicability:
Description:

General Check

Initializes values based on system parameters.

Validation Tables:

Vw System Parameter (Lookup Table)

Specifications:

Set MatsDailyCalRequiredDate to null.

Locate SystemParameterLookupTable record where Sys Param Name is equal to 'MATSRULE.

Set MatsDailyCalRequiredDate to the located SystemParameterLookupTable.Pc\n\m Vc\hic2.

If found,

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Code:	HOURGEN-4

Check Name:	Emission Comment Reporting Period Valid

Related Former Checks:

Applicability:	General Check

Description:	This check determines whether or not Emission Comment Reporting Period is valid.
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:

1	Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation


-------
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:

1	Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation


-------
Check Code:	HOURGEN-6

Check Name:	Duplicate Emission Comment Records

Related Former Checks:

Applicability:	General Check

Description:	This check determines if there is another EmissionComment record with the same key fields.

Specifications:

For a Emission Comment record:

Locate another EmissionComment record for the monitoring plan with a ReportingPeriod equal to the ReportingPeriod in the currenl
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


-------
Check Category:
Hourly Monitor Data


-------
Check Code:	HOURMHV-1

Check Name:	Initialize S02C Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameters and output parameters for subsequent monitor hourly checks for S02C.

Specifications:

Current MHV Parameter = "S02C"

S02C Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-2

Check Name:	Initialize H20 Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for H20.

Specifications:

Current MHV Parameter = "H20"

H20 MHV Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-3

Check Name:	Initialize NOXC Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for NOXC.

Specifications:

Current MHV Parameter = "NOXC"

NOXC Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-4

Check Name:	Initialize Flow Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameters and output parameters for subsequent monitor hourly checks for FLOW.

Specifications:

Current MHV Parameter = "FLOW"

FLOW Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-5

Check Name:	Initialize C02C Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for C02C.

Specifications:

Current MHV Parameter = "C02C"

C02C MHV Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-6

Check Name:	Initialize 02 Dry Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02 Dry.

Specifications:

Current MHV Parameter = "02D"

02 Dry Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-7

Check Name:	Initialize 02 Wet Hourly Monitor Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02C Wet.

Specifications:

Current MHV Parameter = "02 W"

02 Wet Calculated Adjusted Value = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-8

Check Name:	Check MODC in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	Basic check to ensure that MODC reported in the MHV record is valid for the parameter. Also initializes

variables for the category.

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'

If (Current MHV Record. ModcCodc == "23")

ff (S02 Bypass Code == "BYMAXFS")

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

else if (S()2 Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

ff {Current MHV Record. ModcCode 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")

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

If (NOx Cone Needed for Nox Mass Calc == true)

If (Current MHV Record.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 MHVRecord Needed = false

If {Current MHV Record. 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 CO 2 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'

C02C MHV MODC = Current C02 Cone Monitor Hourly Record .ModcCode

If {{C02 Fuel Specific Missing Data == true AND CO2 Cone Checks Neededfor 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 {{C02 Cone Checks Needed for Heat Input == true) OR (CO 2 Cone Checks Needed for C02 Mass Calc == true))
If {CurrentMHVRecord.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 Neededfor NOx Rate Calc == true) OR (CO 2 Diluent Neededfor MATS ==
true)) AND {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 17, 20, 21, 53, 54})
return result E

Else

Complete MHV Record 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'

02 Dry MODC = Current 02 Dry Monitor Hourly Record. ModcCode


-------
If (Current MHV Record.MoistureBasis is null)

Current MHVParameter Description = "02C"

else

Current MHV Parameter Description = "02C with a MoistureBasis of" + Current MHV Record. IVI o i s t u re B a s i s

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 (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 Neededfor NOx Rate Calc == true) OR (02 Dry Neededfor MA TS == 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'

02 WetMODC = Current 02 Wet Monitor Hourly Record .ModcCode

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. IVI o i s t u re B a s i s

If (Heat Input Fuel Specific Missing Data == true AND 02 Wet Checks Neededfor Heat Input == true)

Current MHV Fuel Specific Hour = true

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) OR (02 Wet Neededfor MA TS == 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


-------
H20: Current MHVRecord = CurrentH20 Monitor Hourly Record
Current MHV Parameter = 'H20'

H20 MHVMODC = CurrentH20 Monitor Hourly Record.ModcCode

If (H2() 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 CO2 Cone Checks Neededfor 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 {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 Neededfor 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	Response

A	The MODCCode reported in the MHV record for [param] is invalid.

B	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.

C	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 a heat input based
emission rate.

D	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.

E	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 diluent system to calculate the
heat input based emission rate.

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

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1


-------
Check Code:

HOURMHV-9

Check Name:	Check Percent Monitor Availability in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	Performs a series basic checks to ensure that the reported monitor percent available is between 0 and 100,

inclusive, then checks to see that percent available is within permitted ranges for specific MODC codes

Specifications:

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 MH V Record. Pcrcc lit Ay a i lab lc < 0.0)
return result D

Else

case (Current MHV Record. ModcCode)

= 06:

If Current MHVRecord. Percent Available >= 90.0
Monitor Hourly Pma Status = true

Else

return result E

= 08:

If Current MHV Record.Percent Available >= 95.0
Monitor Hourly Pma Status = true

Else

return result E

= 09:

If Current MH V Record. Pc rcc lit Ay a i lab lc >= 90.0 AND Current MHV Record.Percent Available < 95.0
Monitor Hourly Pma Status = true

Else

return result E

= 10:

If Current MH V Record. Pc rcc lit A va i lab lc >=80.0 AND Current MHV Record.PercentAvailable < 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


-------
A

B

C

D

E

F

ige

1

2

3

4

5

6

7

8

9

= 11:

If Current MH V Record. Pc rcc lit Ay a i 1 ab 1 c >=90.0
Monitor Hourly Pma Status = true

Else

return result E

All other MODC Codes:

Monitor Hourly Pma Status = true

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

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation


-------
Check Code:

HOURMHV-IO

Check Name:	Check Prior QA'd Hours for MODC 07

Related Former Checks:

Applicability:	CEM Check

Description:	For Method of Determination Code 07, all prior hours in reporting period are checked to ensure that total of

QA'd hours is below a certain threshold

Specifications:

if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if {Current MHV Record ModcCodz == 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 MHV Record.MoistareBasis OR
MonitorHourlyValueData.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

MonitorHourlyValueData.ModcCode in set {01, 02, 04, 17, 20, 21, 53} AND
MonitorHourly ValueData.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.ParameterCode 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

Results:

Result
A

Response	Severity

You reported an MODCCode of 07 in the MHV record for [param], but too many prior Critical Error Level 1

quality assured hours exist in evaluation period for use of this missing data approach.


-------
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


-------
Check Code:	HOURMHV-11

Check Name:	Check Extraneous Data in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that certain fields are null in the MHV record.

Specifications:

Monitor Hourly Null Status = false
Hourly Extraneous Fields = null

if (Current M//K/?6'cwY/.AdjustcdHourly Value is not null AND Current MHV Parameter not in set {S02C, NOXC, FLOW})
append "AdjustedHourly Value" to Hourly Extraneous Fields

if (Current MHV Record.MoistareBasis is not null AND Current MHV Parameter not in set {02D, 02 W, 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 blank. Non-Critical Error

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


-------
Check Code:

HOURMH V -12

Check Name:	Check For Correct Use of MODCs

Related Former Checks:

Applicability:	CEM Check

Description:

Specifications:

Current MHVHBHA 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
MonitorHourlyValueData.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

MonitorHourly ValueData.ModcCode in set {01, 02, 03, 04, 17, 20, 53, 54} AND
MonitorHourly ValueData.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 MHV Record is not null and is in current reporting period

If Prior Mill VtecwY/.UnadjustcdHourlv Value >= 0 AND Next MHV
itecordUnadjustedHourlyValue >= 0

Current MHV HBHA Value = (Prior MI I\ VtecwY/.UnadjustcdHourlv Value + Next MHV
itecordUnadjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A

case (Current MHV Parameter)

S02C:

NOXC:

FLOW:

C02C OR C02CSD:
H20:

MODCSet={01, 02, 03, 04, 16, 17, 19, 20, 21, 22, 53, 54}
MODCSet = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}
MODC Set = {01, 02, 03, 04, 20, 53, 54}

MODCSet = {01, 02, 03, 04, 17, 20, 21, 53, 54}

MODCSet = {01, 02, 03, 04, 21, 53, 54}

if (Current MHV Parameter in set {H20, C02C})

Prior Record = latest MonitorHourlyValueData 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 Pr/'ori?ecor= 0 AND Xexi Record.UnadjustcdHourly Value

>=0

Current MHVHBHA Value = (Prior itecordUnadjustedHourlyValue + Next
Record. U nadj ustcdH ourly Value) / 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
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)]

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)]

If Next MHV Record is not null and is in current reporting period

If Prior MI I\	U nadj ustedHourly Value >= 0 AND AND Next MHV

Record. U nadj ustcdHourly Val uc >= 0

Current MHV HBHA Value = (Prior MI I\ VtecwY/.UnadjustcdHourlv Value +
Xexi \III\	U nadj ustedHourly Value) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A

else

Prior MHV Record = latest MonitorHourly ValueData record where

MonitorHourly ValueData.ParameterCode = Current MHV Parameter 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 MHVRecord is not null and is in current reporting period

NextMHVRecord = 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 MonitorHourlyValueData.Hour >
Current Hour)]

If Next MHV Record is not null and is in current reporting period

If Prior MI I\ Vtecon:/. Adj ustcdHourly Value >= 0 AND Next MHV
Record. Adj ustcdH ourly Value >= 0

if {Current MHV Parameter == "FLOW")

Current MHV HBHA Value = (Prior MHV

Record. Adj ustcdHourly Value + Next MHV

Record. Adj ustcdH ourly Value) / 2, ROUNDED to the nearest 1000.

else

Current MHV HBHA Value = (Prior MHV
Record. Adj ustcdHourly Value + Next MHV

Record. AdjustcdHourly Value) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result B

else if (Current MHV Record.ModcCode == "11")

case (Current MHV Parameter)

NOXC: MODC Set = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}

FLOW: MODC Set = {01, 02, 03, 04, 20, 53, 54}

Prior Measured MHV Record = MonitorHourlyValueData record at latest time for the location where
MonitorHourlyValueData.ModcCode in set MODC Set AND
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourlyValueData.BeginDate < Current Date OR

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour< Current Hour)

)

If Prior Measured MHV Record is not null and is in the current reporting period

PriorDate = Prior Measured MHV Record .BeginDate
PriorHour = Prior Measured MHVRecord .BeginHour

else

PriorDate = the day prior to the beginning of the current reporting period

PriorHour = 23

Next Measured MHV Record = MonitorHourlyValueData record at earliest time for the location where
MonitorHourlyValueData.ModcCode in set MODC Set AND
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourlyValueData.BeginDate > Current Date OR

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour > Current
Hour))

If Next Measured MHV Record is not null and is in the current reporting period

NextDate = Next Measured MHVRecord .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
MonitorHourlyValueData.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 MHV Record. Percent Available is null O R Curren t MH V Record. Pc rcc n t A y a i 1 a b 1 c >= 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 period
where

MonitorHourly ValueData.ParameterCode = Current MHV Parameter AND
MonitorHourlyValueData.ModcCode == "17" AND
(MonitorHourly ValueData.BeginDate < Current Date OR

(MonitorHourly ValueData.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 MHV RecordMo\\\{or'\ ngSystcmID is not null,

Locate a RA TA TestRecordsByLocationForQAStatus for the location

where the MonitoringSystemID is equal to Current MHV Record.Monhori ngSystcmID. the
TestResultCode begins with "PASS", and the EndDate/EndHour is after the First Use of Like Kind
Analyzer Record.Date/Hour and on or prior to the Current Date/Current Hour.

If not found,

return result D

else

Locate all Monitor System Component Records for Hour and Location

where the ComponentID is equal to Current MHVRecord.Componcnt ID.

Locate a RA TA TestRecordsByLocationForQAStatus for the location

where the MonitoringSystemID is equal to any MonitoringSystemID in the retrieved Monitor
System Component records, the TestResultCode begins with "PASS", and the EndDate/EndHour


-------
A

B

C

D

ige:

1

2

3

4

5

6

7

8

9

is after the First Use of Like Kind Analyzer Record .Date/Hour and on or prior to the Current
Date/Current Hour.

If not found,

return result D

Response	Severity

The UnadjustedHourly Value reported in the MHV record for [param] either before or Critical Error Level 1

after the current hour is invalid.

The AdjustedHourly Value reported in the MHV record for [param] either before or after Critical Error Level 1
the current hour is invalid.

You reported an MODCCode of 11 in the MHV record for [param], but the length of the Critical Error Level 1
missing data period exceeds the allowable value for use of this missing data procedure.

You reported an MODCCode of 17 in the MHV record for [param], indicating the 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.

Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-13

Check Name:	Check System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that a valid Monitoring System is indicated in the MHV record.

Specifications:

Current MHVMon Sys Record = null
Monitor Hourly System Status = false

IF {Current MHV Parameter == "NOXC" AND NOx Cone Checks Neededfor Nox Mass == false)

if {CurrentMHVRecord Mon\\on ngSystcmID is NOT null AND Legacy Data Evaluation == false)
return result A

else

Monitor Hourly System Status = true

else if {Current MHV Parameter == "C02C" AND CO 2 Cone Checks Neededfor Heat Input == false AND CO 2 Cone Checks Needed
for CQ2 Mass Calc == false)

if {CurrentMHVRecord Mon\\onngSystcmID is NOT null AND Legacy Data Evaluation == false)
return result B

else

Monitor Hourly System Status = true

else if {Current MHV Parameter == "02 W" AND 02 Wet Checks Neededfor Heat Input == false AND 02 Wet Checks Needed to
Support C02 Calculation == false) OR {Current MHV Parameter == "02D" AND 02 Dry Checks Neededfor Heat Input == false AND
02 Dry Checks Needed to Support C02 Calculation == false)

if {Current MHV	. IVIo ni to ri ngSy stcm ID is NOT null AND Legacy Data Evaluation == false)

return result G

else

Monitor Hourly System Status = true

else if {Current MHV Parameter in set {C02CSD, 02CSD})

if Current MHV Record.MomtoringSystemlD is NOT null
return result F

else

Monitor Hourly System Status = true

else

case {Current MHV Parameter)

S02C:	MODCSet = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22}

NOXC:	MODCSet = {01, 02, 03, 04, 17, 18, 19, 20, 21, 22}

C02C, 02D, or 02W:	MODCSet = {01, 02, 03, 04, 17, 18, 20, 21}

FLOW:	MODCSet = {01, 02, 03, 04, 20}

H20:	MODCSet = {01, 02, 03, 04, 21}

If (Current MHV Record. ModcCodc in set MODC Set)

if Current MHV Record MomtormgSystQvaK) is null
return result C

else

Current MHV Mon Sys Record = find active MonitoringSystemData record for location where


-------
MonitoringSystemData.MonitoringSystemID = Current MHV	. M o n i t o ri ng Sy s tc m ID

if Current MHVMon Sys Record is null
return result D

else

if (Current MHV Parameter in set {02D, 02W})

if (Legacy Data Evaluation == true

if (Current MHV Mon Sys Record. Sy StcmTypcCodc not in set

{H20,02,C02,N0XC,N0X})
return result E

else

Monitor Hourly System Status = true
else if (Current MHV Mon Sys	. Sy s t c mTy pc C ode not in {02, C02})

return result E

else

Monitor Hourly System Status = true

else if (Current MHV Parameter = "H20")

if (Current MHV Mon Sys Record. Sy stcmTypcCodc not in {H20T, H20M})
return result E

else

Monitor Hourly System Status = true

else

if (Current MHV Mon .S'y.s Record. Sy StcmTypcCodc <> Current MHV System Type)

If (Current MHV Parameter == "C02C" AND Legacy Data Evaluation == true AND
Current MHV Mon Sys Record. Sy s t c mTy pc C o dc == "NOX")

Monitor Hourly System Status = true

else

return result E

else

Monitor Hourly System Status = true

else if (Current MHK	. MonitoringSy stcmID is NOT null AND Monitor Hourly MODC Status == true AND Current MHV

Record.ModcCode not in set {05, 16, 53, 54} )
return result F

else

Monitor Hourly System Status = true


-------
Results:

Result	Response

A	You reported a MonitoringSystemID in the MHV record for NOXC, but this field

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 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

information is required when you report measured data.

D	You reported MonitoringSystemID [ID] in the MHV record for [param], but there is 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

SystemTypeCode for this monitoring system is not appropriate.

F	You reported a MonitoringSystemID in the MHV record for [param], but this is not

appropriate when substitute data is used.

G	You reported a MonitoringSystemID in the MHV record for [param], but this field

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

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

9	Process/Category:

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-14

Check Name:	Check System Designation Code for System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that the SystemDesignationCode of the monitoring system is compatible with reported

MODC.

Specifications:

If (Monitor Hourly Mode Status == true AND Monitor Hourly System Status == true AND Current MHV Mon 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 <> "RM")
return result C

22: If {Current MHV Mon Sys Record. SystemDesignationCode <> "CI")
return result D

Results:

Result
A

B

C

D

Usage:
1

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

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


-------
Check Code:

HOURMH V -15

Check Name:	Check Component in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that the component in the MHV record is valid.

Specifications:

Monitor Hourly Component Status = false
if {Current MHV Parameter NOT in set {C02CSD, 02CSD})
case {Current MHV Parameter)

S02C:

NOXC:

C02C, 02D, 02W:

FLOW:

H20:

MODCSet = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53}
MODCSet={01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53}
MODCSet = {01, 02, 03, 04, 17, 18, 20, 21, 53}

MODCSet = {01, 02, 03, 04, 20, 53}

MODCSet = {01, 02, 03, 04, 21, 53}

If (Current MHV Record. ModcCodc in set MODC Set)
if Current MHV Record. ComponentID is null

If {Current MHV Parameter == "FLOW" and Current MHV Record. IVT o ni to ri ngSy stem ID is not null)

Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location where
MonitoringSystemComponentData .ComponentTypeCode = "FLOW" AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHV
Record. Mo n i to ri ng Sy s te m ID

If {Count Mon Sys Comp Record < 2)
return result A

Otherwise,

return result A

else

Current MHV Component Record = find ComponentData record where ComponentData. ComponentID = Current
MHV Record. ComponentID

If Current MHV Component Record. ComponentTypeCode <> Current MHV Component Type
return result B

else if Monitor Hourly Mode Status == true AND Current MHV Record. ModcCode ==17 AND Current MHV
Component Record. Componentldentifier does not begin with "LK"
return result C

else if {Monitor Hourly System Status == true AND Current MHV Mon Sys Record is not null)

Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location where

MonitoringSystemComponentData .ComponentID = Current MHV Record. ComponentID AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHV
Record. IVI o n i to ri ng Sy s t c m ID

If Count Mon Sys Comp Record = 0
return result D

Else

Monitor Hourly Component Status= true

Else

Monitor Hourly Component Status = true


-------
else

if Current MHVRecord. ComponentID is NOT null
return result E

else

Monitor Hourly Component Status = true

else

if Current MHV Record. ComponentID is NOT null
return result E

else

Monitor Hourly Component Status = true

Results:

Result

A

B

C

D

Usage:

Response	Severity

You did not report a ComponentID in the MHV record for [param].	Critical Error Level 1

You reported ComponentID [ID] in the MHV record for [param], but this is not an Critical Error Level 1
[comptype] component.

You reported an MODCCode of 17 in the MHV record for [param], which indicates that Critical Error Level 1
the component is a like-kind analyzer, but the ComponentID does not begin with LK.

You reported MonitoringSystemID [sys] ComponentID [ID] in the MHV record for
[param], but there is no MonitorSystemComponent record for this system and
component in your monitoring plan that was active during the hour.

You reported a ComponentID in the MHV record for [param], but this field should be
blank whenever missing data substitution is performed.

Critical Error Level 1

Non-Critical Error

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


-------
Check Code:

HOURMH V -16

Check Name:

Related Former Checks:

Check Pre-Bias-Adjusted Value

Applicability:
Description:

CEM Check

This check ensures that the UnadjustedValue in the MHV record for S02C, NOXC, and FLOW is valid.

Specifications:

Monitor Hourly Preadjusted Value Status = false

S02C: MODCSet = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54}

NOXC: MODCSet = {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54}

FLOW: MODCSet = {01, 02, 03, 04, 20, 53, 54}

If (Current MHV Record. ModcCode in set MODC Set)

If (Current MHV Record. U nadj ustedHourly Value is null AND

Current MHV Record. ModcCode not in set {04, 19, 20, 53, 54})
return result A

else if (Current M//K/?6'cwY/.UnadjustcdHourly Value < 0.0 AND

Current MHV Record. ModcCode not in set {16, 21} )
return result A

else if (Current M//K/?6'«.>/y/.U nadj ustedHourly Value > 2 AND
Current MHV Record. ModcCode == 16)
return result B

else if (Current M//K/?6'«.>/y/.U nadj ustedHourly Value > 0 AND
Current MHV Record. ModcCode == 21)
return result C

else if {Current MHV Parameter in set {S02C, NOXC} and Current M//K/?6'cmy/.U nadj ustedHourly Value is not rounded to 1
decimal place)

return result F

else if {Current MHV Parameter == "FLOW" and Current M//K/?6'cmy/.U nadj ustedHourly 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 M//K/?6'cmy/.U nadj ustedHourly Value > Current MHV Max Min Value)
return result D

else if {Monitor Hourly Mode Status == true)

If (Current MHV Record. U nadj ustedHourly Value is not null)
return result E

Else

Monitor Hourly Preadjusted Value Status = true


-------
Results:

Result
A

B

C

D

E
F

Usage:
1

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
UnadjustedHourly Value exceeds 2.

You reported an MODCCode of 21 in the MHV record for [param], but the
UnadjustedHourly Value is greater than 0.

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 [modcCode] in the MHV record for [param], so you
should not have reported a value for the UnadjustedHourly 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
Informational Message

Critical Error Level 1
Critical Error Level 1

Process/Category: Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Process/Category: Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-17

Check Name:	Verify Consistency Between NOx Emission Rate and NOx Concentration

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures consistency between NOx emission rate records and NOx Concentration records based on

the MODC and reported values.

Specifications:

If (NOx Cone Needed for NOx Rate Calc == true AND Monitor Hourly Mode Status == true)

if {CurrentMHVRecord.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


-------
Check Code:	HOURMHV-18

Check Name:	Determine Maximum or Minimum Value for Parameter in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines the maximum or minimum value for the parameter from the span or default table based

on MODC.

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.FuelCode is not null

Current MHV Missing Data Fuel = Current Hourly Op Record. FuelCode

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = Current Hourly Op Record.FuelCode
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 (Defeat It Re card. D c fa u 11V a 1 lie > 0)

Current MHV Max Min Value = Default Record .DefaultValue

else

return result D

else if {Current MHV Record. ModcCode in set {13, 24} AND Current MHV Fuel Specific Hour == true)

If Current Hourly Op Record.FuelCode is not null

Current MHV Missing Data Fuel = Current Hourly Op Record. FuelCode

Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV 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 (Default Record. Default Value > 0)

Current MHV Max Min Value = Default Record. DefaultValue

else

return result D

else if {Current MHV Record. ModcCode <> 15)

If {Current MHV Parameter in set {H20, 02 W, 02D, 02CSD})
if {Current MHV Default Parameter is not null)

Current MHV Missing Data Fuel = "NFS"

if {Current MHV Parameter in set {02 W, 02D} AND Current MHV Record. ModcCode == 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 {DefaultRecordDefaaWSfahxe > 0)

Current MHV Max Min Value = Default Record. DefaultValue

else

return result D

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 MHVRecord. ModcCode == 19)

if Current Monitor Span itecordDefaultHighRange > 0)

Current MHV Max Min Value = Current Monitor Span Record. 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 itecordFlowFullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
Record. F1 owFu 11Sca lc Rangc * 2

else

return result G

else

if Current Monitor Span .RecordFullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
Record. Full Sea lc Range * 2

else

return result G

else

if {Current MHV Parameter == "FLOW")

if Current Monitor Span RecordMPYValue > 0)

Current MHV Max Min Value = Current Monitor Span
Record.MPYVdluQ

else

return result G

else

if Current Monitor Span RecordMPCValue > 0)

Current MHV Max Min Value = Current Monitor Span
Record.MPCVi\\uc

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

Results:

Result
A

B

C
D

E

F
G

Usage:

1

2

3

4

5

6

7

8

9

Current Monitor Span Record = the single matched record

if (Current MHV Record. ModcCodc == 20)

if Current Monitor Span itecordFullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span
Record. Full Sea lc Range * 2

else

return result G

else if {Current MHV Record. ModcCode in set {13, 24})
if Current Monitor Span Record. MECValue > 0)

Current MHV Max Min Value = Current Monitor Span
Record. MECValue

else

return result G

else

if Current Monitor Span Record. S pa n Va 1 lie > 0)

Current MHV Max Min Value = Current Monitor Span
Record. SpanValue

else

return result G

Response	Severity

The missing data default parameter for H20 could not be determined, because you used	Critical Error Level 2

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	Critical Error Level 1
[FuelCode] in your monitoring plan for the hour.

You did not report an applicable [param] Default record with a FuelCode of [FuelCode].	Critical Error Level 1

The values reported in the applicable [param] Default record with a FuelCode of	Critical Error Level 1
[FuelCode] are invalid.

You reported more than one active span record for [key] in your monitoring plan for the	Critical Error Level 1
hour.

You did not report an active span record for [key] in your monitoring plan for the hour.	Critical Error Level 1

The values reported in the applicable span record for [key] are invalid.	Critical Error Level 1

Process/Category:

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

Process/Category:

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

Process/Category:

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-19

Check Name:	Check Adjusted Hourly Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This checks ensures that AdjustedHourly Value is valid and does not conflict with the reported MODC codes.

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)

ff (Current MHV Parameter == "FLOW")

set Current MHV Precision to -3.

else

set Current MHV Precision to 1.

case (Current MHV Record. ModcCode)

= 21: Current MHV Calculated Adjusted Value = 0

if (Current MH V Record. Adj ustcdHourly Va 1 lie == 0)

Monitor Hourly Adjusted Value Status = true

else

return result A

= 16: Current MHV Calculated Adjusted Value = 2

if (Current MHV Record. AdjustedHourlyValue == 2)

Monitor Hourly Adjusted Value Status = true

else

return result B

= 12 OR = 23:

If (Current MHV Max Min Value is not null)

Current MHV Calculated Adjusted Value = Current MHV Max Min Value
if (Current MHV Record. AdjustedHourlyValue == Current MHV Max Min Value)

Monitor Hourly Adjusted Value Status = true

else

return result C

= 13 OR 24:

If (Current MHV Max Min Value is not null)

Current MHV Calculated Adjusted Value = Current MHV Max Min Value
if (Current MHV Record. AdjustedHomlyValue == Current MHV Max Min Value)

Monitor Hourly Adjusted Value Status = true

else

return result D

= 06: If (Current MHVHBHA Value is not null)

Current MHV Calculated Adjusted Value = Current MHVHBHA Value

If (Current MHV Record. Ad) ustcdHourly Value >= 0)

if ( Current MHV Record. AdjustedHourlyValue == Current MHV Calculated Adjusted Value)
Monitor Hourly Adjusted Value Status = true

else

return result G

else


-------
return result H

else

If (Current	Adj ustedHourly Value >= 0)

If (Current	Adj ustedHourly Value is not rounded to Current MHVPrecision)

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. AdjustedHourly Value > Current MHV Max Min
Value)

If {Current MHV Parameter == "S02C" and Current MHV
Record. Ad) ustedHourly Value > Current MHV Max Min Value * 2)

return result O
Otherwise,

return result K

Else

return result H

= 08 OR 09:

If {Current MHV Record. AdjustedHourlyValue >= 0)

If {Current MHVHBHA Value is not null AND Current MHVHBHA Value > Current MHV
Record. Adj ustedHourly Value AND {Unit is Load Based == true or Current MHV Parameter <>
"NOXC")

Current MHV Calculated Adjusted Value = Current MHV HBHA Value
return result I

else

If {Current MHV Record. AdjustedHourlyValue 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. AdjustedHourlyValue > Current MHV Max Min
Value)

If {Current MHV Parameter == "S02C" and Current MHV
Record. Adj ustedHourly Value > Current MHV Max Min Value * 2)

return result O
Otherwise,

return result K

Else

return result H

= 04, 05, 07, 10, 11, 15, 53, 54, OR 55:

If {Current MHV Record. AdjustedHourlyValue >= 0)

If {Current MHV Record. AdjustedHourlyValue is not rounded to Current MHV Precision)
return result L

else

Current MHV Calculated Adjusted Value = Current MHV Record. AdjustedHourlyValue
Monitor Hourly Adjusted Value Status = true


-------
If (Current MHVMax Min Value is not null)

if (Current MHV /?6'cwY/.AdjustcdHourly Value > Current MHV Max Min Value)
If (Current MHV Parameter == "S02C" and Current MHV
Record. Adj ustcdHourly Value > Current MHV Max Min Value * 2)

If the Current MHV Record.ModcCode == 10

return result P
Otherwise,

return result O

Otherwise,

return result K

Else

return result H

= All Other Codes:

If (Current MH V Record. Adj ustcdHourly Val lie >= 0)

f (Current MHV Record. ModcCode in set {19, 20} AND Current MHV Record. U nadj ustcdHourly Value
is null)

If (Current MHV Max Min Value is not null)

if (Current MHV /?6'cwY/.AdjustcdHourly Value == Current MHV Max Min Value)
Current MHV Calculated Adjusted Value = Current MHV
Record. Adj ustcdHourly Val uc
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. k&\us{cAHo\.tf\\V'c\\\iC is not rounded to Current MHV Precision)
return result L

else

Monitor Hourly Adjusted Value Status = true

Else

return result H

If (C.'M/7*6'rt?M//K/?6'cwY/.AdjustcdHourly Value is not null)
return result J


-------
Results:

Result
A

B

C

D

H
I

K

L
M

N

O

Usage:
1

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 pari
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.

Process/Category: Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

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

Process/Category: Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation


-------
Check Code:	HOURMHV-20

Check Name:	Check Unadjusted Hourly Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This checks ensures that UnadjustedHourlyValue is valid and does not conflict with the reported MODC codes.

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 MoAcCods 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. U nadj ustedHourly Value == 0)

If (Current MHV Parameter == "C02C" and Current Hourly Op Record. LoadRa ngc is greater than 1,
return result L

else

Monitor Hourly Unadjusted Value Status = true

else

return result A

= 12 OR = 23:

If (Current MHV Max Min Value is not null)

Calculated Unadjusted Value = Current MHV Max Min Value
if (Current MHV Record \]n&&iv&tQd&{om\yVa[\iQ == Current MHV Max Min Value)

Monitor Hourly Unadjusted Value Status = true

else

return result B

= 20: If (Current MHV Record .{J nadjustcdHourly Value >= 0)

If (Current MHV Max Min Value is not null)

If (Current MHV Parameter begins with "02" AND Current M//K/?6'cmy/.U nadj ustedHourly Value >
20.9)

Calculated Unadjusted Value = Current MHV Max Min Value
return result K

else if Current MHV Parameter == "C02C" AND	UnadjustedHourly Value >

Current MHV Max Min Value)

Calculated Unadjusted Value = Current MHV Max Min Value
return result C

elseif (Current MHV Record U nadj ustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current MHV Record. U nadj ustedHourly Value
Monitor Hourly Unadjusted Value Status = true

else

return result E
= 06: If (Current MHVHBHA Value is not null)

Calculated Unadjusted Value = Current MHVHBHA Value

If (Current M//K/?6'cmy/.U nadj ustedHourly Value >= 0)

if ( Current MHV /fecwf/.U nadj ustedHourly Value == Calculated Unadjusted Value)


-------
Monitor Hourly Unadjusted Value Status = true

else

return result D

else

return result E

else

If (Current MH V Record. U nadj ustcdHourly Va 1 lie >= 0)

If (Current MHVRecord UnadjustcdHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current MH V Record. U nadj ustcdHourly Va 1 lie
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	< Current MHV Max Min

Value)

return result H

else

if {Current MHV Record XimA]ustQ6Roux\yNdL\uQ > Current MHV Max Min
Value)

return result F

Else

return result E

= 08 OR = 09:

If (Current MHV Record. U nadj ustcdHourly 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. U nadj ustcdHourly 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 >	M//K/?6'ew Current MHV Max Min
Value)

return result F

Else


-------
return result E

= All Other Codes:

If (Current MHV Record. U nadj ustedHourly Value >= 0)

If {CurrentMHVParameter in set {"H20", "C02C", "02D", "02 W", "C02CSD", "02CSD"} AND Current
A///K/?6'cwy/.U nadj ustedHourly Value > 100)
return result E

else if (Current MH V Record. U nadj ustedHourly Va 1 uc is not rounded to one decimal place)
return result I

else if (Current MH V Record. U nadj ustedHourly V al uc == 0 AND Current MHV Parameter == "C02C" and
Current Hourly Op Record.LoadRange is greater than I,
return result L

else

Calculated Unadjusted Value = Current MHV Record\) nadj ustedHourly 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 MH V Record. U nadj us tedH o u rly Va 1 uc < Current MHV Max Min Value)
return result H

else

if (Current A///K/?6'cwy/.U nadj ustedHourly Value > 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)

C02C:	C02C MHV Calculated Adjusted Value = Calculated Unadjusted Value

02 W:	02 Wet Calculated Adjusted Value = Calculated Unadjusted Value

02D:	02 Dry Calculated Adjusted Value = Calculated Unadjusted Value

H20:	H20 MHVCalculated Adjusted Value = Calculated Unadjusted Value

C02CSD:	C02C SD Calculated Adjusted Value = Calculated Unadjusted Value

02CSD:	02C SD Calculated Adjusted Value = Calculated Unadjusted Value


-------
Results:

Result
A

B

C

D

E
F

H

I
J

K

Usage:

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 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 anMODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourlyValue that is less than the average of the measured hour
before and measured hour after.

Warning: The UnadjustedHourlyValue 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 anMODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourlyValue 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
UnadjustedHourlyValue does not equal the default value reported in the 02X default
record in your monitoring plan.

You have reported an UnadjustedHourlyValue 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

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 —

— H20 Monitor Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data


-------
Check Code:	HOURMHV-21

Check Name:	Determine BAF Value for Monitoring System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check retrieves and sets as an output parameter the Bias Adjustment factor for the Monitoring System

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 Needed for 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 MHV
Record. U na dj lis tc d H o u r ly V a 1 lie is not null AND Current MHV Max Min Value is not null)))

If (RA TA Status BAF is not null)

else

case {Current MHV Parameter)

S02C: Current S02 System BAF = RATA Status BAF
NOXC: Current NOXC System BAF = RA TA Status BAF
FLOW: Current FLO WSystem BAF = RA TA Status BAF

return result A

Results:

Result	Response	Severity

A	The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, because the Critical Error Level 1

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


-------
Check Code:	HOURMHV-22

Check Name:	Calculate Bias Adjusted Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check ensures that the reported Unadjusted Hourly Value multiplied by the BAF results in the reported

Adjusted Hourly Value

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 MHV Record.\JK\&\us{cAHo\.tf\\V'c\\\iC * Current BAF, and the result to the nearest

1000.

else

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = Current MHV Parameter AND
UOM = "PPM"

Calculated Adjusted Value = Current MHV Record.\JK\&\us{cAHo\.tf\\V'c\\\iC * Current BAF, and the result to one decimal

place (0.1).

If {Current MHV Record. ModcCode in set {19, 20} AND Calculated Adjusted Value > 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 {Current MHV Record. AdjustedHourlyValue <> Current MHV 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. AdjustedHourlyValue) > Tolerance
return result B

case {Current MHV Parameter)

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

else


-------
Results:

Result
A

B
C

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

Usage:
1

Process/Category: Emissions Data Evaluation Report	NOXC RATA Status Evaluation

Process/Category: Emissions Data Evaluation Report	S02 RATA Status Evaluation

3	Process/Category:

Emissions Data Evaluation Report

Stack Flow RATA Status Evaluation


-------
Check Code:	HOURMHV-23

Check Name:	Initialize C02C Hourly Monitor for Substitute Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for C02C for

substitute data when two C02C are submitted for the hour.

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


-------
Check Code:	HOURMHV-24

Check Name:	Initialize 02C Hourly Monitor for Substitute Data

Related Former Checks:

Applicability:	CEM Check

Description:	This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02C for

substitute data when two 02C with the same moisture basis are submitted for the hour.

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


-------
Check Code:

HOURMHV-26

Check Name:

Related Former Checks:

Determine if MHV Record Needs QA Status Evaluation

Applicability:
Description:

CEM Check

Determine if MHV Record Needs QA Status Evaluation

Specifications:

Set LinearityStatusRequired = false.

Set Current Linearity Status = null.

Set RATAStatusRequired = false.

Set Current RATA Status = null.

Set RA TA Status BAF = null.

Set DailyCalStatusRequired = false
Set Current Daily Cal Status = null.

Set F2L Status Required = false.

Set Daily Int Status Required = false
Set Leak Status Required = false

Set QaStatusComponentld = CurrentMHVRecord. Co mpolie n11d

Set QaStatusComponentldentifier = CurrentMH VRecord. Co mpo lie n11dcnt i ficr

Set QaStatusComponentTypeCode = CurrentMH VRecord.CompolientTypcCodc

Set QaStatusSystemDesignationCode = CurrentMH VRecord. Sy s tc 111D c s i g na t i o 11C o dc

Set QaStatusSystemld = CurrentMHVRecord .SystemId

Set QaStatusSystemldentifier = CurrentMH VRecord. Sy stem I dc nti fie r

Set QaStatusSystemTypeCode = CurrentMH VRecord. Sy s t c niTy pc C 0 dc

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 CurrentMHVRecord.UnadjustcdHourly Value is not null AND
Current MHV Max Min Value is not null)))

if (MonitorHourlyComponentStatus = true AND CurrentMH VRecord. C 0111 po 11c 1111D is not null AND CurrentMH VParameter in

set {S02C, NOXC, C02C, 02D, 02W})

Set LinearityStatusRequired = true.

Set DailyCalStatusRequired = true.

if (MonitorHourlyComponentStatus = true AND CurrentMH VRecord. C 0111 po 11c 1111D is not null AND CurrentMH VParameter in

set {FLOW})

Set DailyCalStatusRequired = true.

Set Daily Int Status Required = true.

If CurrentMHVRecord. SampleAcquistionMethodCd = "DP"

Set Leak Status Required = true.

if (MonitorHourlySystemStatus = true AND CurrentMHVRecordMomtoxmg'iystQvaiD is not null AND
CurrentMHVRecord.SystemTypeCode is in {S02, NOXC, FLOW, H20M})

Set RATAStatusRequired = true.

Set CurrentHourlyRecordforRATAStatus = CurrentMHVRecord.
if CurrentMHVRecord.SystemTypeCode is equal to 'FLOW',

Set F2L Status Required = true.

else if ((CO2 Cone Checks Needed for Heat Input == true AND CurrentMHVParameter == "C02C") OR (()2 Wet Checks
Needed for Heat Input == true AND CurrentMHVParameter == "02W") OR (()2 Dry Checks Needed for Heat Input == true


-------
AND CurrentMHVParameter == "02D"))

Set C02RATARequired = true.

if (RATA Status Required == false AND Current MHVParameter in {S02C, NOXC, FLOW})

case (Current MHV Parameter)

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 (LinearifyStatusRequired == true OR DailyCalStatusRequired == true)

Set DualRangeStatus = false.

Set CurrentAnalyzerRangeUsed = null.

Set ApplicableSystemlDs = null.

Set HighRangeComponentID = null.

Set LowRangeComponentID = null.

if (CurrentMHVParameter == "FLOW")

Set AppllcableComponentlD = Current MHV Record.Components)

else

Set ApplicableComponentID = null.

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the ComponentID is equal to
the CurrentMH VRecord .Compo ne lit ID.

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 CurrentMHVRecord.ComponQnfTypeCode and the
SpanScaleCode is equal to "L".

if (MonitorSpanRecordsByHourLocation is not found OR if more than one
MonitorSpanRecordsByHourLocation is found OR if the
MonitorSpanRecordsByHourLocation.ScaleTmnsitionPoint is null or <= 0)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result B

else if (MonitorSpanRecordsByHourLocation is found AND
C.'M/7*6'rt?M//K/?6'cwY/.UnadjustcdHourly Value >

Monitor SpanRecordsByHourLocation. ScaleTransitionPoint AND
CurrentMHVRecord. IVIodcCodc <> "18")


-------
Set CurrentAnalyzerRangeUsed = "H".

Set HighRangeComponentID = CurrentMHVRecord.Componsnt ID.
Set LowRangeComponentID = CurrentMHVRecord.Componsnt ID.

Set CurrentAnalyzerRangeUsed = "L".

Set HighRangeComponentID = CurrentMHVRecord.Componsnt ID.
Set LowRangeComponentID = CurrentMHVRecord.Componsnt ID.

Set CurrentAnalyzerRangeUsed =

Analyz.erRangeRecordsIiy Hour Location. knnh/crRcmgcCoAc.

if (AnalyzerRangeRecords/iyHourLocation. Ani\\\/crRm\gcCodc = "H")

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location
where the ComponentTypeCode is equal to the

CurrentMHVRecord .ComponcntTy pcCodc and the AnalyzerRangeCode is equal to "L"
AND the ComponentSerialNumber is equal to the

CurrentMHVRecord .ComponcntScrialNumbcr (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. Component ID.
Set LowRangeComponentID =

AnalyzerRangeRecordsByHourLocation. Component ID.

else if {CurrentMHVRecord. AnalyzerRangeCode = "L")

Locate a record in AnalyzerRangeRecordsByHourLocation for the
CurrentMH VRecord. Hour where the ComponentTypeCode is equal to the
CurrentMH VRecord.Compo ncntTy pcCodc and the AnalyzerRangeCode is equal to "H"
AND the ComponentSerialNumber is equal to the

CurrentMHVRecord.Compo ncnt Sc ria lNumbc r (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 LowRangeComponentID = CurrentMHVRecord. Co mpo lie lit ID.
Set HighRangeComponentID =

AnalyzerRangeRecordsByHourLocation. Component ID.


-------
Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode.

if (CurrentAnalyzerRangeUsed = "H")

Set HighRangeComponentID = CurrentMHVRecord.Componsnt ID.

else

Set LowRangeComponentID = CurrentMHVRecord.Componsnt 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 MonitorSystemComponentRecordsByHourLocation.SystQmK> to ApplicableSystemlDs.

if (MonitorSystemComponentRecordsByHourLocation is not found)

set Linearity Status Required == false
set DailyCalStatusRequired = false
return result D

Results:

Result	Response

A	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.

B	You reported that ComponentID [COMPID] is a dual-range analyzer, but you did not

report one (and only one) active low-scale [COMPTYPE] 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.

C	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.

D	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.

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

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1


-------
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 "02 W" to "SUB"

else if {Current MHV Parameter in set { S02C, NOXC, C02C, 02D, 02 W, FLOW, H20} AND Monitor Measure Code Array for the
Current MHV Parameter is null)

If {Current MHV Record.ModcCode 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. ModcCode == "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


-------
Check Category:
Hourly Operating Data


-------
Check Code:

HOUROP-1

Check Name:	Validate Single Operating Data record for hour

Related Former Checks:

Applicability:	CEM Check

Description:	This check will count the number of HourlyOperatingData records to ensure the existence of one unique record

for the hour

Specifications:

Current Hourly Op Record = null

Unit Hourly Operational Status = false

Current Operating Time = null

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 for 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 <> "Unit" AND LME HI Method is not null)

Derived Hourly Checks Needed = false
return result D

else

Current Hourly Op Record = Unique HourlyOperatingData record
Current Operating Time = Current Hourly Op Record.OperatingTime

If {First Day of Operation is null)

First Day of Operation = Current Hourly Op Record. Date


-------
First Hour of Operation = Current Hourly Op Record.Hour

if Current Operating Time >1.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 (Current Entity Type = "Unit")

Unit OpTime Accumulator = -1

else

Stack OpTime Accumulator = -1

else

return result C

Derived Hourly Checks Needed = true
if Current Operating Time > 0.0

Unit Hourly Operational Status = true

if {Operating Date Array entry for this location does not contain Current Hourly Op Record.Date)

Add Current Hourly Op Record.Date to Operating Date Array entry for this location

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 for 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.OperatingTime

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)

AprilOp Time Accumulator Array for this location = AprilOp Time Accumulator +
Current Hourly Op Ttecwrf.OperatingTime

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 Record. OperatingTime

else

Daily Op Time Accumulator Array for this location = Current Hourly ()p Record .Ope ra t i ngT ime


-------
if {Last Day of Operation Array for the location is null OR is not equal to Current Date)

Last Day of Operation Array for the location = Current Date
if (Rpt Period Op Days Accumulator Array for this location is not null)

if (Rpt Period Op Days Accumulator Array for this location >= 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 {Current Entity Type = "Unit")

if {Unit OpTime Accumulator >= 0)

Unit OpTime Accumulator = Unit OpTime Accumulator + Current Hourly Op
Record. OperatingT ime

if Current Hourly Op Ttecon/.OperatingTime > Max Unit OpTime

Max Unit OpTime = Current Hourly Op ./tecon/.OperatingTime

else if {Current Entity Type == "CS" OR Current Entity Type == 'MS")
if {Stack OpTime Accumulator >= 0)

Stack OpTime Accumulator = Stack OpTime Accumulator + Current Hourly Op
Record. OperatingT ime

if Current Hourly Op Ttecon/.OperatingTime > Max Stack OpTime

Max Stack OpTime = Current Hourly Op Record .Ope ra t i ngT ime

Results:

Result

A

B

C

D

Response	Severity

You did not report an Hourly Operating record for the hour.	Critical Error Level 1

You reported more than one Hourly Operating records for the hour. There will be no Critical Error Level 1
further evaluation of the reported emissions data for this hour.

The OperatingTime reported in the Hourly Operating record is invalid. This value must Critical Error Level 1
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 Critical Error Level 1
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	Fatal

acceptable for legacy data during a non-operating quarter, it is not allowed in ECMPS.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	HOUROP-2

Check Name:	Count Flow, 02, and Heat Input records

Related Former Checks:

Applicability:	CEM Check

Description:	Determine the number of Stack Flow Monitor Hourly, H20 Monitor Hourly, H20 Derived Hourly, Heat Input

Derived Hourly, and 02 Wet and Dry Hourly Records for the current location and current hour

Specifications:

Flow Monitor Hourly Count = count of MonitorHourlyValueData records with parameter FLOW where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour

02 Wet Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis = "W"
where

Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour

02 Dry Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis = "D"
where

Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour

02 Null Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis is NULL
where

Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour
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

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-3

Check Name:	Initialize Location Variables for the Hour

Related Former Checks:

Applicability:	General Check

Description:	Looks up information about the current unit - initially whether or not it is a Peaking Unit

Specifications:

Current Unit Is Peaking = false

Current UnitlsARP = false

Special Fuel Burned = false

FC Factor Needed = false

FD Factor Needed = false

FW Factor Needed = false

Moisture Needed = false

H20 Missing Data Approach = null

Flow Monitor Hourly Checks Needed = false

Current MHV Parameter = null

Current DHVParameter = null

Current DHVRecord Valid = false

Current DHV Record = null

Current DHV Method = null

Current DHV System Type = null

Current DHVHBHA 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 Neededfor Heat Input = false

02 Wet Checks Neededfor NOx Rate Calc = false

CO2 Diluent Needed for MA TS = false

02 Dry Needed for MA TS = false

02 Wet Needed for MA TS = false

Linearity Status Required = false

AppendixEStatusRequired = false

RATAStatusRequired = false

Current RA TA Status = null

CurrentHourlyRecordforRATAStatus = null

RATAStatusBAF = null

Daily Cal Status Required = false

CO2 RA TA Required = false

HI Measure Code = null.

NOXR Measure Code = null.

F2L Status Required = false

Daily Int Status Required = false

Leak Status Required = false

C02CMHVM0DC = null
H20DHVM0DC = null
H20MHVM0DC = null
02 DryMODC = null
02 WetMODC = null

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"

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 RecordQualTypecode == "PK" OR Mon Qua! /tecwc/.QualTypccodc == "SK"

if Mon Qual Record Count > 0

Current Unit Is Peaking = true

else if Current Entity Type = "CP"

find all entries in UnitStackConfiguration table where

UnitStackConfiguration.StackPipeId = 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 orb) 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 = CurrentMonitorPlanLocationRecord.EarliestReportDate

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-4

Check Name:	Verify S02 Monitor Method Active During Current Hour

Related Former Checks:

Applicability:	General Check

Description:	This check tests to see if the "S02" Monitoring method is defined at this location. If so, this method is checked

to ensure that the current hour being evaluated is within the window defined by the start and end times for the
S02 method.

Specifications:

If (DerivedHourly Checks Needed)

SO2 Monitor Method Record = null

SO 2 CEM Method Active For Hour = false

SO 2 App D Method Active For Hour = false

SO2 F23 Method Active For Hour = false

SO2 Method Code = null

SO2 Fuel Specific Missing Data = false

SO2 Bypass Code = null

SO2 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "S02" or "S02M"

if (S02 Method Count > 1)

return result A
else if SO2 Method Count == 1

SO2 Monitor Method Record = the single matched record
SO2 Method Code = S02 Monitor Method Record. MethodCode

if (LME HI Method is not null AND S02 Method Code <> "LME")
return result B

else

if (S()2 Monitor Method Record. SubDataCodc begins with "FSP75")

SO2 Fuel Specific Missing Data = true
SO2 Bypass Code = S02 Monitor Method Record. Bypass ApproachCode

Expected Summary Value S02 Array for this location = true

if {S02 Monitor Method Record. MethodCode == "CEM")

SO2 CEM Method Active For Hour = true
else if S02 Monitor Method Record.MethodCode == "F23")

SO 2 F23 Method Active For Hour = true
else if (S02 Monitor Method Record. MethodCode == "AD")

SO 2 App D Method Active For Hour = true

Results:

Result	Response	Severity

A	You have reported more than one active S02 Method record in your monitoring plan for Critical Error Level 1

this hour.

B	You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1

LME units.


-------
Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-5

Check Name:	Determine H20 Method

Related Former Checks:

Applicability:

Description:	The H20 Monitor Method must be known prior to category-level checks for H20 Derived and H20 Monitor

Specifications:

if Derived Hourly Checks Needed
H20 Method Code = null
H20 Default Value = null
H20 Default Max Value = null
H20 Default Min 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 Reference.K6L}v&tQ6Rom\yValue
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/67*6'rtC6'.UnadjustcdHourly 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 Record. 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 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"

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 (H2() 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. Adj ustedHourly Value

else if (H2() 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 /?e/67*6'rtC6'.UnadjustcdHourly Value

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:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-6

Check Name:	Verify NOx Rate Monitor Method

Related Former Checks:

Applicability:

Description:

Specifications:

If (DerivedHourly 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)
return result B

else

Current NOx Rate Monitor Method Record = the single matched record
Current NOx Rate Method Code = Current NOx Rate Monitor Method	McthodCodc

NOx Rate Bypass Code = Current NOx Rate Monitor Method Record .Bypass ApproachCode
if (Current NOx Rate Monitor Method Record. SubDataCode begins with "FSP75")
NOx Rate Fuel Specific Missing Data = true

If (Current Unit isARP == true)

Expected Summary Value NOx Rate Array for this location = true

General Check

This check tests to see if the "NOx Rate" Monitoring method is defined at this location. If so, this method is
checked to ensure that the current hour being evaluated is within the window defined by the start and end times
for the NOx method.

Results:

Result	Response	Severity

A	You reported more than one active NOXR Method record in your monitoring plan for Critical Error Level 1

this hour.

B	You reported a [param] method, which is not valid for a location that is part of a	Critical Error Level 1

configuration of LME units.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-7

Check Name:	Verify NOx Mass Monitor Method Record

Related Former Checks:

Applicability:	CEM Check

Description:	Finds the Monitor Method record for NOx Mass and stores it for later reference

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 Record. McthodCodc

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 Record. By pa s s A p p ro a c h C ode
if (Current NOx Mass Monitor Method Record. SubDataCode begins with "FSP75")
NOx Mass Fuel Specific Missing Data = true

if (NOx Mass Monitor Method Record. McthodCodc == "CEM" OR

NOx Mass Monitor Method Record. MethodCode== "NOXR" OR
NOx Mass Monitor MethodRecord.MethodCode == "CEMNOXR" OR
NOx Mass Monitor Method Record. MethodCode == "AMS")

NOx Mass Method Active For Hour = true

If (NOx Mass Monitor Method Code == "LME" AND Current Unit is ARP == true)

Expected Summary Value NOx Rate Array for this location = true

Results:

Result	Response	Severity

A	You reported more than one active NOX Method record in your monitoring plan for this Critical Error Level 1

hour.

B	You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1

LME units.


-------
Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-8

Check Name:	Verify C02 Method Active During Current Hour

Related Former Checks:

Applicability:	CEM Check

Description:	Looks in the MonitoringMethod table to verify that a C02 Mass Monitoring Method is active for the current

hour at the current location

Specifications:

ff (DerivedHourly Checks Needed)

C02 Monitor Method Record = null
CO 2 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

CO2 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 Record. McthodCodc

if (LME HI Method is not null and CO 2 Method Code is not equal to "LME")
return result B

else

if (Current C02 Monitor Method Record. SubDataCode begins with "FSP75")

CO2 Fuel Specific Missing Data = true

if {C02 Monitor Method Record. MethodCode == "CEM")

CO2 CEM Method Active For Hour = true
else if (C02 Monitor MethodRecord.MeihodCode == "AD")

CO 2 App D Method Active For Hour = true

Expected Summary Value C02 Array for this location = true

Results:

Result	Response	Severity

A	You have reported more than one active C02 Method record in your monitoring plan for Critical Error Level 1

this hour.

B	You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1

LME units.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-9

Check Name:

Related Former Checks:

Verify Heat Input Method Active During Current hour

Applicability:
Description:

General Check

Verifies that a single method is defined for Heat Input during the Current Hour

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 Record.MethodCode

LME HI Substitute Data Code = Heat Input Monitor Method Record. SubstituteDataCode

if {Heat Input Monitor Method Record. SubDataCode begins with "FSP75")

Heat Input Fuel Specific Missing Data = true

if (Heat Input Monitor Method Record. MethodCode == "CEM")

Heat Input CEM Method Active For Hour = true
else if {Heat Input Monitor Method Record. MethodCode == "AD" OR Heat Input Monitor Method Record. MethodCode
== "ADCALC")

Heat Input App D Method Active For Hour = true

If {Heat Input Monitor Method Record.Me\hodCode <> "EXP")

Expected Summary Value HI Array for this location = true

if (Heat Input Monitor Method Record. ParameterCode == "HI")

Apportionment HI Method Array for this location = Heat Input Method Code

Results:

Result
A

You have reported more than one active HI Method record in your monitoring plan for Critical Error Level 1
this hour.

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.

Response

Severity

B


-------
Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	HOUROP-17

Check Name:	Verify Single S02 Derived Hourly Data Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check scans the DerivedHourly ValueData records to ensure that a single record containing S02 derived

values is reported for the current hour

Specifications:

If (Derived Hourly Checks Needed == true)

SO2 Derived Checks Needed = false
S02MDerived Checks Needed = false
Current S02 Derived Hourly Record = null
F23 Default Max Value = null
F23 Default Min Value = null
F23 Default Value = null

SO2 DerivedHourly Count = count of DerivedHourly ValueData records with ParameterCode = "S02" or "S02M" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op Record.Opcrat ingTime > 0

If (S()2 Derived Hourly Count == 0 AND SO2 Method Code is not null)

If (S02 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 (S()2 Derived Hourly Count > 0 AND SO2 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 (S()2 Derived Hourly Count >1)

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result C

Else if (S()2 Derived Hourly Count > 0 AND SO2 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 for 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 Hour = DerivedHourly ValueData.Hour

If (LME HI Method is not null)

If (S02 Method Code == "LME")

If (Current S()2 Derived Hourly Record. ParameterCode == "S02M")

S02MDerived Checks Needed = true

else

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

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 (S()2 Method Code in set {CEMF23,AMS})

if (S()2 Method Code == "CEMF23")

SO2 CEM Method Active For Hour = true

if (Current S02 Derived Hourly Record. Fo rmu 1 a I dc nt i fic r is not null)

S02 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current S02 Derived Hourly
Record. Fo rinil 1 a I dc n t i fi e r

If (S02 Formula Record is not null)

If (S02 Formula Record.ParameterCode == "S02")

if (S02 Method Code == "CEMF23")

If (S02 Formula Record.EquationCode == "F-23")
SO2 F23 Method Active For Hour = true
SO2 CEM Method Active For Hour = false

if (S()2 Method Code == "AMS")

If (S02 Formula Record.EquationCode in set
{F-l,F-2})

S02 Method Code == "CEM"

SO2 CEM Method Active For Hour = true

If (SO2 F23 Method Active For Hour == true)

F23 Default Record Count = count active MonitoringDefaultData Records for the location
where ParameterCd = 'S02R' and DefaultPurposeCd = 'F23'

if (F23 Default Record Count == 0)

return result D
else if (F23 Default Record Count > 1)

F23 Default Max Value = Highest DefaultValue field from active
MonitoringDefaultData record for location where ParameterCd = 'S02R' and
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

Response

Severity

A

You did not report a DHV record for S02 (or S02M) for the hour.

Critical Error Level 1

B

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.

Critical Error Level 1

C

You reported more than one DHV records for S02 (or S02M) for the hour.

Critical Error Level 1

D

You did not report an active S02R default record in your monitoring plan for use in F23
calculation for the hour.

Critical Error Level 1

E

The DefaultValue reported in the active S02R F23 default record in your monitoring
plan is invalid.

Critical Error Level 1

F

You reported a DHV record for S02 (or S02M), but this is not appropriate for a
non-operating hour.

Critical Error Level 1

G

You reported a DHV record for [param], but you did not report any Hourly Fuel Flow
records at the location.

Critical Error Level 1

H

The ParameterCode reported in the DHV record does not match the ParameterCode in
the Method record in your monitoring plan used to determine [eparam].

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	HOUROP-18

Check Name:	Verify Single S02 Concentration record
Related Former Checks:

Applicability:	CEM Check

Description:	Counts all S02 Concentration records (MonitorHourly ValueData records with "S02C" ParameterCode) for the

current hour and outputs appropriate responses if count does not match expectations

Specifications:

Current S02 Monitor Hourly Record = null

SO2 Monitor Hourly Count = count of MonitorHourly ValueDate 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 S02 CEM Method Active For Hour == false AND MA TS S02CNeeded == false)

Return result A
Else if (SO2 Monitor Hourly Count >1)

Return result B
Else if (S02 Monitor Hourly Count ==1)

Current S02 Monitor Hourly Record = MonitorHourly ValueData rec with param S02C where
CurrentDate = MonitorHourly ValueData.Date and
CurrentHour = MonitorHourly ValueData.Hour

Else

if (S()2 Monitor Hourly Count > 0)
return result C

Results:

Result
A

B
C

Response

You reported an MHV record for S02C, but you did not report an active S02 method

record in your monitoring plan for the hour.

You reported more than one MHV record for S02C for the hour.

You reported an MHV record for S02C, but this is not appropriate for a non-operating

hour.

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-19

Check Name:	Verify Single NOx Concentration Record

Related Former Checks:

Applicability:	CEM Check

Description:	Counts all NOx Rate Concentration records (MonitorHourly ValueData records with "NOXR" ParameterCode)

for the current hour and outputs appropriate responses if count does not match expectations

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 = MonitorHourlyValueData.Hour

else

return result B

Else

if (NOx Cone Monitor Hourly Count > 0)
return result C

Results:

Result

A

B

C

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

Critical Error Level 1

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-20

Check Name:	Verify Single NOx Rate Derived Hourly Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check scans the DerivedHourlyValueData records to ensure that a single record containing S02 derived

values is reported for the current hour

Specifications:

If (Derived Hourly Checks Needed == true)

NOx Rate Derived Checks Needed = false

NOx Rate Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "NOXR" where

Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

If Current Hourly Op Record.Opc rat i ngTi me > 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 for the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Return result B
Else if (NOx Rate Derived Hourly Count >1)

Rpt Period NOx Rate Reported Accumulator Array for 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 = DerivedHourlyValueData 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	. Fo rmu 1 a I dc n t i fic r is null)

if Current NOx Rate Derived Hourly Record .MOD C C o dc is not null)

Current NOx Rate Method Code = "CEM"

else

NOXR Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current NOx Rate Derived Hourly
Record. F o rm u 1 a I dc n t i fi c r

If (NOXR Formula Record is not null)

If (NOXR Formula Record.ParameterCode == "NOXR" AND NOXR Formula
Record.EquationCode in set

{F-5,F-6,19-1,19-2,19-3,19-3D,l 9-4,19-5,19-5D,l 9-6,19-7,19-8,19-9})

Current NOx Rate Method Code = "CEM"

else

If NOx Rate Derived Hourly Count > 0
Return result D


-------
Results:

Result	Response	Severity

A	You did not report a DHV record for NOXR for the hour.	Critical Error Level 1

B	You reported a DHV record for NOXR, but you did not report an active NOXR method	Critical Error Level 1

record in your monitoring plan for the hour.

C	You reported more than one DHV record for NOXR for the hour.	Critical Error Level 1

D	You reported a DHV record for NOXR, but this is not appropriate for a non-operating	Critical Error Level 1

hour.

E	This check result is obsolete.	No Errors

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	HOUROP-21

Check Name:	Verify Single NOx Mass Derived Hourly Record

Related Former Checks:

Applicability:	CEM Check

Description:	Counts number of NOx Mass DerivedHourly Value records active during the current hour and compares this

count with the Monitor Method records indicating the need for this data

Specifications:

If (Derived Hourly Checks Needed == true)

NOx Mass Derived Checks Needed = false
NOXMDerived 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" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op Record.Opcrat ingTime > 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 <> "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 Countfor 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 =
DerivedHourlyValueData.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

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
return 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 NOXMass Derived Hourly Record.ParameterCode == "NOXM")

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
return 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 Record. Fo rmu 1 a Idcnt i ficr is not null)

NOX Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current NOx Mass Derived Hourly
Record. F ormulaldentifier

If (NOX Formula Record is not null)

Apportionment NOX Method Array at this location = NOx Mass Monitor Method Code

If (NOX Formula Record.ParameterCode == "NOX" AND NOX
Formula Record.EquationCode in set {F-26A,F-26B})
NOx Mass Monitor Method Code= "CEM"

else

If NOx Mass Derived Hourly Count > 0
Return result D

Results:

Result

A

B

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

C
D

Critical Error Level 1
Critical Error Level 1

E

Critical Error Level 1

F

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-22

Check Name:

Verify Single C02 Mass Derived Hourly Value Record

Related Former Checks:

Applicability:
Description:

CEM Check

Verifies that exactly ONE Derived Hourly Value record exists for the current hour associated with C02 Mass

Specifications:

If (Derived Hourly Checks Needed == true)

CO 2 Mass Derived Checks Needed = false
Current C02 Mass Derived Hourly Record = null
C02MDerived Checks Needed = false

CO2 Mass Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode beginning with "C02" where

Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

If Current Hourly Op Record.Opcrat ingTime > 0

Else if (CO2 Mass Derived Hourly Count > 0 AND (CO2 Method Code is null OR CO2 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 (CO2 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 (CO2 Mass Derived Hourly Count > 0 AND CO2 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 (CO2 Mass Derived Hourly Count ==1)

Current C02 Mass Derived Hourly Record = DerivedHourlyValueData rec matching with param C02 or C02M
where Current Date = DerivedHourlyValueData.Date and Current Horn = DerivedHourlyValueData.Hour

If (LME HI Method is not null)

If (C()2 Method Code == "LME")

if {Current C02 Mass Derived Hourly Record.ParameterCode == "C02M")
C02MDerived 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
return result F

else

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1

else

if (Current C02 Mass Derived Hourly Record.ParameterCode == "C02M")

Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
return result F


-------
else

CO 2 Mass Derived Checks Needed = true

If (C()2 Method Code == "AMS")

if (Current C02 Mass Derived Hourly Record. Formu 1 aIdcnti Tier is not null)

C02 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current C02 Mass Derived Hourly
Record. F ormulaldentifier

If (C02 Formula Record is not null)

If (C02 Formula Record.ParameterCode == "C02" AND C02 Formula
Record.EquationCode in set {F-2,F-11})

C02 Method Code == "CEM"

C02 CEM Method Active For Hour = true

Else

If CO2 Mass Derived Hourly Count > 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 C02 Critical Error Level 1

(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 Flow Critical Error Level 1

records at the location.

F	The ParameterCode reported in the DHV record does not match the ParameterCode in Critical Error Level 1

the Method record in your monitoring plan used to determine [eparam].

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-23

Check Name:

Related Former Checks:

Verify C02 Cone Derived and Monitor Hourly Data Record

Applicability:
Description:

CEM Check

This check scans the DerivedHourly ValueData and MonitorHourly ValueData records to ensure that a single
record containing C02 concentration values is reported for the current hour

Specifications:

Current C02 Cone Derived Hourly Record = null

Current C02 Cone Monitor Hourly Record = null

Current C02 Cone Missing Data Monitor Hourly Record = null

CO2 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

CO 2 Cone Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "C02C" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

CO 2 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 + CO2 Cone Monitor Hourly Count

If (Current Hourly Op /?6'cwY/.0perati ngTi 111c > 0)

If ((C02 Cone Checks Needed for Heat Input == true) OR (CO2 Diluent Checks Needed for NOx Rate Calc == true) OR (CO2
Diluent Needed for MA TS == true) OR (CO2 Cone Checks Needed for C02 Mass Calc == true))

If ((CO2 Cone Monitor Hourly Count == 0) AND ((CO2 Cone Checks Needed for Heat Input == true) OR (CO2 Diluent
Checks Needed for NOx Rate Calc == true) OR (CO2 Diluent Needed for MA TS == true)))
return result B

else if (Total C02 Cone Records == 0)
return result A

else if ((C02 Cone Monitor Hourly Count == 2) AND (CO2 Cone Derived Hourly Count == 0) AND ((C02 Diluent
Checks Needed for NOx Rate Calc == true) OR (CO2 Diluent Needed for MA TS == true)) AND ((C02 Cone Checks
Needed for Heat Input == true) OR (CO2 Cone Checks Needed for 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 CO 2 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

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 (CO 2 Cone Derived Hourly Count ==1)

CO2 Cone Derived Checks Needed = true

Current C02 Cone Derived Hourly Record = matching DerivedHourlyValueData 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 ,¥ormu\i\ 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 (C02C Formula record. ParameterCodc == "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 MonitorHourlyValueData rec

else

If (Total CO2 Cone Records > 0)
Return result D

else

If (Total C02 Cone Records > 0)
Return result E

Results:

Result

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

A
B
C
D

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error

E

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:

HOUROP-24

Check Name:

Count Hourly Fuel Flow Records

Related Former Checks:

Applicability:
Description:

General Check

Counts the number of Hourly Fuel Flow Records for the current hour and checks for consistency with Appendix
D and/or Appendix E Methods

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

CO2 App D Method Active For Hour OR
S02 App D Method Active For Hour

Hourly Fuel Flow List = set of all DerivedHourly ValueData records

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.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 {Current Hourly Op Record.LocationNamc begins with "CP")

CP Fuel Count = CP Fuel Count + Hourly Fuel Flow Count

If {Current Hourly Op	Ope rati ngTi mc== 0)

If {Hourly Fuel Flow Count > 0)

Return result A

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

else


-------
Results:

Result	Response	Severity

A	You reported an HFF record, but this is not appropriate for a non-operating hour.	Critical Error Level 1

B	You did not report an HFF record for the hour.	Critical Error Level 1

C	You reported a HFF record, but you did not report an active AD or AE method record in Critical Error Level 1

your monitoring plan for the hour.

D	The FuelCode reported in the HFF record is missing or invalid.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-30

Check Name:

Related Former Checks:

Determine Load Based Status of unit

Applicability:
Description:

General Check

Determines whether current entity is load based

Specifications:

Unit is Load Based = false

Location Name = Current Monitor Plan Location Record. LOC ATIONN AIVIE

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

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-32

Check Name:

Related Former Checks:

Perform Load Checks for Operating Hour

Applicability:
Description:

General Check

Checks to see that Load is populated correctly for operating hours. Also checks Units of Measure Code for
Load

Specifications:

if {Current Hourly Op Record is not null)

Apportionment Op Time Array for this location = Current Hourly Op Record. Ope rat i ngT i me
Apportionment Load Array for this Location = Current Hourly Op Record. HourlyLoad

if (Unit is Load Based == true and Current Hourly Op Record.0 0.0)

if (Current Hourly Op Record. HourLoad is null OR Current Hourly Op Record. HourLoad < 0)
if (Current Entity Type= "Unit")

Unit LoadTimesOpTime Accumulator = -1
else if (Current Entity Type in set {CP, MP})

Pipe LoadTimesOpTime Accumulator = -1

else

Stack LoadTimesOpTime Accumulator = -1
return result A

if (MPStack Config for Hourly Checks == 'MS" AND Current Entity Type == "Unit")

MP Unit Load = Current Hourly Op Record .HourLoad

if (Current Entity Type = "Unit")

if (Unit LoadTimesOpTime Accumulator >= 0)

Unit LoadTimesOpTime Accumulator = Unit LoadTimesOpTime Accumulator +

(Current Hourly Op Record .HourLoad * Current Hourly Op Record.Opc rat i ngT i me)

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.Opc rat i ngTi me)

else

if (Stack LoadTimesOpTime Accumulator >= 0)

Stack LoadTimesOpTime Accumulator = Stack LoadTimesOpTime Accumulator +

(Current Hourly Op Record.HourLoad * Current Hourly Op Record.Opc rat i ngTi me)

if Current Hourly Op Record. LoadU nitsOflVIcasurcCodc not in {"MW","KLBHR", "MMBTUHR"}

MP Load UOM = "INVALID"
return result B

else if (MP Load UOM is not null AND MP Load UOM <> "INVALID" AND MP Load UOM <> Current
Hourly Op Record. LoadU nitsOflVIcasurcCodc)

MP Load UOM = "INVALID"
return result C

else

if (MPLoad UOM is null)

MP Load UOM = Current Hourly Op Record. LoadU nitsOflVIcasurcCodc

Locate the MonitorLoadRecordsByHourandLocation record for the hour and location.

If (only one record is found AND MonitorLoadRecordByHourandLocation.MaximumLoadValuc is
greater than 0),

If (Current Hourly Op Record. LoadU nitsOflVIcasiircCodc ==

else


-------
MonitorLoadRecordByHourandLocation.MaximumLoadUmtsOQsAeasmeCode)

If {Current Hourly Op Record. HourLoad is greater than
MonitorLoadRecordByHourandLocation.MaximumLoadValue)

return result H
else if {Current Hourly Op Record .Hon r Loa d == 0)

If {Current Hourly Op Record. LoadRangc is greater than or equal to 2 OR
Current Hourly Op Ttecon/.CommonStackLoadRange is greater than or equal to
2)

If {Current Entity Type <> "Unit" OR {MP Stack Configfor Hourly
Checks <> "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 {Current Hourly Op Record.HourLoad is not null)
return result D

if Current Hourly Op Record. LoadU nitsOflVIcasurcCodc is not null
return result E

else if {Unit is Load Based == false)

if {Current Hourly Op Record.HourLoad is not null)
return result F

if Current Hourly Op Record. LoadU nitsOflVIcasurcCodc is not null
return result G


-------
Results:

Result	Response	Severity

A	The HourLoad reported in the Hourly Operating record is invalid. The value must be Critical Error Level 1

greater than or equal to 0.

B	The LoadUnitsOfMeasureCode reported in the Hourly Operating record is invalid. Critical Error Level 1

C	You did not report the same LoadUnitsOfMeasureCode for all locations in the	Critical Error Level 1

configuration.

D	You reported HourLoad in the Hourly Operating record. This field should be blank for Critical Error Level 1

a non-operating hour.

E	You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This field Non-Critical Error

should be blank for a non-operating hour.

F	You reported HourLoad in the Hourly Operating record. This field should be blank for Critical Error Level 1

a non-load-based unit.

G	You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This field Critical Error Level 1

should be blank for a non-load-based unit.

H	Warning: The HourLoad reported in the Hourly Operating Data record is higher than the Informational Message

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.

I	The [fieldname] does not correspond to the MaximumLoadUnitsOfMeasure reported in Critical Error Level 2

the monitoring plan.

J	You did not have one and only one valid Monitor Load record that was active during the Critical Error Level 1

hour.

K	The LoadRange or CommonStackLoadRange reported in the Hourly Operating record is Informational Message

inconsistent with the HourLoad. When no load is generated, the load range should be
less than 2.

L	You reported an HourLoad in the Hourly Operating Data record that is 125% or greater Critical Error Level 1

than the MaximumLoadValue in the Monitoring Load record reported in your
monitoring plan.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	HOUROP-33

Check Name:	Check reported Fuel Code for Operating Hour

Related Former Checks:

Applicability:	General Check

Description:	Where applicable, ensures that the fuel code is valid

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.FuelCode is null)

If {Current Hourly Op Record.Ope rat i ngTi llie is greater than 0)
return result A

else

Current Hourly Fuel Group Code = FuelGroupCode from FuelCode table entry where

FuelCode = Current Hourly Op Record .FuelCode
if {Current Hourly Op Record.FuelCode = "NFS" OR

{Current Hourly Fuel Group Code == "COAL" AND Current Hourly Op Record.FuelCode <> "C"))
return result B

else if {Current Hourly Op Record.FuelCode is not null)

if {S02 Bypass Code <> "B YMAXFS" AND NOx Rate Bypass Code <> "B YMAXFS" AND NOx Mass Bypass Code <>
"B YMAXFS")

return result C

Results:

Result
A
B
C

Response

You did not report a FuelCode in the Hourly Operating record.

The FuelCode reported Hourly Operating record is invalid.

You reported a FuelCode in the Hourly Operating record. This value should only be
reported if you use fuel-specific missing data or have an unmonitored bypass stack that
reports emissions based on fuel-specific maximum values.

Severity

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-34

Check Name:	Validate Reported FC Factor

Related Former Checks:

Applicability:	General Check

Description:	Uses cross-check value to ensure that FC Factor reported in Hourly Operating Data is within acceptable range

Validation Tables:

F-Factor Range Checks (Cross Check Table)

Specifications:

if FC Factor Needed = true

Valid FC Factor Exists = false

if (Current Hourly Op RecordFcFactor 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. FcFactor > FC Factor Maximum OR Current Hourly Op Record. FcFactor < FC
Factor Minimum)

return result B

Results:

Result	Response Severity

A	The [FNAME] reported in the Hourly Operating record is missing or invalid.	Critical Error Level 1

B	The [FNAME] reported in the Hourly Operating record is outside of the expected range Critical Error Level 2
from [MIN] to [MAX],

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:	HOUROP-35

Check Name:	Validate Reported FD Factor

Related Former Checks:

Applicability:

Description:	Uses cross-check value to ensure that FD Factor reported in Hourly Operating Data is within acceptable range

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.¥AFncXor <= 0)
return result A

else

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 .V AV'c\c\or < FD
Factor Minimum)

return result B

Results:

Result	Response	Severity

A	The [FNAME] reported in the Hourly Operating record is missing or invalid.	Critical Error Level 1

B	The [FNAME] reported in the Hourly Operating record is outside of the expected range	Critical Error Level 2

from [MIN] to [MAX],

Usage:

1

Process/Category:

Emissions Data Evaluation Report

Unit-Level Evaluation


-------
Check Code:	HOUROP-36

Check Name:	Validate Reported FW Factor

Related Former Checks:

Applicability:	General Check

Description:	Uses cross-check value to ensure that FW Factor reported in Hourly Operating Data is within acceptable range

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.¥w¥i\c\ox <= 0)
return result A

else

Valid FW Factor Exists = true

if (Special Fuel Burned = false)

FW Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor = "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 ,¥w¥i\c\ox < FW
Factor Minimum)

return result B

Results:

Result	Response	Severity

A	The [FNAME] reported in the Hourly Operating record is missing or invalid.	Critical Error Level 1

B	The [FNAME] reported in the Hourly Operating record is outside of the expected range Critical Error Level 2

from [MIN] to [MAX],

Usage:

1

Process/Category:

Emissions Data Evaluation Report

Unit-Level Evaluation


-------
Check Code:	HOUROP-37

Check Name:	Verify Single Heat Input Derived Hourly Record

Related Former Checks:

Applicability:	CEM Check

Description:	Verify that a single Derived Hourly record exists for Heat Input for the current location and hour

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 DerivedHourly ValueData record with parameter beginning with "HI" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour

If Current Hourly Op Record.Opcrati ngTime > 0
If (Heat Input Derived Hourly Count == 0)

If {Heat Input Method Code is not null)

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
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= DerivedHourly ValueData record with parameter "HI" or "HIT" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.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

else

Heat Input Derived Checks Needed = true
If (Heat Input Method Code == "AMS")

if (Current Heat Input Derived Hourly	. Fo rmu 1 a I dc lit i fic r is not null)

HI Formula Record = MonitorFormulaData record where


-------
MonitorFormulaData.FormulalD = Current Heat Input Derived Hourly
Record. Fo rm u 1 a I dc n t i fi c r

If (HI Formula Record is not null)

If (HI Formula Record.ParameterCode == "HI" AND HI Formula
Record.EquationCode in set {F-15,F-16,F-17,F-18})

Heat Input Method Code == "CEM"

Heat Input CEM Method Active For Hour == true

else

If Heat Input Derived Hourly Count > 0
return result D

Results:

Result
A

B

C
D

Response	Severity

You did not report a DHV record for HI (or HIT) for the hour. If you have entered Critical Error Level 1

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 Critical Error Level 1
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].

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
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.¥c¥i\c\ox is not null OR Current Hourly Op Record.FdFactor is not null OR Current Hourly Op
Record.¥w¥i\c\ox 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. U nitFuclCd in set {OOL, PRG, PRS, OGS}

Special Fuel Burned = true

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:	HOUROP-39

Check Name:	Verify Single H20 Cone Derived or Monitor Hourly Data Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check scans the DerivedHourlyValueData and MonitorHourly ValueData records to ensure that a single

record containing H20 concentration values is reported for the current hour

Specifications:

H20 Monitor Hourly Checks Needed = false
H20 Derived Hourly Checks Needed = false
CurrentH20 Monitor Hourly Record = null
Current H20 Derived Hourly Record = null
02 Wet Checks Neededfor H20= false
02 Dry Checks Neededfor H20= false

If Current Hourly Op Record.Opcrati ngTi 111c > 0.00

If (Moisture Needed == true)

If H20 Monitor Hourly Count + H20 Derived Hourly Count == 0

If (H2() Method Code == "MWD")
return result A

Else if (H2() 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)

Current H20 Derived Hourly Record = DerivedHourlyValueData 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 H2() Derived Hourly Record. ModcCodc in set {01, 02, 03, 04, 05, 21, 53, 54} AND CurrentH20
I)eri ved Hourly Record. Fo rmu 1 a I dc n t i fic r is not null)

H20 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current H20 Derived Hourly Record. Fo ri nil 1 a I dc n t i fi c r

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 Neededfor 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

Informational Message

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:

HOUROP-40

Check Name:

Verify Single 02 Dry Monitor Hourly Value Record

Related Former Checks:

Applicability:
Description:

CEM Check

This check scans the MonitorHourly ValueData records to ensure that a single 02 Wet exists for the current
hour.

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 Record.Opcrati ngTi 111c > 0.00

If ((()2 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 Needed for H20 == true) OR (02 Dry Needed for MA TS ==
true))

If ((02 Dry Monitor Hourly Count == 0) AND ((()2 Wet Checks Neededfor Heat Input == true) OR (02 Wet Checks
Neededfor NOx Rate Calc == true) OR (()2 Wet Checks Needed To Support C02 Calculation == true) OR (()2 Wet
Checks Needed for H20 == true) OR (02 Wet Needed for MA TS == true)))
return result A

Else if (()2 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 (()2 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count == 2)

If (02 Dry Checks Needed for Heat Input == true AND (()2 Dry Checks Needed for NOx Rate Calc == true OR
02 Dry Checks Neededfor H20 == true) OR (02 Dry Needed for MA TS == 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 = MonitorHourlyValueData.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 = MonitorHourlyValueData.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

else

return result C
Else if (()2 Dry Monitor Hourly Count ==1)


-------
()2 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 (()2 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 (02 Dry Monitor Hourly Count > 0)

Return result D

If ((()2 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) AND (()2 Wet Needed for MA TS == false))

return result E

else

If (02 Dry Monitor Hourly Count 02 + Null Monitor Hourly Count + 02 Wet Monitor Hourly Count > 0)
Return result F

Results:

Result

A

B

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

C

Critical Error Level 1

D

Non-Critical Error

E

Non-Critical Error

F

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:	HOUROP-41

Check Name:	Verify Single 02 Wet Monitor Hourly Value Record

Related Former Checks:

Applicability:	CEM Check

Description:	This check scans the MonitorHourly ValueData records to ensure that a single 02 Wet exists for the current

hour.

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.Opcrati ngTi 111c > 0.00

If ((()2 Wet Checks Neededfor Heat Input == true) OR (()2 Wet Checks Neededfor NOx Rate Calc == true) OR (()2 Wet Checks
Needed To Support C02 Calculation == true) OR (02 Wet Checks Needed for H20 == true) OR (02 Wet Needed for MA TS ==
true))

If ((()2 Wet Monitor Hourly Count == 0) AND ((()2 Dry Checks Needed for Heat Input == true) OR (()2 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) OR (02 Dry Needed for MA TS == true)))
return result A

Else if (()2 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 Needed for Heat Input == true) AND (02 Dry Monitor Hourly Count + 02 Null
Monitor Hourly Count <> 2) AND ((()2 Wet Checks Needed for NOx Rate Calc == true) OR (()2 Wet
Checks Needed for H20 == true) OR (02 Wet Needed for MA TS == 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

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

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Else if (()2 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 (02 Wet Monitor Hourly Count > 0)

Return result D

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:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Code:

HOUROP-42

Check Name:

Related Former Checks:

Verify Single S02R Derived Hourly Data Record

Applicability:
Description:

CEM Check

This check scans the DerivedHourly ValueData records to ensure that a single record containing S02R derived
values is reported for the current hour

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.Opcrat ingTime > 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:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

HOUROP-43

Check Name:	Validate Single Stack Flow Record

Related Former Checks:

Applicability:	CEM Check

Description:	Counts records in MonitorHourlyValueData for the current date and hour with parameter "FLOW". Based on

whether or not OperatingTime is non-zero for this hour, reports any appropriate errors and sets Current Flow
Monitor Hourly Record

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

Else

Current Stack Flow Hourly Record = MonitorHourlyValueData record with parameter FLOW where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour

else

If Flow Monitor Hourly Count > 0
return result C

Results:

Result	Response	Severity

A	You did not report an MHV record for FLOW for the hour.	Critical Error Level 1

B	You reported more than one MHV record for FLOW for the hour.	Critical Error Level 1

C	You reported a MHV record for FLOW, but this record is not appropriate for the hour.	Non-Critical Error

Usage:

1	Process/Category: Emissions Data Evaluation Report	Unit-Level Evaluation


-------
Check Category:
Leak Status


-------
Check Code:	LKSTAT-1

Check Name:	Locate Most Recent Prior Leak Check
Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior Leak Check.

Specifications:

Set PriorLeakRecord = null.

Locate the most recent record in LeakCheckRecordsByLocationForQAStatus for the location where:

a)	the ComponentID is equal to the CurrentMHV.ComponentW

b)	the TestResultCd is not equal to "INVALID" and

c)	the EndDate/Hour is on or prior to the CurrentMHVRecord.Date/Hour

if (LeakCheckRecordsByLocationForQAStatus is found)

Set PriorLeakRecord = the found record in LeakCheckRecordsByLocationForQAStatus.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Leak Check Status Evaluation


-------
Check Code:	LKSTAT-2

Check Name:	Locate Most Recent Prior Event

Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior event.

Specifications:

Set PriorLeakEventRecord = null.

Set LeakStatusResult = null

If (PriorLeakRecord is null)

Locate the latest record in QACertificationEventRecords where the ComponentID is equal to the CurrentMHV.ComponentID,
QaCertEventCode is equal to "300" or "305", and the QACertEventDate/Hour is prior to CurrentReportingPeriod.

if (OA Certification EventRecord is found)

Set PriorLeakEventRecord = the found record in QACertificationEventRecord.

Locate the latest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhv Record.SystcmID. TestReasonCode is equal to "INITIAL" or "RECERT", TestResultCode is equal to
"PASSED", and EndDateHour is after OA Certification E ven tRecord. Q A Cc rt E v e n t D a tc/ H o u r and is prior to
CurrentReportingPeriod.

if found,

Set LeakStatusResult = "OOC-Event".

else

Set LeakStatusResult = "IC".

else

Locate the SystemComponent record with the earliest BeginDate where the ComponentID is equal to the
CurrentMHV .Compo ne lit ID.

If found, and the BeginDate in the SystemComponent record is in the current reporting period,

Set LeakStatusResult = "IC"

else

Set LeakStatusResult = "OOC-No Prior Test".

else

Locate the latest record in QACertificationEventRecords where the ComponentID is equal to the CurrentMHV.ComponentID,
LeakRequired is equal to "Y" and QaCertEventCode is not equal to "300", and the QACertEventDate/Hour is prior to the
CurrentMHVRecord.Date/Hour and after the PriorLeakRecord.EndDate/Hour,

if a record is found

Set PriorLeakEventRecord = the found record in QACertificationEventRecords.

if Priori. eakE vent Record. La s t C o m p 1 c tc dTc s t D a t c is not null

Set ExpectedLeakCheckQuarter = the quarter of PriorLeakEventRecord.LastCompletedTestDate.

else

Set ExpectedLeakCheckQuarter = the quarter after Priori. eakE vent Record. Q A C c rt E v e n t D a t c.

Set QuartersAfterCount = 0.

For each quarter beginning with ExpectedLeakCheckQuarter and ending with CurrentReportingPeriod,

if QuartersAfterCount is equal to 4,

Set RequiredLeakCheckQuarter to quarter.


-------
Exit the loop.

else 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 ()peratingSuppl)ataRecordsIiyLocation. Op Va 1 lie >= 168

Set RequiredLeakCheckQuarter to quarter.

Exit the loop.

else

Set RequiredLeakCheckQuarter to quarter.

Exit the loop.

Increament QuartersAfterCount by 1.

if RequiredLeakCheckQuarter is prior to CurrentReportingPeriod
Set LeakStatusResult ="OOC-Event".

else

Set LeakStatusResult — "IC".

else if Priori.eakRecord. Q ANccdsEva 1 uat io nF1 ag = "Y"

Set LeakStatusResult = "Prior Test Not Yet Evaluated".

else if Priori, eak Record. Tc s t R c s u 11C d is null

Set LeakStatusResult = "OOC-Test Has Critical Errors".

else if Prior L eak Record. Tc s t R c s u 11C d == "FAILED"

Set LeakStatusResult = "OOC-Test Failed".

else if Prior L eak Record. Tc s t R c s u 11C d == "ABORTED"

Set LeakStatusResult = "OOC-Test Aborted".

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Leak Check Status Evaluation


-------
Check Code:	LKSTAT-3

Check Name:	Determine Expiration Date For Prior Leak Check
Related Former Checks:

Applicability:	CEM Check

Description:	Determines if Leak Check occurred prior to the standard expiration date.

Specifications:

if (LeakStatusResuIt is null)

Set PriorLeakExpirationDate = Priori, eak Record. Tc s t E \ p i ra t i o n D a tc.

if (PriorLeakExpirationDate is null)

if {Annual Reporting Requirement == false)

if (PriorLeakRecord .TestEndQuarter = "2")

Set PriorLeakExpirationDate = September 30th following PriorLeakRecord .EndDate.

else

Set PriorLeakExpirationDate = June 30th following PriorLeakRecord .EndDate.

else

if (PriorLeakRecord .GracePeriodlnd =1)

Set PriorLeakExpirationDate = the end of the quarter of the PriorLeakRecord.EndDate.

else

Set PriorLeakExpirationDate = the end of the quarter following the quarter of the PriorLeakRecord
.EndDate.

Set PriorLeakRecord .TestExpirationDate = PriorLeakExpirationDate.
if (CurrentMH VRecord Date is ON OR BEFORE the PriorLeakExpirationDate)

Set LeakStatusResuIt = "IC".

else

Set PriorLeakExpirationDate = null.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Leak Check Status Evaluation


-------
Check Code:

LKSTAT-4

Check Name:

Determine Extended Expiration Date for Prior Leak Check

Related Former Checks:

Applicability:

Description:

Specifications:

CEM Check

Determines if Leak Check occurred prior to the extended expiration date.

Set LeakMissingOpDatalnfo = null.

if (LeakStatusResult is null)

Set MissingOpData = false

if (PriorLeakRecord.TcstExpi rationDatcW i thE\tc nsio n is null)

For each quarter beginning with the quarter of the PriorLeakExpirationDate and continuing through the quarter prior to the
quarter of the CurrentMHVRecord.Date:

if (EarliestLocationReportDate > the last day of the quarter being checked)

Set NumberOfExtensionQuarters = NumberOJExtensionQuarters + 1.

else

If (Annual Reporting Requirement == true OR the quarter being checked is == 2 or 3)

If {Annual Reporting Requirement == true OR the quarter being checked ==3)

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.

else

Locate a record in OperatingSuppDataRecordsBy Location where the reporting period is
equal to the year/quarter being checked and the OpTypeCode = "OSHOURS" and
FuelCode is null.

if (OperatingSuppDataRecordsByLocation is found AND
OperatingSuppDataRecordsBy Location.OpVMuc < 168)

If (Annua! Reporting Requirement = true OR the quarter being checked == 2)

Set NumberOfExtensionQuarters — NumberOfExtensionQuarters + 1.

else

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 3.
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 after 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 LeakMissingOpDatalnfo = "[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.

Set Missing Op Data to true

Set LeakMissingOpDatalnfo = "[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.

Stop looking for extensions.

Add NumberOfExtensionQuarters to PriorLeakExpirationDate

Set Priori.eakRecorcl.Tcst E\pi rat io nDatcW ithE\tcns io n = PriorLeakExpirationDate

else

Set PriorLeakExpirationDate = Priori.eakRecorcl.Tcst E\pi rat io nDatcW ithE\tcns io n
If (CurrentMHVRecord.Date/Hour is ON OR BEFORE the PriorLeakExpirationDate)

Set LeakStatusResuIt = "IC-Extension".

else if {Missing Op Data == true)

Set LeakStatusResuIt = 'Missing Op Data".

Set Priori.eakRecorcl.Tcst E\pi rat io nDatcW ithE\tc lis io n = null

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Leak Check Status Evaluation


-------
Check Code:	LKSTAT-5

Check Name:	Determine Grace Period for Leak Check
Related Former Checks:

Applicability:	CEM Check

Description:	Determines if Leak Check occurred prior to the end of the grace period.
Specifications:

if (LeakStatusResuIt is null)

if (Annual Reporting Requirement == false)

Set LeakStatusResuIt = "OOC-Expired".

else if (Rpt Period Op Hours Accumulator Array for the location == -1)

Set LeakStatusResuIt = "Invalid Op Data".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if (GraceOpHours > 168)

Set LeakStatusResuIt = "OOC-Expired".

else

If the quarter after the LATER of the PriorLeakExpirationDate and the EarliestLocationReportDate is the quarter
of the CurrentMHVRecordDate/Hour,

else

Set LeakStatusResuIt = "IC-Grace".

For each quarter beginning with the quarter after the LATER of the PriorLeakExpirationDate and the
EarliestLocationReportDate ,and continuing through the quarter prior to the
CurrentMHVRecord 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 > 168)

Set LeakStatusResuIt = "OOC-Expired".
exit for.

else

Set LeakStatusResuIt = 'Missing Op Data".

Set LeakMissingOpDatalnfo = "[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 (LeakStatusResult is null)

Set LeakStatusResult = "IC-Grace".

if LeakStatusResult does not begin with "IC"
return LeakStatusResult

Results:

Result

Invalid Op Data
Missing Op Data

OOC-Event

OOC-Expired
OOC-No Prior
Test

OOC-Test
Aborted

OOC-Test Failed
OOC-Test Has
Critical Errors
Prior Test Not
Yet Evaluated

Response

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 Leak Check status for [COMPID] could not be determined, because the Op Supp

Data record for OPHOURS or OSHOURS 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 [compid], but you did not perform a subsequent leak
check.

The prior leak check for [compid] completed on [date] has expired.

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

The prior leak check for [compid] completed on [date] was aborted.

The prior leak check for [compid] completed on [date] failed.

The prior leak check for [compid] completed on [date] has critical errors.

The [testtype] status for [key] could not be determined, because the applicable prior
[testtype] with TestNumber [testnum] 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

Usage:

1	Process/Category: Emissions Data Evaluation Report	Leak Check Status Evaluation


-------
Check Category:
Linearity Status


-------
Check Code:	LINSTAT-1

Check Name:	Check Analyzer Range Exemption For Linearity Status

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines if the Current Analyzer Range used is exempt for Linearity Status purposes.

Specifications:

Set CurrentLinearifyStatus = null

if (CurrentMHI'Parameter = "S02C" or CurrentMHI 'Parameter = "NOXC")

Locate the record in MonitorSpanRecordsByHourLocation for the hour and location where the ComponentTypeCode is equal to
the QaStatusComponentTypeCode 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 (MonitorSpanRecordsByHourLocation is found and MonitorSpanRecordsIiyHourLocation.Span Va 1 lie <= 30)

Set CurrentLinearifyStatus = "IC-Exempt".

Results:

Result

Usage:

1

2

3

4

5

6

Response

Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:

Severity

Emissions Data Evaluation Report	C02 Linearity Status Evaluation

Emissions Data Evaluation Report	Hg Linearity Status Evaluation

Emissions Data Evaluation Report	NOX Linearity Status Evaluation

Emissions Data Evaluation Report	02 Dry Linearity Status Evaluation

Emissions Data Evaluation Report	02 Wet Linearity Status Evaluation

Emissions Data Evaluation Report	S02 Linearity Status Evaluation


-------
Check Code:

LINSTAT-2

Check Name:

Related Former Checks:

Locate Most Recent Prior Linearity Test

Applicability:
Description:

CEM Check

Determines if there is an applicable prior Linearity test.

Specifications:

Set Prior Linearity Record = null.

Set InvalidLinearityRecord = null.

if (CurrentLinearifyStatus 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 CurrentDateHour OR

b)	equal to the CurrentDateHour and the EndMinute is less than 45 and the CalculatedTestResult is equal to "PASSED" or
"PASSAPS".

if (LinearityTestRecordsByLocationForQAStatus is found)

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

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 CurrentDateHour and the EndDate/Hour is greater than the Prior TestRecord. EndDate/Hour
and the CalculatedTestResult is equal to "INVALID".

if (LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.

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 CurrentDateHour.

if (LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.

else

Results:

Result

Response

Severity


-------
Process/Category
Process/Category
Process/Category
Process/Category
Process/Category
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

C02 Linearity Status Evaluation
Hg Linearity Status Evaluation
NOX Linearity Status Evaluation
02 Dry Linearity Status Evaluation
02 Wet Linearity Status Evaluation
S02 Linearity Status Evaluation


-------
Check Code:	LINSTAT-3

Check Name:	Locate Most Recent Prior Event

Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior event.

Specifications:

Set PriorLinearifyEventRecord = null,
if (CurrentLinearifyStatus 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 CurrentDateHour OR

b)	equal to both the CurrentDateHour and the ConditionalBeginDate/Hour;

AND either

a)	Prior Test Record is null OR

b)	QACertEventDate/Hour is after the Prior TestRecord. E ndDate/Hour OR

c)	QACertEventDate/Hour is equal to the Prior TestRecord. E ndDa tc/H o u r AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the Prior TestRecord. E ndDa te/H o u r)

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode <> 27 or 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 CurrentDateHour
if {QACertiflcationEventRecords is found)

Sort QACertiflcationEventRecords by QACertEventDate/Hour descending.

For each record in QACertiflcationEventRecords

Set PriorLinearityEventRecord = the found record in QACertiflcationEventRecords.

if (Priori.inearityEventRecord.Q ACcrtEventCodc = 170 and DualRangeStatus = true)

Locate the record in MonitorSpanRecordsByLocation where the ComponentTypeCode is equal to
QaStatusComponentTypeCode and the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed and
the BeginDate/Hour is equal to the Priori, in earityE ventRecord. Q A C c rt E v e n t D a t c/H o u r.

if (MonitorSpanRecordsByLocation is found)
exit for loop.

else


-------
set PriorLinearityEventRecord = null.

else

exit for loop.

If (PriorLinearityEventRecord is null)

If (PriorLinearityRecord is null)

Set CurrentLinearityStatus = "OOC-No Prior Test or Event".

else if (InvalidLinearityRecord is not null ANDPriorLinearityEventRecord.QACeriEveniDate/Ylour is after
In valid Test Record. E nd D a t c/H o u r)

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.inearityEventRecord.Q ACcrtEventDatc/Hour and prior to
the CurrentDateHour.

if (Linearity TestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.

else

Set InvalidLinearityRecord = null.

Results:

Result

Usage:

1

2

3

4

5

6

Response

Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:

Severity

Emissions Data Evaluation Report	C02 Linearity Status Evaluation

Emissions Data Evaluation Report	Hg Linearity Status Evaluation

Emissions Data Evaluation Report	NOX Linearity Status Evaluation

Emissions Data Evaluation Report	02 Dry Linearity Status Evaluation

Emissions Data Evaluation Report	02 Wet Linearity Status Evaluation

Emissions Data Evaluation Report	S02 Linearity Status Evaluation


-------
Check Code:

LINSTAT-4

Check Name:

Determine Expiration Dates For Most Recent Prior Linearity Test

Related Former Checks:

Applicability:
Description:

CEM Check

Determines the expiration dates for the Applicable Prior Linearity test. This includes the Test Expiration Date
both with and without any extensions

Specifications:

Set LinearityMissingOpDatalnfo = null.

if (CurrentLinearifyStatus is blank and PriorLinearityRecord is not null and PriorLinearityEventRecord is null)

Set CheckForlgnoredLinearity = true.

Set PriorTestExpirationDate = null

Set PriorTestExpirationDateWithExtension = null

Set MissingOpData = false

if (Pr iorLinearity Record .Q ANccdsEvahmUonFhg = "Y")

Set CurrentLinearifyStatus = "Prior Test Not Yet Evaluated".

else if (PrioriAnearity Record.T cstRcsultCodc = null or PriorLinearityRecord J cstRcsultCodc = "FAILED" or
Prior L in earity Record. Tc s t R c s u 11 Co dc = "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 CurrentDateHour AND

b)	on or after the PriorTestRecord.EndDi\\dY\oux'.

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

c)	QACertEventCode <> 27 or 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 TAStatus. DMc
if (QACertificationEventRecords is found)

Set PriorLinearityEventRecord = found record in QACertificationEventRecords.
elseif (Prior L in earity Record. Tc s t R c s u 11C o dc = null)

Set CurrentLinearifyStatus = "OOC-Test Has Critical Errors",
elseif (PriorLinearityRecord J cstRcsultCodc = "FAILED")

Set CurrentLinearifyStatus = "OOC-Test Failed".


-------
else if (Prior Linearity Record! cstRcsultCodc = "ABORTED")

Set CurrentLinearityStatus = "OOC-Test Aborted".

else

Set PriorTestExpirationDate = Priori, in earity Record. Tc s t E \ p i ra t i o n D a tc.

SetPriorTestExpirationDateWithExtension = PriorL inearity Record. Tc s t E \ p i ra t i o n D a tc W i t h E \ t c n s i o n.
if {PriorTestExpirationDate is null)

if {Annual Reporting Requirement == false)

if (PrioriJn earity Record .TcslEndQunvlcr = "2")

Set PriorTestExpirationDate = July 30th following PriorLinearityRecord.EndDate.

else

Set PriorTestExpirationDate = April 30th following PriorLinearityRecord.EndDate.

else

Set AlternateTestDate = null

if (Prior Linearity Record. Co mponc ntTy pcCodc is equal to "HG")

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and the
EmissionsRecordingBeginDate is ON OR BEFORE the BeginDate of the associated system in the
Prior Linearity Record.

if found

Set AlternateTestDate = EmissionsRecordingBeginDate of the located record

Locate the most recent QACertificationEventRecords for the ApplicableComponentID where
LinearityRequired is equal to "Y", and the BeginDate/Hour is prior to the
Prior Linearity Record. B eg i n Da tc/H o u r.

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. E nd D a t c/ H o u r)

If AlternateTestDate is null

Set PriorTestExpirationDate = the end of the quarter following the quarter of the
OA CertificationEventRecords. CompletionT estDate.

Else

Set PriorTestExpirationDate = the end of the quarter following the quarter of the later of
OA Certification EventRecord.s.Comp\cUon7 est Date and AlternateTestDate .

else if (PriorLinearityRecord GmccPcvlodlnd =1)

If AlternateTestDate is null

Set PriorTestExpirationDate = the end of the quarter of the quarter of the
PriorL in earity Record. E ndDa tc.

Else


-------
Set PriorTestExpirationDate = the end of the quarter of the quarter of the later of
Priori,inearityRecord.EndDatc and AlternateTestDate .

else

If AlternateTestDate is null

Set PriorTestExpirationDate = the end of the quarter following the quarter of the
Prior Linearity Record. EndDate.

Else

Set PriorTestExpirationDate = the end of the quarter following the quarter of the later of
Priori, in earity Record. EndDate and AlternateTestDate .

Set Priori, in earity Record. Tc s t E \ p i ra t i o n D a tc = PriorTestExpirationDate.

if (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate)

Set CurrentLinearityStatus = "IC".

else if {Annual Reporting Requirement == false)

Set CurrentLinearityStatus = "OOC-Expired".

else

if (PriorTestExpirationDateWithExtension is null)

Set NumberOfExtensionQuarters = 0;

For each quarter beginning with the quarter of the PriorTestExpirationDate and continuing through the
quarter prior to the quarter of the CurrentDate,

if (NumberOfExtensionQuarters = 3)

Stop looking for extensions.

else

if (EarliestLocationReportDate > 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
()peratingSuppI)ataRecordsIiyLocation.OpVa 1 lie < 168)

Set NumberOfExtensionQuarters — NumberOfExtensionQuarters + 1.

else if (PriorLinearity Record .ComponcnfTypcCodc is NOT equal to "HG")

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)

Set NumberOfExtensionQuarters =
NumberOfExtensionQuarters + 1.

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.


-------
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.

if (Prior Linearity Record. Co mpo ncntTy pcCodc is NOT equal to "HG")

For each quarter beginning with the quarter after the End Quarter and continuing through the
quarter prior to the quarter of the CurrentDateHour

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.

Set PriorTestExpirationDateWithExtension = PriorTestExpirationDate.

Add NumberOfExtensionQuarters to PriorTestExpirationDate WithExtension.

Set Priori.inearityRecord.TcstE\pi rationDatc WithE\tcnsion = PriorTestExpirationDate WithExtension.

else

Set Priori, in earity Record. Tc s t E \ p i ra t i o n D a tc W i t h E \ t c n s i o n = PriorTestExpirationDate

If (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDateWithExtension)

Set CurrentLinearityStatus = "IC-Extension".

else if {Missing Op Data == true)

Set CurrentLinearity Status = 'Missing Op Data".

Set Prior L in earity Record. Tc s t E \ p i ra t i o n D a tc W i t h E \ t c n s i o n = null

else if (Rpt Period Op Days Accumulator Array for the location == -1)

Set CurrentLinearity Status = "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 CurrentDateHour,

Set CurrentLinearity Status = "IC-Grace".


-------
else

Results:

Result

Usage:

1

2

3

4

5

6

Response

Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:
Process/Category:

For each quarter beginning with the quarter after the

PriorTestExpirationDateWithExtension and continuing through the quarter prior to the
CurrentDateHour,

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.

if (CurrentLinearityStatus is null)

Set CurrentLinearityStatus = "IC-Grace".

Severity

Emissions Data Evaluation Report	C02 Linearity Status Evaluation

Emissions Data Evaluation Report	Hg Linearity Status Evaluation

Emissions Data Evaluation Report	NOX Linearity Status Evaluation

Emissions Data Evaluation Report	02 Dry Linearity Status Evaluation

Emissions Data Evaluation Report	02 Wet Linearity Status Evaluation

Emissions Data Evaluation Report	S02 Linearity Status Evaluation


-------
Check Code:

LINSTAT-5

Check Name:

Related Former Checks:

Determine Event Conditional Status

Applicability:

Description:

Specifications:

CEM Check

If a QA Cert Event was found that affects this MHV record, evaluate the conditional status.

Set SubsequentLinearityRecord = null.

if (CurrentLinearifyStatus is null and PriorLinearifyEventRecord is not null)

if (/3/*iw/.i«6'c//*%£'v'6'rt?/?6'cwY/.ConditionalDataBeginDatc/Hour is null or CurrentDateHour is prior to the
PriorLinearityEventRecord.Conditiom\D?A2iBQgvaD?&QrRom)

Set CurrentLinearityStatus = "OOC-Event".

else

if (CurrentMhvComponentType = "HG")

Locate the earliest record in IAnearityTestRecordsByLocationForQAStatus where the Test Type Code = "HGSI3,"
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 PriorLinearityEventRecord.ConditiomSDataBQgvaDatQrRow.

Locate the earliest record in Linearity TestRecordsByLocationForQAStatus where the ComponentID is equal to the
ApplicableComponentLD, the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed, the CalculatedTestResult
is not equal to "INVALID" and the EndDate/Hour is on or after the
PriorLinearityEventRecord.CondLitiowiDataBQgvaDatQlYiom.

if (Linearity TestRecordsByLocationForQAStatus is found)

Set SubsequentLinearityRecord = the found record in LinearityTestRecordsByLocationForQAStatus.

if (Linearity TcstRecorcls/iyLocationForOAStatus.QANccdsEvAhvMionFhg = "Y")

Set CurrentLinearifyStatus = "Recertification Test Not Yet Evaluated".

else if (LinearityTestRecords/iy Location ForOAStatus.TcslRcsu\lCodc is null)

Set CurrentLinearifyStatus = "OOC-Recertification Test Has Critical Errors".

else if (LinearityTe.stRecord.sBy Location ForOAStatu.s.7cs[Rcsu\[Codc = "FAILED")

Set CurrentLinearifyStatus = "OOC-Recertification Test Failed".

else if (LinearityTestRecords/iy Location ForOAStatus.TcslRcsu\lCodc = "ABORTED")

Set CurrentLinearifyStatus = "OOC-Recertification Test Aborted".

If (LnvalidLinearityRecord is null)

if (CurrentMhvComponentType = "HG")

Locate the earliest record in LinearityTestRecordsByLocationForQAStatus where the Test Type Code
= "HGSI3," the ComponentID is equal to the ApplicableComponentLD, the SpanScaleCode is equal
to the CurrentAnalyzerRangeUsed, the CalculatedTestResult is equal to "INVALID" and the
EndDate/Hour is on or after the /3/-;7W.;Wrt/-;Yy£'v6'rt?/?6'ewY/.ConditionalDataBcginDatc/Hour and is
before the EndDate/EndHour of the LinearityTestRecordsByLocationForQAStatus record retrieved
above.

else


-------
else

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 PriorLinearityEventRecord.CondiitiomSD&taBQgvaDatQiYiom and is before the
EndDate/EndHour of the LinearityTestRecordsByLocationForQAStatus record retrieved above.

if (LinearityTestRecordsByLocationForQAStatus is found)

Set InvalidLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.

if (CurrentLinearityStatus is null AND Annual Reporting Requirement == false)

If (SubsequentLinearityRecord is not null and SubsequentLinearityRecord.EndDate/Hour is greater than October
30th of the year of the CurrentDateHour) OR (SubsequentLinearityRecord is null and the CurrentDateHour is in
the 3rd quarter))

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

if (CurrentLinearityStatus is null)

if (PriorLinearityEventRecord. L i ncari ty Cert Eve nt == "Y") and (PrioriAmearityE ventRecord. Sy stc mTy pcCodc is
NOT in set (ST))

if (Priori, in earityE vent Record. E v e n t C o dc = 125)

If (Priori Am earityE ventRecord .Monho ri ngSy stem ID is null)

Set CurrentLinearityStatus = "Invalid Certification Event"

else if (the associated BeginDate of the system in the PriorLinearityEventRecord is null)
Set CurrentLinearityStatus = "Invalid Monitor System"

else

If (the associated SystemTypeCode of the system in the PriorLinearityEventRecord ==
"S02")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {ARP, CAIRS02,
TRS02G1, TRS02G2} and 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 ProgramCode is in set
{ARP, CAIRS02, TRS02G1, TRS02G2} 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 PriorLinearityEventRecord
== "NOX")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {ARP, NBP,
NHNOX, CAIRNOX, CAIROS, TRNOX, TRNOXOS, SIPNOX} and 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 ProgramCode is in set


-------
{ARP, NBP, NHNOX, CAIRNOX, CAIROS, TRNOX, TRNOXOS,
SIPNOX} and the EmissionsRecordingBeginDate is ON OR BEFORE
the associated BeginDate of the system in the
Prior LinearityEventRecord.

else if (the associated SystemTypeCode of the system in the PriorLinearifyEventRecord

== "NOXC")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {NBP, NHNOX,
CAIRNOX, CAIROS, TRNOX,TRNOXOS, SIPNOX} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the Prior Linearity EventRecord.

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, TRNOX,TRNOXOS, 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 PriorLinearityEventRecord

== "HG")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {MATS} and 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 ProgramCode is in set
{MATS} 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 (LocationProgramRecordsByHourLocationUmtMomtorCertDeadline is not null)

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocationUmtMomtorCertDeadlme)
Set CurrentLinearity Status = "IC-Conditional".

else

Set CurrentLinearity Status = "OOC-Conditional Period Expired".


-------
else

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocation.UmtMomtorCertBeginDate +180
days)

Set CurrentLinearity Status = "IC-Conditional".

else

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else

If (the number of calendar days ON OR AFTER the

Priori.inearityEventRecorcl.Q ACc rtEvent Datc and ON OR BEFORE the CurrentDateHour >

180)

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else if (the quarter of the PrioriJnearity EventRecorcl.Q ACcftEvcnlDMc is equal to the quarter of
the CurrentDateHour)

If (the number of calendar days ON OR AFTER the

Prior L in earityE ventRecorcl. Q A Cc rt E vc lit Da tc and ON OR BEFORE the

CurrentDateHour > 90)

If (Rpt Period Op Hours Accumulator Array for the location == -1)
Set CurrentLinearity Status = "Invalid Op Data".

else if (the number of calendar days ON OR AFTER the

PrioriJnearity EventRecorcl.Q ACcvlEvcnlD'Mc and ON OR BEFORE the

CurrentDateHour is equal to Rpt Period Op Days Accumulator Array for the

location)

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else

Set CurrentLinearity Status = "IC-Conditional".

else

Set CurrentLinearity Status = "IC-Conditional".

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

for each quarter beginning with the quarter of the

Pr iorLin earityE ventRecorcl.QACcvlEvcnlDMc and continuing through the quarter
BEFORE the CurrentDateHour.

if (Earliest!AicationReportDate <= 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.MinOpDaysPriorQuarter = -1
Set lAnearityMissingOpDcitalnfo = "[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
Prior Linearity EventRecord.Q ACcvlEvcnlD'Mc

If (()peratingSuppI)ataRecordsbyL ocation.O p Va 1 lie

MINUS the number of calendar days in the quarter

being checked that are PRIOR to the

Prior Linearity EventRecord.Q ACcftEvcnlD'Mc > 0)

Set

Priori, in earityE vent Record. IVI i nO p D ay s P ri o rQ

uarter =

()peratingSuppI)ataRecordsbyL ocat ion.Op V a 1

ue MINUS the number of calendar days in the
quarter being checked that are PRIOR to the
PriorL in earityE ventRecorcl. Q A C c rt E v e n t D a t c

If (()peratingSuppI)ataRecordsbyL ocation.O p Va 1 lie is

less than the number of calendar days in the quarter
being checked that are ON OR AFTER the
Prior Linearity EventRecord.Q ACcftEvcnlD'Mc)

Set

PriorL in earityE vent Record. IVI a x O p D ay s P ri o r

Quarter =

()peratingSuppI)ataRecordsbyL ocat ion.Op V a 1

ue.

else

Set

PriorL in earityE vent Record. IVI a x O p D ay s P ri o r

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

PriorL in earityE vent Record. Q A C c rt E v e n t D a t c.

Set

PriorLinearityEventRecord.MlnOpDnysPvlorQunvlcr =
PriorLinearityEventRecord.M'mOpDaysPriorQuarlcr +
()peratingSuppI)ataRecordsbyL ocation.O p V a 1 lie.
Set PriorL in earityE vent Record. IVI a \ O p D a\ s

PriorQuarter =

PriorLinearityEventRecord.Mi\xOpDi\\sPviorQui\vlcr +
()peratingSuppI)ataRecordsby Location.O p V a 1 lie.

if (PriorLinearityEventRecord.MinOpDaysPriorQuarter == -1
set CurrentLinearityStatus to "Missing Op Data"

else if (PriorEventRecord.MinOpDaysPnorQuarter + Rpt Period Op Days Accumulator
Array for the Location > 90)

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else if (PriorEventRecord.MaxOpDaysPnorQuarter + Rpt Period Op Days Accumulator
Array for the Location > 90)

Set CurrentLinearityStatus = "Undetermined-Conditional Data".

else

Set CurrentLinearityStatus = "IC-Conditional".


-------
else

Set CurrentLinearity Status = "IC-Conditional".

If (the quarter of the Priori. inearityE vent Record. Co ndi t i o na 1B eg i n Da tc is equal to the quarter of the
CurrentDateHour)

Count the number of HourlyOpData records for the location where OpTime is greater thanO and
Date/Hour is ON OR AFTER the Priori.inearityEventRecord. Co ndi t io na 1Begi nDatc/Hour and
ON OR BEFORE the CurrentDateHour,

If the number > 168,

Set CurrentLinearity Status = "OOC-Conditional Period Expired".

else

Set CurrentLinearity Status = "IC-Conditional".

if (Priori. inearityE ventRecord. IVI i nO p H o u rs P ri o rQua rtc r is null)

Set Priori. inearityE ventRecord. IVI i nO p H o u rs P ri o rQua rtc r = 0
Set Priori, in earityE ventRecord. IVI a \ O p H o u rs P ri o rQ ua rtc r = 0

for each quarter beginning with the quarter of the

PriorLinearityEventRecord.ConditiomlBeginDate and continuing through the quarter
BEFORE the CurrentDateHour:

if (Earliest Location ReportDate <= 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 Priori. inearityE ventRecord. IVI i nOp H o u rs P rio rQua rtc r = -1
Set Linearity MissingOpDatalnfo = "[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.ConditiomlBeginDate

If (()peratingSuppI)ataRecordsbyI. ocation.Op V a 1 lie

MINUS the number of calendar hours in the quarter


-------
being checked that are PRIOR to the
PriorLinearityEventRecord.ComtitiomSiQgvaD&tQftiovL
r > 0)

Set

Priori. inearityE ventRecord. IVI i nOp H o u rs P ri o r

Quarter =

OperatingSuppDataRecordsbyLocation. OpVal
ue MINUS the number of calendar hours in the
quarter being checked that are PRIOR to the
Priori. inearityE ventRecorcl. Co ndi t i o na 1B eg i n
Date/Hour

If (()peratingSuppI)ataRecordsbyI.ocation.Op Va 1 lie is

less than the number of calendar hours in the quarter
begin checked that are ON OR AFTER the
PriorLinearityEventRecord.ConditiomlBeginDate/Hou
r)

Set

Priori, in eurityE ventRecord. IVI a \ O p H o u rs P ri o r

Quarter =

OperatingSuppDataRecordsbyLocation:OpVal
ue.

else

Set

Priori, in eurityE ventRecord. IVI a \ O p H o u rs P ri o r

Quarter = the number of calendar hours in the
quarter being checked that are ON OR AFTER
the

Priori. inearityE ventRecord. Co ndi t i o na 1B eg i n

Date/Hour.

Set

Priorl.inearityEventRecord.MinOpHoursPviorQwMcr

Priorl.inearityEventRecord.MinOpHoursPriorQimrlcr
+ ()peratingSuppI)ataRecordsbyI. ocation. Op Va 1 lie.

Set Priori, in eurityE ventRecord. IVI a \ O p H o u rs

PriorQuarter =

Priori.inearityE ventRecord. IVI a.\0 p H o u rs P ri o rQua rtc r
+ ()peratingSuppI)ataRecordsbyI. ocation. Op Va 1 lie.

if (Prior Linearity EventRecord.MinOpHoursPviorQwMcr == -1)
set CurrentLinearityStatus to "Missing Op Data"

else if (Rpt Period Op Days Accumulator Array for the location == -1)

if (PriorEventRecord. IVI i nOpHoursPrio rQua rtc r > 168)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearityStatus = "Invalid Op Data".

else

if (PriorEventRecord. IVIinOpHoursPriorQuartcr + Rpt Period Op Hours Accumulator


-------
Array for the Location > 168)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else if (PriorEventRecord.MaxOpHowsPriorQuarter + Rpt Period Op Hours
Accumulator Array for the Location > 168)

Set CurrentLinearityStatus = "Undetermined-Conditional Data".

else

Set CurrentLinearityStatus = "IC-Conditional".

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	Hg Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	S02 Linearity Status Evaluation


-------
Check Code:	LINSTAT-6

Check Name:	Determine Final Linearity Status

Related Former Checks:

Applicability:	CEM Check

Description:	Evaluates the determined Linearity Status and changes it if needed based on an ignored test or the status of the

alternate range.

Specifications:

Set AlternateLinearityRecord = null
Set AlternatelnvalidLinearityRecord = null

if {CurrentLinearityStatus begins with "OOC")

if (InvalidLinearityRecord is not null)

Set CurrentLinearity Status = CurrentLinearityStatus &

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 AlternateComponentID = LowRangeComponentLD.

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentID = HighRangeComponentlD.

for each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the

AlternateComponentID

Append MonitorSystemComponentRecordsByHourLocation.SystQmK> to AlternateSystemlDs.

if (MonitorSystemComponentRecordsByHourLocation is not found)

Set CurrentLinearityStatus = "Invalid Monitor System Component".

Return result CurrentLinearityStatus.

if (CurrentMHVParameter in set {S02C, NOXC})

Locate the record in MonitorSpanRecordsByHourAndLocation for the hour where the ComponentTypeCode is equal to
the QaStatusComponentTypeCode and the SpanScaleCode is equal to the AlternateAnalyzerRange.

if (MonitorSpanRecordsByHourAndLocation is not found OR more than one MonitorSpanRecordsByHourAndLocation
is found or MonitorSpanRecordsByHourAndLocation.SpanValue is null or is less than or equal to 0)


-------
Set CurrentLinearifyStatus = "Invalid Monitor Span",
if (AlternateAnalyzerRange = "H")

Set CurrentLinearityStatus = Current Linearity Status & " (High Scale)".

else

Set CurrentLinearity Status = CurrentLinearityStatus & " (Low Scale)".

Return result CurrentLinearityStatus.

else if (MonitorSpanRecordsByHourAndLocation.SpanVahie < =30)

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.

else

exit check.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AltemateComponentID 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 CurrentDateHour OR

b)	equal to the CurrentDateHour and the EndMinute is less than "45" and the CalculatedTestResult is equal to "PASSED" or
"PASSAPS".

if (Linearity TestRecordsByLocationForQAStatus is found)

Set AlternateLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.

Locate all records in QACertificationEventRecords where:

the ComponentID is equal to the AltemateComponentID

AND Linearity Required is equal to "Y",

AND the QACertEventDate/Hour is either:

a)	prior to the CurrentDateHour OR

b)	equal to both the CurrentDateHour and the ConditionalDataBeginDate/Hour;

AND either

a)	AlternateLinearityRecord is null OR

b)	QACertEventDate/Hour is after the A Item ateL in earity Record. EndDate/Hour OR

c)	QACertEventDate/Hour is equal to the A Item ate I. in earity Record. EndDate/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the A Item at el. in earity Record. EndDate/Hour)

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentlD <> LowRangeComponentLD OR

c)	QACertEventCode <> 27 or 30 or 172 and AlternateAnalyzerRange = "H" OR

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

if (QACertificationEventRecords is found)

if (QACertificationEventRecords.CondL^iomiBQgvaDatQlYiom is null or CurrentDateHour is prior to the
QACertificationEventRecords.CondiitiomSSQgvaD&tQrRow)

If (CurrentLinearityStatus does not begin with "IC")


-------
Return result CurrentLinearityStatus.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AlternateComponentID
where the SpanScaleCode is equal to the. 11 tern ale. InalyzerRange, the CalculatedTestResult is equal to
"INVALID", and the EndDate/Hour is after the OA CertificationEventRecords.Q ACcrtEvent Datc/Hour and prior
to the CurrentDateHour.

if {Linearity TestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
Linearity TestRecordsByLocationForQAStatus.

else

Set AlternatelnvalidLinearityRecord = null.

Locate the first record in Linearity TestRecordsByLocationForQAStatus where the ComponentID is equal to the
AlternateComponentID, the SpanScaleCode is equal to the. I hern ate. InalyzerRangeihc CalculatedTestResult is not
equal to "INVALID", and the EndDate/Hour is on or after the
QACertificationEventRecords.ConditiomlDataBeginDate/Hour.

if (Linearity TestRecordsByLocationForQAStatus 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 Linearity TestRecordsByLocationForQAStatus for the
AlternateComponentID where the SpanScaleCode is equal to the
AlternateAnalyzerRange, the CalculatedTestResult is equal to "INVALID", and the
EndDate/Hour is after the OA CertificationEventRecords.Q ACc rt Evc nt Datc/Hour and
prior to the EndDate/Hour of the LinearityTestRecordsByLocationForQAStatus record
retrieved above.

if (Linearity TestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
Linearity TestRecordsByLocationForQAStatus.

if (AlternateLinearityRecord .TestResultCode is null)

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Has Critical
Errors".

if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AlternateLinearityRecord .TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Failed",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AlternateLinearityRecord .TestResultCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Aborted",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.


-------
else

else

if {AlternateLinearityRecord is found)

if (A Item ateL in earity Record. Q A N c cds E v a 1 ua t i o n F1 ag = "Y")

Set CurrentLinearityStatus = "Alternate Range Test Not Yet Evaluated".

else if (AlternateLinearityRecord. TestResultCode is null or is in set {ABORTED, FAILED})

Locate the most recent record in Linearity TestRecordsByLocationForQAStatus for the

AlternateComponentID where the SpanScaleCode is equal to the AlternateAnalyzerRange and the

EndDate/Hour is prior to the CurrentDateHour and the EndDate/Hour is greater than the

A Item ateL in earity Record. E nd D a tc/ H o u r and the CalculatedTestResult is equal to "INVALID".

if (LinearityTestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
LinearityTestRecordsByLocationForQAStatus.

if (AlternateLinearityRecord .TestResultCode = null)

Set CurrentLinearity Status = "00 C-Alternate Range Test Has Critical Errors",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearity Status = CurrentLinearity Status &

else if (.AlternateLinearityRecord .TestResultCode = "FAILED")

Set CurrentLinearity Status = "OOC-Alternate Range Test Failed",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearity Status = CurrentLinearity Status &

else if (AlternateLinearityRecord .TestResultCode = "ABORTED")

Set CurrentLinearity Status = "OOC-Alternate Range Test Aborted",
if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearity Status = CurrentLinearity Status &

else

Set CurrentLinearity Status = "OOC-No Prior Alternate Range Test or Event".

If (CurrentLinearity-Status does not begin with "IC")
Return result CurrentLinearity Status.

If (CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus.


-------
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*
OOC-Alternate
Range

Recertification
Test Has Critical
Errors

OOC-Alternate
Range

Recertification
Test Has Critical
Errors*

Response	Severity

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

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 Critical Error Level 1
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 Critical Error Level 1

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 Critical Error Level 1
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.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

The [testtype] status for [key] could not be determined, because the OperatingTime in at Critical Error Level 1
least one Hourly Operating Data records was missing or invalid.

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 [testtype] status for [key] could not be determined, because a Unit Program record Critical Error Level 1
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 Critical Error Level 1
[key] with TestNumber [alttestnum] was aborted.

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 for Critical Error Level 1
[key] with TestNumber [alttestnum] failed.

The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] failed. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.

The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] has critical errors.

The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] has critical errors. An invalid [testtype] with
TestNumber [altinvtestnum] was ignored.


-------
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-Conditional
Period Expired
OOC-Conditional
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*
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

The prior [testtype] for the alternate range of the component for [key] with TestNumber Critical Error Level
[alttestnum] was aborted.

The prior [testtype] for the alternate range of the component for [key] with TestNumber Critical Error Level

[alttestnum] was aborted. An invalid [testtype] with TestNumber [altinvtestnum] was

ignored.

The prior [testtype] for the alternate range of the component for [key] with TestNumber Critical Error Level
[alttestnum] failed.

The prior [testtype] for the alternate range of the component for [key] with TestNumber Critical Error Level
[alttestnum] failed. An invalid [testtype] with TestNumber [altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with 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

Critical Error Level

Critical Error Level
Critical Error Level
Critical Error Level

Critical Error Level

Critical Error Level
Critical Error Level

Critical Error Level

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

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.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] was
aborted. An invalid [testtype] with TestNumber [invtestnum] was ignored.

Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] failed. Critical Error Level

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] failed. Critical Error Level
An invalid [testtype] with TestNumber [invtestnum] was ignored.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] has Critical Error Level
critical errors.

The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] has Critical Error Level
critical errors. An invalid [testtype] with TestNumber [invtestnum] was ignored.

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

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

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

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

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


-------
OOC-Test Has
Critical Errors*
Prior Test Not
Yet Evaluated
Recertification
Test Not Yet
Evaluated
Undetermined-Co
nditional Data

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

Informational Message

Usage:

1

Process/Category:

Emissions Data Evaluation Report	

	C02 Linearity Status Evaluation

2

Process/Category:

Emissions Data Evaluation Report	

	Hg Linearity Status Evaluation

3

Process/Category:

Emissions Data Evaluation Report	

	NOX Linearity Status Evaluation

4

Process/Category:

Emissions Data Evaluation Report	

	02 Dry Linearity Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	02 Wet Linearity Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	S02 Linearity Status Evaluation


-------
Check Category:

LME


-------
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:

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


-------
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


-------
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:

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


-------
Check Code:	LME-15

Check Name:	Check LTFF GCV

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


-------
Check Code:

LME-16

Check Name:

Check LTFF GCV UOM

Related Former Checks:

Applicability:

LME Check

Description:

Validation Tables:

Fuel Type Reality Checks for GCV (Cross Check Table)

Fuel Type Warning Levels for GCV (Cross Check Table)

Fuel Type Reality Checks for GCV (Cross Check Table)

Fuel Type Warning Levels for GCV (Cross Check Table)

Fuel Type Reality Checks for GCV (Cross Check Table)

Fuel Type Warning Levels for GCV (Cross Check Table)

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 = GrossCalorific Value * LongTermFuelFlowValue / 1,000,000,
rounded to the nearest integer.

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 (FuelCode," -",
LongTermFuelFlowUOMCode)

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 (FuelCode," -",
LongTermFuelFlowUOMCode)

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 (FuelCode," -",
LongTermFuelFlowUOMCode)

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 (FuelCode," -",
LongTermFuelFlowUOMCode)

if {Max Allowed GCV is not null AND GrossCalorific Value > Max Allowed GCV) OR {Min Allowed GCV is not
null AND GrossCalorificValue < Min Allowed GCV)
return result B

else

if {Min Expected GCV is not null AND GrossCalorificValue < Min Expected GCV) OR {Max Expected
GCV is not null AND GrossCalorificValue > Max Expected GCV)

return result C


-------
Results:

Result	Response	Severity

A	The [fieldname] reported in the LTFF record for [key] is missing or invalid.	Critical Error Level 1

B	The GrossCalorificValue reported in the long-term fuel flow record for [key] is outside Critical Error Level 1

the range of allowable values for the fuel type [fueled].

C	The GrossCalorific Value reported in the long-term fuel flow record for [key] is outside Non-Critical Error

the range of expected values for the fuel type [fueled].

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


-------
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	Severity

You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value is Critical Error Level 1

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 Critical Error Level 1
appropriate during the second quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only Critical Error Level 1
appropriate for LME units with an ozone-season qualification.

Usage:

1	Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow


-------
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 . F lie 1F1 o w Pc ri o dC o dc is equal to "A",

add LME Gen L TFF 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 LTFFTtecwrf.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 For this location = LME Total April Input Array For the location
Expected Summary Value HI Array For this location = true

IF Current LTFF Record JotalHcat Input 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.Tota 1Hca11 nput

IF LME Gen LTFF Heat Input is not null AND Current L TFF Record. Total Heat I nput is not equal to LME Gen LTFF
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. To t a 1H ca 11 n p lit - LME Gen LTFF Heat Input) > Heat Input Tolerance)
return result A.

else

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


-------
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 L TFF 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 January 1 of the
year of 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

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 /Jafa. HourLoad is not null and is less than 0,
return result E.

else if Hourly Op /Jafa. OpTime for any hour is null, less than 0, or greater than 1,
return result F.

else if Hourly Op /Jafa OpTime is greater than 0 and Hourly Op /Jafa HourLoad is null,
return result E.

else if Hourly Op /Jafa OpTime is greater than 0 AND Hourly Op DataMHRl 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

If LME Gen OS is equal to true and the Quarter of the reporting period is equal to 2,

Locate an LTFF record for any location in the monitoring configuration during the reporting period where
the FuelFlowPeriodCode is equal to "A".

If found and the LME Gen April Load is equal to 0 and LME Gen April Optime is equal to 0,
return result J.

Else if not found AND (LME Gen April Load is greater than 0 or LME Gen April Optime is greater than

1),

return result K.

Otherwise,

Locate an LTFF record for any location in the monitoring configuration during the reporting
period where the FuelFlowPeriodCode is equal to "MJ".

If found,

If {LME Gen Total Load - LME Gen April Load) is equal to 0 and (.LME Gen Total
Optime - LME Gen April Optime) is equal to 0,
return result L.

If not found,


-------
If (LME Gen Total Load - LME Gen April Load) is greater than 0 or (LME Gen Total
Optirne - LME Gen April Optime) is greater than 1,
return result M.

Otherwise,

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,

If LME Gen Total Load is greater than 0 or LME Gen Total Optime is greater than 1,
return result I.

Otherwise,

return result H.

Do not process remaining categories if fatal error is returned.


-------
Results:

Result
A

B

C

D

E
F
G

H

I

J

K
L

M

Usage:
1

Response

You have not reported an active HIT method in your monitoring plan for at least one
monitoring location in the configuration.

You have not reported an active LMEA or LMES qualification record for this
configuration in your monitoring plan.

You have not reported an active LMEA qualification record for this configuration 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.

You have reported MHHI as the heat input method for this configuration, but you have
reported a long-term fuel flow record.

You have reported LTFF as the heat input method for this configuration, but the

LoadValue in at least one hourly record is missing or invalid.

You have reported LTFF as the heat input method for this configuration, but the

OperatingTime in at least one hourly record is missing or invalid.

You have reported a long-term fuel flow record for this reporting period, but the sum of

the load and operating time values in the hourly records (where MHHIIndicator is not

equal to 1) are equal to 0.

You have not reported the same heat input method in your monitoring plan for all
locations in the configuration during the reporting period.

You have reported LTFF as the heat input method for this configuration, but you have
not reported a long-term fuel flow record for this reporting period.

You have reported a long-term fuel flow record for April, but the sum of the load and
operating time values in the hourly records (where MHHIIndicator is not equal to 1) are
equal to 0.

You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for April.
You have reported a long-term fuel flow record for May and June, but the sum of the
load and operating time values in the hourly records (where MHHIIndicator is not equal
to 1) are equal to 0.

You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for May/June.

Process/Category: LME Emissions Data Generation LME Initialization

Severity
Fatal

Fatal

Fatal

Fatal
Fatal
Fatal
Fatal

Fatal

Critical Error Level 1
Fatal

Critical Error Level 1
Fatal

Critical Error Level 1


-------
Check Code:

LME-12

Check Name:	Check LTFF Fuel Flow Period Code

Related Former Checks:

Applicability:	LME Check

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.

Results:

Result
A

B

C

Usage:
1

Response	Severity

You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value is Critical Error Level 1

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 Critical Error Level 1
appropriate during the second quarter.

You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only Critical Error Level 1
appropriate for LME units with an ozone-season qualification.

Process/Category: LME Emissions Data Generation LTFF Heat Input Data


-------
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 L TFF Heat Input to LME Gen L TFF 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:

1	Process/Category: LME Emissions Data Generation LTFF Heat Input Data


-------
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 the hour where the ParameterCode is equal to "S02M", "NOXM", or "C02M",
and the MethodCode is equal to "LME".

else

Locate all Monitor Method records for the unit and the hour where the ParameterCode is equal to "NOXM and the 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.

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


-------
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:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data


-------
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 Severity

A	The [fieldname] reported in the LME Hourly record is invalid.	Critical Error Level 1

B	You did not report a LoadValue in the LME Hourly record.	Critical Error Level 1

C	You did not report a LoadValue in the LME Hourly record.	Non-Critical Error

D	You reported a LoadValue in the LME Hourly record. This field should be blank for a Critical Error Level 1
non-operating hour.

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data


-------
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:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data

1

Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation


-------
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 unit Critical Error Level 1
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


-------
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 Record.Opcrat i ngTime is greater than 0,

If LME Gen HI Method is equal to "MHHI" or Current LME Hourly Op Record. IVTH H11 ndicato r is equal to 1,

Locate all Monitor Default records for the hour and location where the ParameterCode is equal to "MHHI".

If one record is found, the DefaultValue is greater than 0, and the DefaultUnitsOfMeasureCode is equal to
"MMBTUHR".

Calculate LME Calc Heat Input = DefaultValue * Current LME Hourly Op Record.0\iT\mc. rounded to
one decimal place.

Otherwise,

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 Gen Total Heat Input Array for location to -1, and return result A.

else if LME Gen HI Method is equal to "LTFF",

If LME Gen CP Total Heat Input is greater than or equal to 0, LME Gen Total Heat Input Array for the location
is greater than or equal to 0, AND Current LME Hourly Op Record. HonrLoad is greater than or equal to 0,

If LME Gen OS is equal to true, and the Quarter of the reporting period is equal to 2,

If the current date is in the month of April,

if LME Gen April Load is greater than 0,

If Current LME Hourly Op Record.HourLoad is equal to 0
Set LME Calc Heat Input = 0

else

Calculate LME Calc Heat Input = (LME Gen CP April Heat Input *
Current LME Hourly Op Record.HourLoad * Current LME Hourly Op
Record. OpTime / LME Gen April Load) + (LME Gen LTFF April
Heat Input Array for the location * Current LME Hourly Op
Record.HourLoad * Current LME Hourly Op Record.OpTime / LME
Gen April Load Array for the location), and round the result to 1 decimal
place.

else if LME Gen April Optime is greater than 0,

Calculate LME Calc Heat Input = (LME Gen CP April Heat Input * Current


-------
LME Hourly Op Record. OpTime / LME Gen April Optime) + (LME Gen
LTFF April Heat Input Array for the location * Current LME Hourly Op
Record. OpTime / LME Gen LTFF April Op Time Array for the location), and
round the result to 1 decimal place.

Otherwise,

if LME Gen Total Load is greater than 0,

If Current LME Hourly Op Record. HourLoad is equal to 0,

Set LME Calc Heat Input = 0

else

Calculate LME Calc Heat Input = {{LME Gen CP Total Heat Input -
LME Gen CP April Heat Input) * Current LME Hourly Op
Record.HouxLo'dA * Current LME Hourly Op Record.OpTime / {LME
Gen Total Load - LME Gen April Load)) + {{LME Gen L TFF Heat
Input Array for the location - LME Gen LTFF April Heat Input Array
for the location) * Current LME Hourly Op Record .HomLonA *
Current LME Hourly Op Record .0\iT\mc / {LME Gen Total Load
Array for the location - LME Gen April 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 - LME
Gen CP April Heat Input) * Current LME Hourly Op Record .0\iT\mc / {LME
Gen Total Optime - LME Gen April Optime)) + {{LME Gen LTFF Heat Input
Array for the location - LME Gen L TFF April Heat Input Array for the
location) * Current LME Hourly Op Record.0\iT\mc / {LME Gen Total Optime
Array for the location - LME Gen LTFF April Op Time Array for the location)),
and round the result to 1 decimal place.

Otherwise,

if LME Gen Total Load is greater than 0,

If Current LME Hourly Op Record .HomLonA is equal to 0,

Set LME Calc Heat Input = 0

else

Calculate LME Calc Heat Input = {LME Gen CP Total Heat Input * Current
LME Hourly Op Record.HourLoad * Current LME Hourly Op Record. OpTime
/ LME Gen Total Load) + {LME Gen LTFF Heat Input Array for the location *
Current LME Hourly Op Record.HourLoad * Current LME Hourly Op
Record. OpTime / 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 RecordHom\D = Current LME Hourly Op RecordRom\D

LME Gen Heat Input Record.ParameterCode = "HIT"

LME Gen Heat Input Record. AdjustedHourly Value = LME Calc Heat Input

If Current LME Hourly Op Record. IVTH H11 ndicator is equal to 1,

LME Gen Heat Input Record.MODCCode = "45"

If LME Gen Total Heat Input Array for location is greater than or equal to 0,

Add LME Calc Heat Input to LME Gen Total Heat Input Array for location.

If current date in the month of April,

Add LME Calc Heat Input to LME Gen April Heat Input Array for location.

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),

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 Gen Total Heat Input Array for location to -1.


-------
Results:

Result	Response	Severity

A	You did not report a single, active, valid default record for MHHI in your monitoring Critical Error Level 1

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


-------
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 S02M Record = null

If LME Gen Parameters contains "S02M" and Current LME Hourly Op Record is not null,

If Current LME Hourly Op Record. Flie 1CodcList is not null,

SO 2 Rate = 0
SO2 Fuel = null

For each FuelCode in the Current LME Hourly Op /?6'cwy/. Fuel Code List

Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "S02R",
DefaultPurposeCd = "LM", and FuelCode is equal to the current FuelCode.

If one and only one record is found, the DefaultValue is greater than 0, and DefaultUnitsOfMeasureCode is equal tc
"LBMMBTU",

If SO2 Rate is less than the DefaultValue in the retrieved record,
set SO2 Rate to the DefaultValue.
set SO2 Fuel to the current FuelCode.

Otherwise,

set LME Gen Total S02M Array for location to -1, LME Gen Fuel Code to the current FuelCode,
and return result A.

If LME Calc Heat Input is not null and is greater than or equal to 0 AND SO2 Rate is greater than 0,

Calculate S02 Mass = LME Calc Heat Input * S02 Rate, and round the result to 1 decimal place.

If SO2 Mass is greater than 99,999.9

set LME Gen Total S02MArray for location to -1, and return result B.

Otherwise,

LME Gen S02MRecord.HourlD = Current LME Hourly Op RecordRom\D

LME Gen S02M Record. ParameterCode = "S02M"

LME Gen S02MRecord. AdjustedHourlyValue = S02 Mass

LME Gen S02MRecord.FuelCode = S02 Fuel

If LME Gen Total S02MArray for location is greater than or equal to 0,
Add SO2 Mass to LME Gen Total S02M Array for location.


-------
Results:

Result	Response	Severity

A	You did not report a single, active, valid [defparm] default record for FuelCode [fuel] in Critical Error Level 1

your 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


-------
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.0\iT\mc is greater than 0,

If Current LME Hourly Op Record. Flie 1CodcList is not null,

NOX Rate = 0
NOX Fuel = null

For each FuelCode in the Current LME Hourly Op /?6'cwy/. Fuel Code List

If Current LME Hourly Op Record.Opc rat i ngCo ndit io nCodc is null,

Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NOXR",
DefaultPurposeCd = "LM", OperatingConditionCode = "A", and FuelCode is equal to the current
FuelCode.

else if Current LME Hourly Op Record.OperatingConditionCode == "U",

Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NORX",
DefaultPurposeCd = "MD", the OperatingConditionCode is equal to "U", and FuelCode is equal to the
current FuelCode.

Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NOXR",
DefaultPurposeCd = "LM", the OperatingConditionCode is equal to Current LME Hourly Op
Record. OperatingConditionCode, and FuelCode is equal to the current FuelCode.

If one and only one record is found, the DefaultValue is greater than 0, and DefaultUnitsOfMeasureCode is equal tc
"LBMMBTU",

If NOX Rate is less than the DefaultValue in the retrieved record,
set NOX Rate to the DefaultValue.
set NOX Fuel to the current FuelCode.

Otherwise,

LME Gen Total NOXM Array for location to -1.

Set LME Gen Fuel Code to the current FuelCode.

If Current LME Hourly Op Record.Opc ra t i ngCo ndi t io nCode is null,

If LME Calc Heat Input is not null and is greater than or equal to 0 AND NOX Rate 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.

else

return result A.

else

return result B.


-------
Otherwise,

LME Gen NOXM Record.HourlT> = Current LME Hourly Op RecordRom\D

LME Gen NOXM Record. ParamctcrCodc = "NOXM"

LME Gen NOXM Record. Adj ustcdHourly Val lie = 1VOXMass

LME Gen NOXM Record .¥uc\CoAc = 1VOX Fuel

LME Gen NOXM Record.Opc rat i ngCo ndit io nCodc = Current LME Hourly Op Record.Opc rati ngCo ndi tio nCode

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.

Results:

Result
A

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

B

Critical Error Level 1

C

Critical Error Level 1

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data


-------
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 C02M Record = null

If LME Gen Parameters contains "C02M" and Current LME Hourly Op Record is not null,

If Current LME Hourly Op Record. Flie 1CodcList is not null,

C02 Rate = 0
C02 Fuel = null

For each FuelCode in the Current LME Hourly Op /?6'cwy/. Fuel Code List

Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "C02R",
DefaultPurposeCd = "LM", and FuelCode is equal to the current FuelCode.

If one and only one record is found, the DefaultValue is greater than 0, and DefaultUnitsOfMeasureCode is equal tc
"TNMMBTU",

If C02 Rate is less than the DefaultValue in the retrieved record,
set C02 Rate to the DefaultValue.
set C02 Fuel to the current FuelCode.

Otherwise,

set LME Gen Total C02M Array for location to -1, LME Gen Fuel Code to the current FuelCode,
and return result A.

If LME Calc Heat Input is not null and is greater than or equal to 0 AND C02 Rate is greater than 0,

Calculate CO2 Mass = LME Calc Heat Input * CO2 Rate, and round the result to 1 decimal place.

If C02 Mass is greater than 99,999,999.9

set LME Gen Total C02MArray for location to -1, and return result B.

Otherwise,

LME Gen C()2M Record. Hourl D = Current LME Hourly Op Record.HourlD

LME Gen C()2MRecord.?-Mm\c{cxCoAc = "C02M"

LME Gen C02MRecord. AdjustedHourlyValue = C02 Mass

LME Gen C02MRecord.FuelCode = C02 Fuel

If LME Gen Total C02MArray for location is greater than or equal to 0,
Add C02 Mass to LME Gen Total C02M Array for location.


-------
Results:

Result	Response	Severity

A	You did not report a single, active, valid [defparm] default record for FuelCode [fuel] in Critical Error Level 1

your 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


-------
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 Record.MonLocId = current location ID

LME Summary Heat Input /?6'cwY/.RcportingPeriodId = 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 /?6'cwY/.CurrcntRcportingPeriodTotal = tempHIT - tempAprilHIT, rounded to 0 decimal places.

else

LME Summary Heat Input /?6'cwY/.CurrcntRcportingPeriodTotal = tempHIT, rounded to 0 decimal places.

ff LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Heat Input /?6'ewY/.OzoncScasonToDatcTotal = tempHIT - tempAprilHIT, rounded to 0 decimal
places.

else if Quarter of Reporting Period is equal to 3,

LME Summary Heat Input /?6'ewY/.OzoncScasonToDatcTotal = 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 /?6'ewY/.OzoncScasonToDatcTotal to null, and return result A.

Otherwise,

LME Summary Heat Input /?6'cwY/.OzoneScasonToDateTotal = 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 Year of
the Reporting Period and OpTypeCode = "HITOS".

If not found,

set LME Summary Heat Input /?6'ewY/.OzoncScasonToDatcTotal to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary Heat Input /?6'cw
-------
If LME Gen Annual == true,

LME Summary Heat Input Record. YearToDateTotal = LME Summary Heat Input Record. 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 ihsLME
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 =

"HIT".

If not found,

set LME Summary Heat Input Record. YearToDateTotal to null, and return result B.

Otherwise,

add OpValue in the retrieved record to LME Summary Heat Input Record. YearToDateTotal.

Results:

Result
A

B

Response	Severity

The program could not determine ozone-season-to-date totals for [osparam], because the Critical Error Level 1

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 Critical Error Level 1
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


-------
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. IVIo nLoc Id = current location ID

LME Summary Op Time Record. Rcpo rt i ngPcriodId = current reporting period ID

LME Summary Op Time Tfecon/.ParameterCode = "OPTIME"

If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,

LME Summary Op Time Ttecon/.CurrentReportingPeriodTotal = LME Gen Total Op Time Array for the location - LME
Gen April Op Time Array for the location.

LME Summary Op Time Record. C u rrc lit Rcpo rt i ng Pc riodTo ta 1 = LME Gen Total Op Time Array for the location.

ff LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Op Time Record.O/o lie Scaso nTo DatcTotal = LME Gen Total Op Time Array for the location -
LME Gen April Op Time Array for the location.

else if Quarter of Reporting Period is equal to 3,

LME Summary Op Time Record.O/o nc Scaso nT o DatcTotal = LME Gen Total Op Time Array for the location.

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 = "OPTIME".

If not found,

set LME Summary Op Time /?6'cwY/.OzoncScasonToDatcTotal to null, and return result A.

Otherwise,

LME Summary Op Time Record. O zo lie Sea so nTo D atcTo ta 1 = 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 current
year and OpTypeCode = "OSTIME".

If not found,

set LME Summary Op Time /?6'cw
-------
LME Summary Op Time Record. YearToDateTotal = LME Summary Op Jiwie ./tecon/.CurrentReportingPeriodTotal.

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 ihsLME
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 =
"OPTIME".

If not found,

set LME Summary Op Time Record. YearToDateTotal 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 prior to the
LME Year Start Quarter,
return result B.

Otherwise,

add OpValue in the retrieved record to LME Summary Op Time Record YearToDateTotal.

Results:

Result
A

B

Response	Severity

The program could not determine ozone-season-to-date totals for [osparam], because the Critical Error Level 1

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 Critical Error Level 1
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


-------
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. IVIo nLoc Id = current location ID

LME Summary Op Hours	Rcpo rt i ngPc riodId = current reporting period ID

LME Summary Op Hours Tfecon/.ParameterCode = "OPHOURS"

If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,

LME Summary Op Hours Record. CurrentReportingPeriodTotal = LME Gen Total Op Hours Array for the location -
LME Gen April Op Hours Array for the location.

else

LME Summary Op Hours Record. CurrentReportingPeriodT otal = LME Gen Total Op Hours Array for the location.

ff LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Op Hours /?6'cwY/.OzoneScasonToDateTotal = LME Gen Total Op Hours Array for the location -
LME Gen April Op Hours Array for the location.

else if Quarter of Reporting Period is equal to 3,

LME Summary Op Hours /?6'cwY/.OzoneScasonToDateTotal = LME Gen Total Op Hours Array for the location.

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 = "OPHOURS".

If not found,

set LME Summary Op Hours	Ozo nc Scaso nTo Da tcTo ta 1 to null, and return result A.

Otherwise,

LME Summary Op Hours	Ozo nc Scaso nTo DatcTota 1 = 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 current
year and OpTypeCode = "OSHOURS".

If not found,

set LME Summary Op Hours wy/. Ozo ne Seaso nTo Da teTo ta 1 to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary Op Hours /?6'cwY/.OzoncScasonToDatcTotal.
If LME Gen Annual == true,

LME Summary Op Hours Record YearToDateTotal = LME Summary Op Hours Ttecon/.CurrentReportingPeriodTotal.

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	YcarToDatcTotal to null, and return result B.

Otherwise,

add Op Value in the retrieved record to LME Summary Op Hours	YcarToDatcT otal.

Results:

Result
A

B

Response	Severity

The program could not determine ozone-season-to-date totals for [osparam], because the Critical Error Level 1

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 Critical Error Level 1
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


-------
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.

If found,

LME Summary S()2M Record MonLoc\ A = current location ID

LME Summary S()2 M Record Rc\~>or{\ng?CY\oA\A = current reporting period ID

LME Summary S02MTfecon/.ParameterCode = "S02M"

LME Summary S()2M Record. Currcnt Rcpo rt i ngPc riodTo ta 1 = LME Gen Total S02M Array for the location / 2000,
rounded to one decimal place.

LME Summary S02MRecordXewToDdXeTo\a[ = LME Summary S'O^M./tecon/.CurrentReportingPeriodTotal.

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 =
"S02M".

If not found,

set LME Summary S()2M Record. Yca rTo Da tcTo ta 1 to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary S()2 M Record. Y ca rTo D a t c To t a 1.

Results:

Result	Response	Severity

A	The program could not determine year-to-date for [param], because the Op Supp Data Critical Error Level 1

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


-------
Check Code:	LME-36

Check Name:	Calculate C02M Summary Values

Related Former Checks:

Applicability:	LME Check

Description:

Specifications:

LME Summary C02M Record = 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 C02MRecord.MonLocId = current location ID

LME Summary C02MTtecon/.ReportingPeriodld = current reporting period ID

LME Summary C02M7?ecor
-------
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:

1)	ParameterCode is equal to "NOXM".

2)	MethodCode is equal to "LME".

3)	BeginDate is on or before:

a)	May 1st of the year of the reporting period when the reporting period is for the 2nd quarter AND LME Gen OS is equal to
true.

b)	The first day of the reporting period otherwise.

4)	EndDate is null or is on or after the last day of the reporting period.

LME Summary NOXM Record. Mo nLoc Id = current location ID

LME Summary NOXM Record. Rcpo rt i ngPc riodld = current reporting period ID

LME Summary NOXM Ttecon/.ParameterCode = "NOXM"

If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,

LME Summary NOXM Record. C u rrc n t R c po rt i ng P c ri o dTo ta 1 = (.LME Gen Total NOXM Array for the location -
LME Gen April NOXM Array for the location) / 2000, rounded to one decimal place.

else

LME Summary NOXM Record. C u rrc n t R c po rt i ng P c ri o dTo ta 1 = LME Gen Total NOXM Array for the location /
2000, rounded to one decimal place.

ff LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary NOXM wy/. Ozo ne Seaso nTo Da teTo t a 1 = {LME Gen Total NOXM Array for the
location - LME Gen April NOXM Array for the location) / 2000, rounded to one decimal place.

else if Quarter of Reporting Period is equal to 3,

LME Summary NOXM Record.O/.o ne Seaso nT o DateTotal = LME Gen Total NOXM Array for the
location / 2000, rounded to one decimal place.

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 = "NOXM".

If not found,

set LME Summary NOXMTtecwrf.OzoneSeasonToDateTotal to null, and return result A.
Otherwise,

LME Summary NOXM Record.Ozo ncScaso nTo DatcTota 1 = 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
current year and OpTypeCode = "NOXMOS".

If found,

If not found,


-------
set LME Summary NOXM/?6'cwY/.OzoncScasonToDatcTotal to null, and return result A.
Otherwise,

add OpValue in the retrieved record to LME Summary NOXM
Record.O/o ne S ea so 11T0 D ateTo ta 1.

If LME Gen Annual == true,

LME Summary NOXM Record YearToDateTotal = LME Summary NOXM
Record. C u rrc n t R c po rt i ng P c ri o dTo ta 1.

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 YearToDateTotal to null, and return result B.
Otherwise,

add OpValue in the retrieved record to LME Summary NOXM wy/. YearTo DateTota 1.

Results:

Result
A

B

Response	Severity

The program could not determine ozone-season-to-date totals for [osparam], because the Critical Error Level 1

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 Critical Error Level 1
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


-------
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.

If found,

LME Summary NOXR Record. IVIo nLoc Id = current location ID

LME Summary NOXR	. R c po rt i ng Pc ri o d I d = current reporting period ID

LME Summary NOXR 7?«»£w
-------
/?6'cwy/. YcarToDatcTota 1. rounded to 3 decimal places.

else

LME Summary NOXR Ttecon/.YearToDateTotal = LME Summary NOXR Ttecon/.CurrentReportingPeriodTotal.

Results:

Result

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


-------
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


-------
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

Response

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.

Severity

Critical Error Level 1

Usage:

1	Process/Category: LME Emissions Data Generation Hourly Emissions Data


-------
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


-------
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


-------
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


-------
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:

Result	Response	Severity

A	Another [recordtype] record already exists with the same [fieldnames].	Fatal

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation


-------
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


-------
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 a Non-Critical Error
non-operating hour.

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation


-------
Check Code:	LME-43

Check Name:	Check LTFF Fuel Flow Period Code

Related Former Checks:

Applicability:	LME Check

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.

Results:

Result	Response	Severity

A	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only Critical Error Level 1

appropriate during the second quarter.

Usage:

1	Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation


-------
Check Category:

MATS Calculated Hourly Value Checks


-------
Check Code:	MATSCHV-1

Check Name:	Initialize HGRE Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HGRE.

Specifications:

CalculationConversionFactor = 6.24 x 10 A -11
CurrentDh v Parameter = MatsHgDhvParameter
CurrentDhvRecordValid = MatsHgDhvValid
MatsDh v Record = MatsHgDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHgcValue
MatsMh v Record = MatsHgcMh v Record
MatsMoistureEquationList = {A-3}

MatsDh vMeasuredModcIJst to {36, 39}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg RE Calculation Verification


-------
Check Code:	MATSCHV-2

Check Name:	Initialize HCLRE Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HCLRE.

Specifications:

CalculationConversionFactor = 9.43 x 10 A -8
CurrentDh v Parameter = MatsHclDhvParameter
CurrentDhvRecordValid = MatsHclDhvValid
MatsDh v Record = MatsHctDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValue
MatsMh v Record = MatsHctcMh vRecord
MatsMoistureEquationList = {HC-3 }

MatsDhvMeasuredModcListto {36, 39}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification


-------
Check Code:	MATSCHV-3

Check Name:	Initialize HFRE Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HFRE.

Specifications:

CalculationConversionFactor = 5.18 x 10 A -8
CurrentDh v Parameter = MatsHfDh vParameter
CurrentDhvRecordValid = MatsHfDhvValid
MatsDh v Record = MatsHfDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHfcValue
MatsMh v Record = MatsHfcMh v Record
MatsMoistureEquationList = {HF-3 }

MatsDhvMeasuredModcListto {36, 39}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS HF RE Calculation Verification


-------
Check Code:

MATSCHV-4

Check Name:	Initialize S02RE Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for S02RE.

Specifications:

CalculationConversionFactor = 1.66 x 10 A -7
CurrentDh v Parameter = MatsSo21)h v Parameter
CurrentDhvRecordValid = MatsSo2DhvValid
MatsDh v Record = MatsSo2 Dh v Record
MatsMoistureEquationList = { S-3 }

MatsDhvMeasuredModcListto {36, 39}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS S02 RE Calculation Verification


-------
Check Code:	MATSCHV-5

Check Name:	Initialize HGRH Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HGRH.

Specifications:

CalculationConversionFactor = 6.24 x 10 A -11
CurrentDh v Parameter = MatsHgDhvParameter
CurrentDhvRecordValid = MatsHgDhvValid
MatsDh v Record = MatsHgDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHgcValue
MatsMh v Record = MatsHgcMh v Record

MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}

MatsDhvMeasuredModcList to {36, 37}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS Hg RH Calculation Verification


-------
Check Code:	MATSCHV-6

Check Name:	Initialize HCLRH Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HCLRH.

Specifications:

CalculationConversionFactor = 9.43 x 10 A -8
CurrentDh v Parameter = MatsHclDhvParameter
CurrentDhvRecordValid = MatsHclDhvValid
MatsDh v Record = MatsHctDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValue
MatsMh v Record = MatsHctcMh vRecord

MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}

MatsDhvMeasuredModcList to {36, 37}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1RH Calculation Verification


-------
Check Code:	MATSCHV-7

Check Name:	Initialize HFRH Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HFRH.

Specifications:

CalculationConversionFactor = 5.18 x 10 A -8
CurrentDh v Parameter = MatsHfDh vParameter
CurrentDhvRecordValid = MatsHfDhvValid
MatsDh v Record = MatsHfDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHfcValue
MatsMh v Record = MatsHfMh v Record

MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}

MatsDhvMeasuredModcList to {36, 37}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS HF RH Calculation Verification


-------
Check Code:

MATSCHV-8

Check Name:	Initialize S02RH Calculated Hourly Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent Calculated hourly checks for S02RH.

Specifications:

CalculationConversionFactor = 1.66 x 10 A -7
CurrentDh v Parameter = MatsSo21)h v Parameter
CurrentDhvRecordValid = MatsSo2DhvValid
MatsDh v Record = MatsSo2 Dh v Record

MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}

MatsDhvMeasuredModcList to {36, 37}

MatsDhvUnavailableModcListto {38}

Results:

Result	Response	Severity

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS S02 RH Calculation Verification


-------
Check Code:	MATSCHV-9

Check Name:	Determine the Calculation Concentration for a MATS Parameter

Related Former Checks:

Applicability:

Description:	Determines the main concentration value to use in calculations.

Specifications:

CalculationConcentration = null
CalculationConcentrationSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)

If {MatsMhvCalculatedValue is not null)

CalculationConcentration = MatsMhvCalculatedValue (convert from Scientific Notation)

If (MatsMhvRecordMatsMhvRecord is not null) AND (MatsMhvRecord.ModcCode is equal to "34" or "35")
CalculationConcentrationSubstituted = true

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1 RE Calculation Verification

2

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1RH Calculation Verification

3

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RE Calculation Verification

4

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RH Calculation Verification

5

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RE Calculation Verification

6

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RH Calculation Verification


-------
Check Code:

MATSCHV-10

Check Name:

Related Former Checks:

Determine the Calculation Concentration for S02

Applicability:
Description:

Determines the S02 concentration value to use in calculations.

Specifications:

CalculationConcentration = null
CalculationConcentrationSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If CurrentSo2MonitorHourlyRecord is not null

CalculationConcentration = CurrentSo2MonitorHourlyRecord.\JrLadjuste6ilourlyYahie

If (CurrentSo2MonitorHourlyRecord.ModcCode in set {05, 06, 07, 08, 09, 10, 12, 13, 15, 18, 23, 55})
CalculationConcentrationSubstituted = true

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS S02 RH Calculation Verification


-------
Check Code:	MATSCHV-11

Check Name:	Determine the Calculation Flow

Related Former Checks:

Applicability:

Description:	Determines the flow value for equations.

Specifications:

CalculationFlow = null
CalculationFlowSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)

If (CurrentStackFlowHourlyRecord is NOT null)

CalculationFlow = CurrentStackFlowHourly Record. U nadj ustedHourly V alue

If (CurrentStackFlowHourlyRecord.ModcCode not in set {01, 02, 03, 04, 20, 53, 54})
CalculationFlowSubstituted = true

Else

CalculationFlow = null
CalculationFlowSubstituted = false

Results:

Result	Response	Severity

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1 RE Calculation Verification

2

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RE Calculation Verification

3

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RE Calculation Verification

4

Process/Category:

Emissions Data Evaluation Report —

— MATS S02 RE Calculation Verification


-------
Check Code:	MATSCHV-12

Check Name:	Determine the Calculation Diluent Value

Related Former Checks:

Applicability:

Description:	Determines the diluent value to use in calculations involving formula 19 equations.

Specifications:

CalculationDiluent = null
CalculationDiluentSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)

If (MatsDhvRecord.EquationCodc in set {19-3D, 19-5D} OR MatsDhvRecord.ModcCode == 37)
If (MatsDhvRecord.EquationCode inset {19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D})

02MonitorDefaultMatches = count of MonitorDefaultRecordsByHourLocation where:

1)	ParameterCode = "02X"

2)	DefaultPurposeCode = "DC"

3)	FuelCode = "NFS"

If (02MonitorDefaultMatches > 1)
return result A

Else if (02MonitorDefaultMatches == 0)
return result B

Else

02MonitorDefaultRecord = the single matched record

If (02MonitorDefaultRecord.DefmltVahie is NULL OR 02MonitorDefaultRecord.DefaultValue <= 0)
return result C

Else

CalculationDiluent = 02MonitorDefaultRecord .DefaultValue
Else if (MatsDhvTtecon/.EquationCode in set {19-6, 19-7, 19-8, 19-9})

Co2MonitorDefaultMatches = count of MonitorDefaultRecordsByHourLocation where:

1)	ParameterCode = "C02N"

2)	DefaultPurposeCode = "DC"

3)	FuelCode = "NFS"

If (Co2MonitorDefaultMatches > 1)
return result D

Else if (Co2MonitorDefaultMatches == 0)
return result E

Else

C02MonitorDefaultRecord = the single matched record

If (Co2MonitorDefaultRecord.DefaultValue is NULL OR Co2MonitorDefaultRecordDQfaxAtVdluQ <= 0)
return result F

Else

CalculationI)iluent=( 'o2\ fonilorf)efau/[Record.Dcfc\u\lVi\\uc

Else


-------
If (Mats I) h v Record. Eq ua t i o nCodc in set { 19-1, 19-4} AND 02DryNeededForMats== true)
CalculationDiluent = 02DryCalculatedAdjustedValue

If (02DryModc not in set {01, 02, 03, 04, 17, 20, 53, 54})

CalculationDiluentSubstituted = true

Else if (MatsDh vRecord. EquationCodc in set {19-2, 19-3, 19-5} AND ()2 Wet Needed For Mats == true)
CalculationDiluent = 02WetCalculatedAdjustedValue

If (02WetModc not in set {01, 02, 03, 04, 17, 20, 53, 54})

CalculationDiluentSubstituted = true

Else if (MatsDhvRecord.EquationCodc in set { 19-6, 19-7, 19-8, 19-9} AND Co2DiluentNeededForMats == true)
CalculationDiluent = Co2cMhvCalculatedAdjustedValue

If (Co2cMhvModc not in set {01, 02, 03, 04, 17, 20, 21, 53, 54})

CalculationDiluentSubstituted = true

Results:

Result

Response

Severity

A

You reported more than one diluent cap default record for 02X in your monitoring plan
that was active during current hour.

Critical Error Level 1

B

You did not report a default record for 02X in your monitoring plan that was active
during current hour.

Critical Error Level 1

C

The DefaultValue reported in the active Default record for 02X in your monitoring plan
is invalid. The value must be greater than 0.

Critical Error Level 1

D

You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.

Critical Error Level 1

E

You did not report an active C02N diluent cap default record in your monitoring plan
for the hour.

Critical Error Level 1

F

The DefaultValue reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.

Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1RH Calculation Verification

2

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RH Calculation Verification

3

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RH Calculation Verification

4

Process/Category:

Emissions Data Evaluation Report —

— MATS S02 RH Calculation Verification


-------
Check Code:

MATSCHV-13

Check Name:

Related Former Checks:

Determine the Calculation Moisture

Applicability:
Description:

Determines the moisture value for equations.

Specifications:

CalculationMoisture = null
CalculationMoistureSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If (MatsDh vRecord. Equatio nCodc in MatsMoistureEquationList)

If (H2oMethodCode is equal to "MWD") AND H2oDerivedHourlyChecksNeeded AND
(H2oDhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oDhvCalculatedAdjustedValue

ff (H2oDhvModc not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
CalculationMoistureSubstituted = true

Else if (H2oMethodCode in set {MMS, MTB}) AND H2oMonitorHourlyChecksNeeded AND
{H2oMhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oMhvCalculatedAdjustedValue

If (H2oMhvMode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})

Else if (H2oMethodCode is equal to "MDF") AND H2oDerivedHourlyChecksNeeded AND
(H2oDhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oDhvCalculatedAdjustedValue

If {H2oDhvMode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
CalculationMoistureSubstituted = true

Else if (H2oMethodCode is equal to "MDF") AND (H2oDerivedHourlyChecksNeeded is false) AND (H2oDefaultValue
is not null)

CalculationMoisture = H2oDefau1tValue

CalculationMoistureSubstituted = true

Results:

Result

Response

Severity


-------
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

MATS HC1 RE Calculation Verification
MATS HC1RH Calculation Verification
MATS HF RE Calculation Verification
MATS HF RH Calculation Verification
MATS Hg RE Calculation Verification
MATS Hg RH Calculation Verification
MATS S02 RE Calculation Verification
MATS S02 RH Calculation Verification


-------
Check Code:

MATSCHV-14

Check Name:

Related Former Checks:

Check MODC and determine the MATS Formula Calculated Unadjusted Value

Applicability:
Description:

Calculates the Unadjusted Value using MATS formula equations.

Specifications:

CalculatedUnadjustedValue = null
If CurrentDhvRecordValid

If (MatsDh vRecord. IVIodcCode in MatsDhvMeasuredModcList)

If (MatsDh v Re cord. Equat io nCodc is NOT null)

If (MatsDh vRecord. Equat io nCodc is in MatsMoistureEquationList)

If CalculationConcentrationSubstituted OR CalculationFlowSubstituted OR
CalculationMoistureSubstituted

return result A

Else if (CalculationConcentration is null) OR (CalculationFlow is null) OR (CalculationMoisture is
null)

return result B

Else

CalculatedUnadjustedValue = CalculationConversionF'actor * CalculationConcentration *
CalculationFlow * (1 - CalculationMoisture))

Else

If CalculationConcentrationSubstituted OR CalculationFlowSubstituted

return result C

Else if (CalculationConcentration is null) OR {CalculationFlow is null)

return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor * CalculationConcentration *
CalculationFlow

Else

return result E

Else // Unavailable MODC

If (MatsDh vRecord. Equat io nCodc is NOT null)

return result E


-------
Results:

Result	Response	Severity

A	You reported an incorrect MODCCode in the MATS Derived Hourly Value record for Critical Error Level 1

[param], as you reported substitute data for one or more essential auxiliary parameters.

B	You reported a Formulaldentifier in the MATS Derived Hourly Value record for	Critical Error Level 1

[param], but you did not report a value for all the essential parameters needed to
perform the calculation.

C	You reported an incorrect MODCCode in the MATS Derived Hourly Value record for Critical Error Level 1

[param], as you reported substitute data for one or more essential auxiliary parameters.

D	You reported a Formulaldentifier in the MATS Derived Hourly Value record for	Critical Error Level 1

[param], but you did not report a value for all the essential parameters needed to
perform the calculation.

E	You reported an incorrect MODCCode in the MATS Derived Hourly Value record for Critical Error Level 1

[param], as you reported measured data for essential auxiliary parameters.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS HF RE Calculation Verification

3	Process/Category: Emissions Data Evaluation Report	MATS Hg RE Calculation Verification

4	Process/Category:

Emissions Data Evaluation Report

MATS S02 RE Calculation Verification


-------
Check Code:

MATSCHV-15

Check Name:

Check MODC and determine the Formula 19 Calculated Unadjusted Value

Related Former Checks:

Applicability:

Description:

Specifications:

Calculates the Unadjusted Value using Formula 19 equations.

CalculatedUnadjustedValue = null

If CurrentDhvRecordValid

IF (Mats I) h v Record. IVI o dc C ode in MatsDhvMeasuredModcList)

IF (Mats I) h v Record. Equat io nCodc is NOT null)

Case (Mats I) h v Record. E q ua t i o n C o dc)

"19-1":

IF CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

ElseiF (CalculationDiluent is null) OR (CalculationConcentration is null) OR

(ValidFdFactorExists is False)
return result C

Else iF (CalculationDiluent is equal to 20.9)
return result D

CalculatedUnadjustedValue = CalculationConversionF'actor *
CalculationConcentration * CurrentHourlyOpRecord.FdF actor * [20.9 / (20.9 -
CalculationDiluent)]

"19-2":

IF CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

MoistureFraction = null

BwaDefaultRecordCount = count MonitorDefaultRecordsByHourLocation where
ParameterCd = 'BWA'

IF (BwaDefaultRecordCount is equal to 0)

MoistureFraction = 0.027
Else IF (BwaDefaultRecordCount is equal to 1) AND

(MonitorDefaultRecordsByHourLocation record's DeFaultValue is greater than 0 AND is
less than 1)

MoistureFraction = MonitorDefaultRecordsByHourLocation record's
DeFaultValue

Else

return result F

IF (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFwFactorExists is False) OR {MoistureFraction is null)
return result C

ElseiF (CalculationDiluent is equal to 20.9 * (1 - MoistureFraction))

Else

Else


-------
return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FwFactor * [20.9 / (20.9
*(1 - MoistureFractiori) - CalculationDiluenf)]

"19-3":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 20.9 * (100 - CalculationMoisture) / 100)
return result D

Else

h2oFactor = (100 - CalculationMoisture) / 100.0
denom = ((20.9 * h2oFactor) - CalculationDiluent)

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdF&ctor * (20.9 /denom)

"19-3D":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 20.9)
return result D

Else

h2oFactor = (100 - CalculationMoisture) / 100.0

denom = (20.9 * h2oFactor) - (CalculationDiluent * h2oFactor)

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor *(20.9 / denom)

"19-4":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 20.9) OR (CalculationMoisture is equal to 100)
return result D

Else


-------
CalculatedUnadjustedValue = CalculationConversionF'actor *
0CalculationConcentration * CurrentHourlyOpRecordF(OFactor I ((100 -
CalculationMoisture) / 100.0)) * (20.9 / (20.9 - CalculationDiluent))

"19-5":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 20.9) OR (CalculationMoisture is equal to 100)
return result D

Else

h2oFactor = (100 - CalculationMoisture) / 100.0
denom = 20.9 - (CalculationDiluent / h2oFactor)

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord FdF actor * 20.9 / denom

"19-5D":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false)
return result C

Else if (CalculationDiluent is equal to 20.9)
return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor * (20.9/ (20.9 -
CalculationDiluent))

"19-6" or "19-7":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactorExists is false)
return result C

Else if (CalculationDiluent is equal to 0.0)
return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord.FcFactor * (100.0 /
CalculationDiluent)

"19-8":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR


-------
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 0.0) OR (CalculationMoisture is equal to 100)
return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor * (
(iCalculationConcentration * CurrentHourly()pRecord. FcFactor) /((100 -
CalculationMoisture) / 100.0) )* (100.0 / CalculationDiluent)

"19-9":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A

Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactor Exists is false) OR (CalculationMoisture is null)
return result C

Else if (CalculationDiluent is equal to 0.0)
return result D

Else

h2oFactor = (100 - CalculationMoisture) / 100.0
co2Term = 100.0 / CalculationDiluent

CalculatedUnadjustedValue = CalculationConversionFactor *

CalculationConcentration * CurrentHourly()p Record. Fc Fac to r * h2oFactor * co2Term

Else

return result B

Else

If (MatsDh vRecord. Equatio nCodc is NOT null)
return result B

Results:

Result
A

B

C

D

F

Response

You reported an incorrect MODCCode in the MATS Derived Hourly Value record for
[param], as you reported substitute data for one or more essential auxiliary parameters.
You reported an incorrect MODCCode in the MATS Derived Hourly Value record for
[param], as you reported measured data for essential auxiliary parameters.

You reported a Formulaldentifier in the MATS Derived Hourly Value record for
[param], but you did not report a value for all the essential parameters needed to
perform the calculation.

The [param] could not be recalculated, because the diluent value would result in
division by zero.

You did not report a single valid MonitorDefault record for ParameterCode BWA for
the hour.

Severity

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

Critical Error Level 1
Critical Error Level 1


-------
Process/Category
Process/Category
Process/Category
Process/Category

Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report

MATS HC1RH Calculation Verification
MATS HF RH Calculation Verification
MATS Hg RH Calculation Verification
MATS S02 RH Calculation Verification


-------
Check Code:	MATSCHV-16

Check Name:	Stash Hg Calculated Value

Related Former Checks:

Applicability:

Description:	Stores the HGRE or HGRH Calculated Unadjusted Value in the appropriate check parameters.

Specifications:

MatsCalculatedHgRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS Hg RH Calculation Verification


-------
Check Code:	MATSCHV-17

Check Name:	Stash HC1 Calculated Value

Related Former Checks:

Applicability:

Description:	Stores the HCLRE or HCLRH Calculated Unadjusted Value in the appropriate check parameters.

Specifications:

MatsCalculatedHclRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS HC1RH Calculation Verification


-------
Check Code:	MATSCHV-18

Check Name:	Stash HF Calculated Value

Related Former Checks:

Applicability:

Description:	Stores the HFRE or HFRH Calculated Unadjusted Value in the appropriate check parameters.

Specifications:

MatsCalculatedHfRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS HF RH Calculation Verification


-------
Check Code:	MATSCHV-19

Check Name:	Stash S02 Calculated Value

Related Former Checks:

Applicability:

Description:	Stores the S02RE or S02RH Calculated Unadjusted Value in the appropriate check parameters.

Specifications:

MatsCalculatedSo2RateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

2	Process/Category: Emissions Data Evaluation Report	MATS S02 RH Calculation Verification


-------
Check Category:

MATS Derived Hourly Value Checks


-------
Check Code:	MATSDHV-1

Check Name:	Initialize HGRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for Hg

Specifications:

CurrentDh v Parameter = "HGRE"

MatsDh v Record = MatsHgDh v Record
MatsEquationCodeWithH2o = "A-3"

MatsEquationCodeWithoutH2o = "A-2"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg RE Derived Hourly Evaluation


-------
Check Code:	MATSDHV-2

Check Name:	Initialize HGRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for Hg

Specifications:

CurrentDh v Parameter = "HGRH"

MatsDh v Record = MatsHgDh v Record

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-3

Check Name:	Initialize HCLRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HCL

Specifications:

CurrentDh v Parameter = "HCLRE"

MatsDh v Record = MatsHctDh v Record
MatsEquationCodeWithH2o = "HC-3"

MatsEquationCodeWithoutH2o = "HC-2"

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

MATS HC1 RE Derived Hourly Evaluation


-------
Check Code:	MATSDHV-4

Check Name:	Initialize HCLRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HCL

Specifications:

CurrentDh v Parameter = "HCLRH"

MatsDh v Record = MatsHctDh v Record

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-5

Check Name:	Initialize HFRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HF

Specifications:

CurrentDh v Parameter = "HFRE"

MatsDh v Record = MatsHfDh v Record
MatsEquationCodeWithH2o = "HF-3"

MatsEquationCodeWithoutH2o = "HF-2"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF RE Derived Hourly Evaluation


-------
Check Code:	MATSDHV-6

Check Name:	Initialize HFRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for HF

Specifications:

CurrentI)h v Parameter = "HFRH"

IVT atsDh v Record = MatsHfDh v Record

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-7

Check Name:	Initialize S02RE Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for S02

Specifications:

CurrentDh vParameter = "S02RE"

MatsDh v Record = MatsSo2 Dh v Record
MatsEquationCodeWithH2o = "S-3"

MatsEquationCodeWithoutH2o = "S-2"

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS S02 RE Derived Hourly Evaluation


-------
Check Code:	MATSDHV-8

Check Name:	Initialize S02RH Derived Hourly Value Data

Related Former Checks:

Applicability:

Description:	This check sets generic parameters and output parameters for subsequent derived hourly checks for S02

Specifications:

CurrentDh vParameter = "S02RH"

M atsDhvRecord = MatsSo2DhvRecord

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS S02 RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-9

Check Name:	Check Mats MODC in DHV Records

Related Former Checks:

Applicability:

Description:	Basic check to ensure that Mats MODC reported in the DHV record is valid.

Specifications:

DerivedHourlyModcStatus = false

If MdtsDhvRecord.ModcCodc not in set {36, 37, 38, 39}
return result A

Else

DerivedHourlyModcStatus = true
Results:

Result	Response	Severity

A	You reported an MODC code that is not valid for the MATS DHV.	Critical Error Level 1

Usage:

1

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1 RE Derived Hourly Evaluation

2

Process/Category:

Emissions Data Evaluation Report —

— MATS HC1RH Derived Hourly Evaluation

3

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RE Derived Hourly Evaluation

4

Process/Category:

Emissions Data Evaluation Report —

— MATS HF RH Derived Hourly Evaluation

5

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RE Derived Hourly Evaluation

6

Process/Category:

Emissions Data Evaluation Report —

— MATS Hg RH Derived Hourly Evaluation

7

Process/Category:

Emissions Data Evaluation Report —

— MATS S02 RE Derived Hourly Evaluation

8

Process/Category:

Emissions Data Evaluation Report —

— MATS S02 RH Derived Hourly Evaluation


-------
Check Code:

MATSDHV-10

Check Name:	Check Formula in MATS DHV Record

Related Former Checks:

Applicability:

Description:	(Copy of DHV-24 tailored to MATS)

Checks the Formula ID in the MATS Derived Hourly Value record and ensures that it can be used for the
calculation

Specifications:

DerivedHourlyFormulaStatus = false

If (DerivedHourlyModcStatus = true)

If (MatsDh vRecord. Fo rmu 1 a Key is null)

If MatsDhvRecord.ModcCode = "38"

DerivedHourlyFormulaStatus = true

else

return result A

else //FormulaKey not null

If (MatsDhvRecord.ModcCodc in set {36, 37, 39})

If (MatsDh vRecord. Fo rm u 1 a A c t i ve I nd is NOT equal to 1)
return result B

Else if (MatsDh vRecord. Fo rmu 1 a Pa ra mc t c rCodc is not equal to CurrentDh vParameter)
return result C

Else if (CurrentDhvParameter in set {"HGRE", "HCLRE", "HFRE", "S02RE"} and MatsDhvRecordModcCodc
= "37"

return result D

Else if (CurrentDhvParameter in set {"HGRH", "HCLRH", "HFRH", "S02RH"} and MatsDhvRecord.ModcCodc
= "39"

return result E

Else

DerivedHourlyFormulaStatus = true
else //other MODC code (38)
return result F

Results:

Result

Response

Severity

A

You did not report a FormulalD in the MATS DHV record for [param].

Critical Error Level 1

B

You reported FormulalD [ID] in the MATS DHV record for [param], but there is no
active Formula record for this formula in your monitoring plan.

Critical Error Level 1

C

You reported FormulalD [ID] in the MATS DHV record for [param], but in your
monitoring plan this formula has a different ParameterCode.

Critical Error Level 1

D

You reported a MODCCode of 37 for the MATS DHV record, but the use of a diluent
cap value is not applicable to [param].

Critical Error Level 1

E

You reported a MODCCode of 39 for the MATS DHV record, but the use of a default
electrical load value is not applicable to [param].

Critical Error Level 1

F

You reported a FormulalD for a MATS DHV record, that is not reported if valid
concentration was not available or substitute data reported for one or more essential
auxiliary parameters.

Critical Error Level 1


-------
Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

MATS HC1 RE Derived Hourly Evaluation
MATS HC1RH Derived Hourly Evaluation
MATS HF RE Derived Hourly Evaluation
MATS HF RH Derived Hourly Evaluation
MATS Hg RE Derived Hourly Evaluation
MATS Hg RH Derived Hourly Evaluation
MATS S02 RE Derived Hourly Evaluation
MATS S02 RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-11

Check Name:	Check Equation Code for MATS RE

Related Former Checks:

Applicability:

Description:	Gets Equation Code from Mats Active Monitor Formula Record and verifies that it is an appropriate equation

for calculation of HCLRE,HFRE,HGRE,S02RE

Specifications:

DerivedHourlyEquationStatus = false

If (DerivedHourlyFormulaStatus == true)

If (MatsDh vRecord. Equatio nCodc is not null)

If (MatsDh v Record. Eq ua t i o nCodc ==MatsEquationCodeWithoutH2o)

DerivedHourlyEquationStatus = true
FlowMonitorHourlyChecksNeeded = true

Else If (MatsDh v Record. Eq ua t i o nCodc ==MatsEquationCodeWithH2o)

Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true
Moisture Needed = true
append "MIN" to H20MissingDataApproach

Else

return result A

Else

DerivedHourlyEquationStatus = true

Results:

Result	Response	Severity

A	You reported a formula code that does not match any of the MATS derived hourly value Critical Error Level 1

formulas.

Usage:

1	Process/Category:

2	Process/Category:

3	Process/Category:

4	Process/Category:

Emissions Data Evaluation Report	MATS HC1 RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS HF RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS S02 RE Derived Hourly Evaluation


-------
Check Code:	MATSDHV-12

Check Name:	Check Equation Code for MATS RH

Related Former Checks:

Applicability:

Description:	Gets Mats Equation Code from Active Mats Monitor Formula Record and verifies that it is an appropriate

equation for Mats Current parameter.

Specifications:

DerivedHourlyEquationStatus = false

If (DerivedHourlyFormulaStatus == true)

If (MatsDh vRecord. Equat io nCodc is not null)

If (MatsDhvRecord.EquationCode inset {19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D, 19-6, 19-7, 19-8, 19-9} )

DerivedHourlyEquationStatus = true

If (MatsDhvRecord.EquationCodc in set {19-1, 19-4} )

02DryNeededForMats = true
FDFactorNeeded = true

Else if (MatsDhvRecord.EquationCode in set {19-3,19-3D, 19-5, 19-5D})

()2 WetNeededFor Mats = true
FDFactorNeeded = true

Else if (MatsDhvRecord.EquationCode in set {19-2} )

()2 WetNceded For Mats = true
FWFactorNceded = true

Else if {MatsDhvRecord. EquationCode inset {19-6, 19-7, 19-8, 19-9} )

C02DiluentNeededForMats = true
FCFactorNeeded = true

If (MatsDhvRecord.EquationCode inset {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}

MoistureNceded = true

Else

return result A

Else

DerivedHourlyEquationStatus true

Results:

Result	Response	Severity

A	You reported a formula code that does not match any of the MATS derived hourly value Critical Error Level 1

formulas.

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


-------
Check Code:	MATSDHV-13

Check Name:	Complete HGRE and HGRH Derived Hourly Value

Related Former Checks:

Applicability:

Description:	This check assigns parameter specific check parameters used by the associated calculation checks.

Specifications:

MatsHgDhvParameter = Cur rentI)h v Parameter

MatsHgDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg RE Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS Hg RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-14

Check Name:	Complete HCLRE and HCLRH Derived Houly Value

Related Former Checks:

Applicability:

Description:	This check assigns parameter specific check parameters used by the associated calculation checks.

Specifications:

MatsHclDhvParameter = CurrentDh vParameter

MatsHclDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 RE Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-15

Check Name:	Complete HFRE and HFRH Derived Hourly Value

Related Former Checks:

Applicability:

Description:	This check assigns parameter specific check parameters used by the associated calculation checks.

Specifications:

MatsHfDhvParameter = CurrentDh v Parameter

MatsHfDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF RE Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF RH Derived Hourly Evaluation


-------
Check Code:	MATSDHV-16

Check Name:	Complete S02RE and S02RH Derived Hourly Value

Related Former Checks:

Applicability:

Description:	This check assigns parameter specific check parameters used by the associated calculation checks.

Specifications:

MatsSo21)h v Parameter = Cur rentI)h v Parameter

MatsSo2DhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS S02 RE Derived Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS S02 RH Derived Hourly Evaluation


-------
Check Code:

MATSDHV-17

Check Name:

Check Unadjusted Value

Related Former Checks:

Applicability:

Description:

Specifications:

DerivedHourlyUnadjustedValueStatus = false
If (DerivedHourlyModcStatus = true)

If (Mcits Dh v Record. Mode Code in set {36, 37, 39})

If (MatsDhvRecord.UnadjustedHourly Value is null)
return result A

Else if (MatsDh vRecord. U nadj ustedHourly Value is NOT reported in scientific notation to three significant digits)
return result B

Else if {MatsDhvRecord XSmd.)ustedHourlyValue < 0)
return result C

Else

DerivedHourlyUnadjustedValueStatus = true

Else // MODC 38

If (MatsDh vRecord. U nadj ustedHourly Value is not null)
return result D

Else

DerivedHourlyUnadjustedValueStatus = true

Results:

Result

A

B

Response

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

The [fieldname] value in the [key] records is not reported in scientific notation rounded

to three significant figures, with one digit to the left of the decimal point.

You reported a negative value, which is invalid, in the field [fieldname] for [key].

You reported an UnadjustedHourly Value for a MATS DHV record, that is not reported

if a valid concentration was not available or substitute data reported for one or more

essential auxiliary parameters.

Severity

Critical Error Level 1
Critical Error Level 1

C
D

Critical Error Level 1
Critical Error Level 2


-------
Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

Process/Category:

Emissions Data Evaluation Report

MATS HC1 RE Derived Hourly Evaluation
MATS HC1RH Derived Hourly Evaluation
MATS HF RE Derived Hourly Evaluation
MATS HF RH Derived Hourly Evaluation
MATS Hg RE Derived Hourly Evaluation
MATS Hg RH Derived Hourly Evaluation
MATS S02 RE Derived Hourly Evaluation
MATS S02 RH Derived Hourly Evaluation


-------
Check Category:
MATS Hourly GFM Data


-------
Check Code:	MATSGFM-1

Check Name:	Component ID Valid

Related Former Checks:

Applicability:

Description:	Ensure that the Component ID is associated with "STRAIN".

Specifications:

Set MatsHourlyGFMComponentldValid = false.

Set MatsSamplingTrainRecord to null.

Set MatsSamplingTrainQaStatus to null.

Set MatsSorbentTrapBeginDateHour to null.

Set MatsSorbentTrapEndDateHour to null.

Set MatsSamplingTrainCount to null.

If the MatsHourlyGFMRecord.ComponentlD is null,

Return result A.

Else

Locate MatsSamplingTrainRecords where:

1)	Componentld is equal to MatsHourlyGFMRecord. Co mpo nc lit ID

2)	SorbentTrapBeginDateHour is on or before CurrentDateHour

3)	SorbentTrapEndDateHour is on or after CurrentDateHour

4)	Records are sorted by SorbentTrapBeginDateHour and SorbentTrapEndDateHour// The earliest sampling train is the correct
train.

Set MatsSamplingTrainCount to the number of records located in MatsSamplingTrainsRecords.

If not found,

Locate an entry in the element in MatsSorbentTrapListByLocationArray for CurrentMonitorPlanLocationPosition where:

1)	SorbentTrapForQuarterBorderis true.

2)	SorbentTrapBeginDateHour is on or before CurrentDateHour.

3)	SorbentTrapEndDateHour is on or after CurrentDateHour.

If not found,

Return result B.

Else

Set MatsHourlyGFMComponentldValid to true.

Set MatsSamplingTrainRecord to the first record located in MatsSamplingTrainsRecords.
Set MatsSamplingTrainQaStatus to MatsSampling Train Record. T ra i nQ A S t a t u s C o dc.
Set MatsSorbentTrapBeginDateHour to MatsSamplingTrainRecord.BeginDateHour.

Set MatsSorbentTrapEndDateHour to MatsSampling Train Record. E nd D a t c H o u r.

Results:

Result
A

B

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

For [key], you reported a sorbent train GFM Component ID that does not match a
sorbent train Component ID record.

Severity

Critical Error Level 1

Critical Error Level 1


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation


-------
Check Code:	MATSGFM-2

Check Name:	Begin and End Hour Flags Valid

Related Former Checks:

Applicability:

Description:	Check that Begin and End Hour Flags are valid

Specifications:

IF MatsHourlyGFMComponentldValid is true,

If Hourly(tFMData B eg i n E ndH o u rF 1 ag is "I",

If CurrentDateHour is not equal to the MatsSorbentTrapBeginDateHour and is not the hour after the
MatsSorbentTrapBeginDateHour.

Return result A

Else if the Hourly (tFMData B eg i n E ndH o u rF 1 ag is "F",

If CurrentDateHour is not equal to theMatsSorbentTrapEndDateHour and is not the hour before the
MatsSorbentTrapEndDateHour,

Return result B.

Else if Hourly(iFMData. Begi nE ndHourF 1 ag is null,

If CurrentDateHour is on the MatsSorbentTrapBeginDateHour,

Return result C.

Else if CurrentDateHour is on the MatsSorbentTrapEndDateHour.

Return result D.

Else if //owr/jGFMDafa.BeginEndHourFlag is "T",

If MatsSamplingTrainCount is less than or equal to 1,

Set SupplementalSorbentTrapExists to false.

If MatsSamplingTrainCount is equal to 1,

// Determine whether the second sorbent trap was reported in the previous quarter.

Locate MonitorSystemComponentRecordByHourLocation where Componentld is equal to
HourlyGFMData. Componentld.

If found,

Locate MatsSorbentTrapSupplimentalDataRecords where:

1)	Systemld is equal to the Systemld in one of the located
MonitorSystemComponentRecordByHourLocation records

2)	EndDateHour is equal to CurrentDateHour

If found,

Set SupplementalSorbentTrapExists to true.

If SupplementalSorbentTrapExists is equal to false,

// No transition overlap between sorbent traps


-------
Results:

Return result E.

Else if CurrentDateHour is not equal to the MatsSorbentTrapEndDateHour

II Current hour is not the end hour of the current sorbent trap
Return result F.

Result	Response	Severity

A	For [key], you identified a begin hour that is not the first or second hour of the sampling Critical Error Level 1

period.

B	For [key], you identified an end hour that is not the last or second to the last hour of the Critical Error Level 1

sampling period.

C	For [key], you did not identify the first hour of the sampling period as a begin or	Critical Error Level 1

transition hour.

D	For [key], you did not identify the last hour of the sampling period as an end or	Critical Error Level 1

transition hour.

E	For [key], you identified an hour as a transition hour, but the hour is not included in two Critical Error Level 1

consecutive sampling periods.

F	For [key], you identified a transition hour that is not the last hour of a sampling period. Critical Error Level 1

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS Hourly Gas Flow Meter Evaluation


-------
Check Code:

MATSGFM-3

Check Name:

Related Former Checks:

Hourly GFM Reading Valid

Applicability:

Description:

Specifications:

Hourly GFM Reading Null or Reported to Two Decimal Places

IF MatsHourlyGFMComponentldValid is true,

If the MatsHourlyGFMRecord.HourlyGFMReadmg is null,

If the MatsSamplingTrainQaStatus is NOT equal to "INC", "EXPIRED", or "LOST", AND
HourlyGFM Data. B eg i n E ndH o u rF lag is NOT equal to 'N',

Return result A.

If Hourly GFM Data. B eg i n E ndH o u rF lag is equal to 'N',

Return result D.

Else if the MatsSamplingTrainQaStatus is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else if the MatsHourlyGFMRecord. H ourly GFIVIRcadi ng is not reported to two decimal places ,
Return result C.

Else,

Results:

Result
A

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

Severity

Critical Error Level 1

B

You reported a [fieldname] value in the [key] records which is reported only if the Critical Error Level 1
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack

flow rate for the hour is a measured data value.

C
D

For [key], the [fieldname] value must be reported to at least two decimal places.	Critical Error Level 1

You reported a [fieldname] value in the [key] records, but also reported a problem with Critical Error Level 1
the hourly GFM data with a "N" in the BeginEndHourFlag record.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation


-------
Check Code:

MATSGFM-4

Check Name:

Related Former Checks:

Average Hourly Sampling Rate Valid

Applicability:

Description:

Specifications:

Average Hourly Sampling Rate Null or Reported to Two Decimal Places

IF MatsHourlyGFMComponentldValid is true,

If the MatsHourfyGFMRecord.AvgHourlySamplingRate is null,

If the MatsSamplingTrainOaStatus is NOT equal to "INC", "EXPIRED", or "LOST", AND
HourlyGFMData. B eg i n E ndH o u rF lag is NOT equal to 'N',

Return result A.

If Hourly GFMData B eg i n E ndH o u rF lag is equal to 'N',

Return result D.

Else if the MatsSamplingTrainQaStatus is not "PASSED", "FAILED", or "UNCERTAIN",

Return result B.

Else if the MatsHourlyGFMRecorcl.AvgHourhSampUngR'Mc is not reported to two decimal places ,
Return result C.

Else,

Results:

Result
A

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

For [key], the [fieldname] value must be reported to at least two decimal places.
You reported a [fieldname] value in the [key] records, but also reported a problem with
the hourly GFM data with a "N" in the BeginEndHourFlag record.

Severity

Critical Error Level 1

B

Critical Error Level 1

C
D

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation


-------
Check Code:	MATSGFM-5

Check Name:	Sampling Rate UOM Valid

Related Former Checks:

Applicability:

Description:	Sampling Rate UOM Null or Matches UOM Code

Specifications:

IF MatsHourlyGFMComponentldValid is true,

If the MatsHourlydFMRecortl.S'dmpWngR'dicUOM is null,

If the MatsSamplingTrainOaStatus is NOT equal to "INC", "EXPIRED", or "LOST", AND
HourlyGFMData. B eg i n E ndH o u rF lag is NOT equal to 'N',

Return result A.

Else,

If Hourly GFMData. B eg i n E ndH o u rF lag is equal to 'N',

Return result D.

Else if the MatsSamplingTrainQaStatus is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else if the MatsHourlyGFMRecord.SamplingRateVOM is not "CCMIN", "DSCMMIN", "LMIN", "CCHR",
"DSCMHR", or "LHR",

Return result C.

Results:

Result
A

B

C
D

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the

sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack

flow rate for the hour is a measured data value.

For [key] you reported a [value] which is not valid for [fieldname].

You reported a [fieldname] value in the [key] records, but also reported a problem with

the hourly GFM data with a "N" in the BeginEndHourFlag record.

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	MATS Hourly Gas Flow Meter Evaluation


-------
Check Code:

MATSGFM-6

Check Name:

Related Former Checks:

Hourly SFSR Ratio Valid

Applicability:
Description:

Hourly SFSR Ratio Null or Reported in Required Range and Decimal Places

Specifications:

If the MatsHourlydFMRecord.HourlySFSRRatio is null,

If MatsSamplingTrainQaStatus is not "INC", "EXPIRED", or "LOST", AND CurrentStackFlowHourlyRecord is NOT null
AND CurrentStackFlowHourlyRecord.ModcCode in set {01, 02, 03, 04, 20, 53, 54}, AND HourlydFMData.BeginEndHourFlag
is NOT equal to 'N',

Return result A.

If //owr/jGFMDafa.BeginEndHourFlag is equal to 'N',

Return result G.

Else if MatsSamplingTrainQaStatus is not "PASSED", "FAILED", or "UNCERTAIN",

Return result B.

Else if CurrentStackFlowHourlyRecord is null,

Return result F.

Else if CurrentStackFlowHourlyRecord.ModcCode NOT in set {01, 02, 03, 04, 20, 53, 54},

Return result E.

Else if the the MatsHourlydFMRecord. Hourly SFS RRatio is not reported to one decimal place ,

Return result C.

Else if the MatsHourlydFMRecord. Hourly S FSRRat io is not greater than or equal to 1.0 and less than or equal to 100.0,

Return result D.

Else if MatsHourlydFMComponentld Valid is true AND MatsSamplingTrainDictionary contains a key equal to
MatsSampling Train Record. T ra i n ID AND MatsSampling Train Dictionary. Re fc re nee S F S R Ra t i o where the key equals
MatsSampling Train Record. T ra i n ID is NOT null or equal to 0,

Set MatsHourlySfsrRatioDeviation to absolute value of [1 - (MatsHourlydFMRecord. Hourly SFS RRatio /
MatsSamplingTrainDictionary.RcfcrcnccSFSRRdUo where the key equals MatsSamplingTrainRecord.Trmn\D)| x 100,
rounded to an integer.

Add one to MatsSamplingTrain Dictionary.To[c\\SFSRRc\{ioCoun{ where the key equals

MatsSamplingTrainRecord. T rainID

If the MatsHourlySfsrRatioDeviation is greater than 25,

Else,

Add one to MatsSampling Train Diction 
-------
Results:

Result
A

B

C
D

E

F
G

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value for [key] should be reported to one decimal place.

The [fieldname] value for [key] must be a number between 1 and 100.

You reported a [fieldname] value in the [key] records which is not reported if the stack

gas flow rate for the hour is a substitute data value.

You reported a [fieldname] value in the [key] records which you should not report when
a stack gas flow rate is not reported for the hour.

You reported a [fieldname] value in the [key] records, but also reported a problem with
the hourly GFM data with a "N" in the BeginEndHourFlag record.

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	MATS Hourly Gas Flow Meter Evaluation


-------
Check Category:

MATS Monitor Hourly Value Checks


-------
Check Code:	MATSMHV-1

Check Name:	MATS HgC: Initialize

Related Former Checks:

Applicability:

Description:

Specifications:

Set CurrentMh v Parameter to "HGC"

Set MatsMh vRecord to MatsHgcMh vRecord

If (MatsHgMethodRecord.MethodCode is equal to "ST")
Set CurrentMhvSystemType to "ST"
Set CurrentMhvComponentType to "STRAIN"
Set MatsMhvMeasuredModcListto {01, 02, 32, 33, 41, 42}

Else

Set CurrentMh vSystem Type to "HG"

Set CurrentMhvComponentType to "HG"

Set MatsMhvMeasuredModcList to {01, 02, 17, and 21}

Set MatsMhvUnavailableModcList to {34 and 35}

Severity

MATS Hg Concentration Monitor Hourly Evaluation

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report


-------
Check Code:

MATSMHV-2

Check Name:	MATS HC1C: Initialize

Related Former Checks:

Applicability:

Description:

Specifications:

Set CurrentMhv Parameter to "HCLC"

Set MatsMh vRecord to MatsHctcMh vRecord
Set CurrentMhvComponentType to "HCL"

Set CurrentMh vSystem Type to" H CL"

Set MatsMhvMeasuredModcList to {01, 02, 17, and 21}

Set MatsMhvUnavailableModcIAst to {34 and 35}

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-3

Check Name:	MATS HFC: Initialize

Related Former Checks:

Applicability:

Description:

Specifications:

Set CurrentMh v Parameter to "HFC"

Set MatsMh vRecord to MatsHfcMh vRecord
Set CurrentMhvComponentType to "HF"

Set CurrentMhvSystemType to "HF"

Set MatsMhvMeasuredModd 1st to {01, 02, 17 and 21}

Set MatsMhvUnavaikibleModcList to {34 and 35}

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-4

Check Name:	MATS: Check MODC

Related Former Checks:

Applicability:

Description:	Ensure that the reported MODC is one of the valid measured or unavailable MODC for the MATS parameter.

Specifications:

Set MonitorHourlyModcStatus to false.

If (MatsMhvRecord.ModcCode is null)
return result A

Else if (MatsMh v Record. Mode Code not in MatsMhvMeasuredModcList AND not in MatsMh v Una vaitabteModcL ist)
return result B

Else if (CurrentMhvSystemType is equal to "ST") AND (MatsMhvRecord.ModcCode is NOT equal to "41" or "42")

Locate MatsSorbentTrapRecords where:

1)	Systemld is equal to MatsMh vRecord. Sy stc m ID

2)	BeginDateHour is on or before CurrentDateHour

3)	EndDateHour is on or after CurrentDateHour

4)	Records are sorted by BeginDateHour and EndDateHour // The earliest sorbent trap is the correct trap.

If found,

For the first located record in MatsSorbentTrapRecords

If (ModcCode is NOT null) AND (MatsMhvRecord.ModcCode is NOT equal to ModcCode)
return result C

Else

MonitorHourlyModcStatus = true

Else

MonitorHourlyModcStatus = true

Else

MonitorHourlyModcStatus = true

Results:

Result
A
B
C

Response

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

The MODCCode reported for MATS Monitor Hourly Value is invalid.

The MODCCode reported for MATS Monitor Hourly Value is invalid for Hg sorbent

trap systems.

Severity

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


-------
Usage:

1	Process/Category:	Emissions Data Evaluation Report

2	Process/Category:	Emissions Data Evaluation Report

3	Process/Category:	Emissions Data Evaluation Report

MATS HC1 Concentration Monitor Hourly Evaluation
MATS HF Concentration Monitor Hourly Evaluation
MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-5

Check Name:	MATS: Check Percent Monitor Availability

Related Former Checks:

Applicability:

Description:	Ensures that the Percent Monitor Availability (PMA) was reported and is inclusively between 0 and 100.

Specifications:

Set MonitorHourlyPmaStatus = false
If (MonitorHourlyModcStatus == true)

If ( MatsMh v Record. Pc rcc lit Ay a i lab lc is NULL)
return result A

Else if (MatsMh v/?6'cmy/.Pcrccnt Ayai 1 ab 1 c> 100.0 OR MatsMh vRecord. Pcrccnt Ayai 1 ab 1 c <0.0)
return result B

Else

Set MonitorHourlyPmaStatus = true

Results:

Result	Response Severity

A	You did not report a PMA for the MATS Monitor Hourly Value.	Critical Error Level 1

B	The PMA must be in a range from 0 to 100. Critical Error Level 1

Usage:

1	Process/Category:	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category:	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3

Process/Category:

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-6

Check Name:	MATS: Monitoring System

Related Former Checks:

Applicability:

Description:	Ensures that a Monitor System is reported when a measured MODC is reported, and that is not reported when an

unavailable MODC is reported. When Monitor System is and should have been reported, the check ensures that
the system type is valid for the MATS parameter being reported.

Specifications:

Set MonitorHourlySystemStatus = false

If (MonitorHourlyModcStatus == true)

If (MatsMhvRecord.ModcCode in MatsMhvMeasuredModcList)

If MatsMh vRecord. MonitoringSystemID is null
return result A

Else if MatsMh vRecord. Sy steinlde utifier is null
return result B

Else if (MatsMhvRecord.SystcmTypcCodc <> CurrentMhvSystemType)
return result C

Else

MonitorHourlySystemStatus = true

Else // Unavailable MODC

If (MatsMh vRecord. IVIo n i t o ri ng Sy s t c m ID is NOT null)
return result D

Else

MonitorHourlySystemStatus = true

Results:

Result
A

B

C
D

Response

You did not report a MonitoringSystemID for the [param] MATS Monitor Hourly
Value.

You reported MonitoringSystemID [ID] in the MATS MHV record for [param], but
there is no Monitoring System recored for this system in your monitoring plan that was
active during the hour.

The system type associated with the Monitoring System ID for the [param] MATS
Monitor Hourly Value is not consistent with that parameter.

You reported a MonitoringSystemID for the [param] MATS Monitor Hourly Value that Critical Error Level 1
is not reported based on the MODCCode.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1


-------
Usage:

1	Process/Category:	Emissions Data Evaluation Report

2	Process/Category:	Emissions Data Evaluation Report

3	Process/Category:	Emissions Data Evaluation Report

MATS HC1 Concentration Monitor Hourly Evaluation
MATS HF Concentration Monitor Hourly Evaluation
MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-7

Check Name:	MATS: System Designation

Related Former Checks:

Applicability:

Description:	Ensure that the System Designation Code is valid for the reported MODC.

Currently, the system designation should be 'P' for MODC 01 and 17, 'B' or 'PB' for MODC 02.

Specifications:

If (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true AND McitsMh vRecord. S y s t c m I dc n t i fi c r is not null)

case (MatsMh vRecord. ModcCodc)

01 OR 17: If (MatsMhvRecord.SystcmDcsignationCodc <> "P")
return result A

02: If (MatsMh vRecord. Sy s t c m D c s i g na t i o n Co dc NOT in set {B, RB}
return result B

Results:

Result	Response

A	You reported a MATS Hourly Value MODCCode that is only used with primary or

temporary like kind monitoring systems.

B	You reported a MATS Monitor Hourly Value MODCCode that is only used with

backup or redundant backup monitoring systems.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

3	Process/Category:

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-8

Check Name:	MATS: Check Like Kind Analyzer Use

Related Former Checks:

Applicability:

Description:	Ensures that the conditions exist that allow the use of particular MODC.

Currently only checks MODC 17.

Specifications:

If (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true)

If (MatsMhvRecord.ModcCode == "17")

HoursOfUseOfLikeKindAnalyzer = Count of MonitorHourlyValueData records for the location and reporting period where:

1)	ParameterCode = CurrentMhvParameter

2)	ModcCode == "17"

3)	BeginDateHour < CurrentOperatingDateHour

If HoursOfUseOfLikeKindAnalyzer >= 720

FirstUseOfLikeKindAnalyzerRecord = MonitorHourlyValueData record at earliest time for the location and
reporting period where:

1)	ParameterCode = CurrentMhvParameter

2)	ModcCode == "17"

3)	BeginDateHour < CurrentOperatingDateHour

Locate a RATATestRecordsByLocationForQAStatus for the location where:

1)	MonitoringSystemID is equal to McitsMh vRecord. M o n i t o ri ng S v s t e m ID

2)	TestResultCode begins with "PASS"

3)	EndDate/EndHour is after the FirstUseOfLikeKindAnalyzerRecord.Date/Hour and on or prior to the
CurrentOperatingDateHour.

If not found,

return result A

Results:

Result	Response

A	You reported an MODCCode of 17 in the MATS Monitor Hourly Value record for

[param], indicating the 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	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category: Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Seventy

Critical Error Level 1


-------
Check Code:	MATSMHV-9

Check Name:	MATS: Component

Related Former Checks:

Applicability:

Description:	Ensures that a Component is reported when a measured MODC is reported, and that is not reported when an

unavailable MODC is reported. When Component is and should have been reported, the check ensures that the
system type is valid for the MATS parameter being reported.

Specifications:

MonitorHourlyComponentStatus = false

If (CurrentMhvSystemType <> "ST")

If (MonitorHourlyModcStatus = true)

If (MatsMh v Record. Mode Code in set MatsMhvMeasuredModcList)

If MatsMh vRecord. Co mpo ne lit ID is null
return result A

Else

If MatsMh vRecord. C o m po nc n 11 dc n t i fi c r is null
return result B

Else if (MatsMh vRecord. Co mpo ncntTy pcCodc <> CurrentMhvComponentType)
return result C

Else if MatsMh vRecord. ModcCodc == 17 AND MafsMAvTtecon/.Componentldentifier does not begin
with "LK"

return result D

Else

MonitorHourlyComponentStatus = true

Else

If MatsMh vRecord. Co mpo ne lit ID is NOT null
return result E

Else

MonitorHourlyComponentStatus = true

Else

If MatsMh vRecord. Co mpo ne lit ID is NOT null
return result F

Else

MonitorHourlyComponentStatus = true


-------
Results:

Result	Response

A	You did not report a ComponentID for the [param] MATS Monitor Hourly Value.

B	Your reported ComponentID [ID] in the MATS MHV record for [param], but there is

no Component record for this component in your monitoring plan.

C	The component type associated with the ComponentID for the [param] MATS Monitor

Hourly Value is not consistent with the parameter.

D	You reported an MODCCode of 17 in the MATS MHV record for [param], which

indicates that the component is a like-kind analyzer, but the ComponentID does not
begin with LK.

E	You reported a ComponentID for the [param] MATS Monitor Hourly Value that is not

reported based on the MODCCode.

F	You reported a ComponentID in the MATS MHV record for a [type] system, but a

ComponentID is only reported for a gas CEMS.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category: Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

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


-------
Check Code:

MATSMHV-10

Check Name:

Related Former Checks:

MATS: System Component

Applicability:
Description:

Ensure that at least one active Monitoring System Component record exists for the Monitoring System Id and
Component Id in the current MATS MHV record.

Specifications:

If (MonitorHourlySystemStatus == true) AND (MatsMh vRecord. Mo ni to ri ngSy stc m ID is not null) AND (MonitorHourlyComponentStatus
== true) AND (MatsMh vRecord. Co mpo ncnt ID is not null)

CountMonSysCompRecord = count MonitoringSystemComponentByHourLocation records where:

1)	MonitoringSystemID = MatsMh v Record. IVI o n i t o ri ng Sy s t c m ID

2)	ComponentID = MatsMh vRecord. Co mpo nc lit ID

If CountMonSysCompRecord = 0
return result A

Results:

Result
A

You reported MonitoringSystemID [sys] ComponentID [ID] in the MATS MHV record Critical Error Level 1
for [param], but there is no MonitorSystemComponent record for this system and
component in your monitoring plan that was active during the hour.

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-11

Check Name:	MATS: Max/Min Value

Related Former Checks:

Applicability:

Description:	Determines the MPC for the active Monitor Span record for the hour, location and component type, returning a

check result if the a single row is not found or the MPC is not greater than 0.

Specifications:

CurrentMHVMaxMin Value = null

If (MonitorHourlyModcStatus == true AND MatsMh v Record. Mode Code in set MatsMhvMeasuredModcList)
If (CurrentMhvComponentType == "HG")

MonitorSpanRecordCount = Find active MonitorSpanRecordByHourAndLocation where:

1)	ComponentTypeCode = CurrentMhvComponentType AND

2)	SpanScaleCode = "H"

If (MonitorSpanRecordCount > 1)
return result A

Else if (MonitorSpanRecordCount = 0)
return result B

Else

CurrentMonitorSpanRecord = the single matched record
If CurrentMonitorSpanRecord.MPCValue > 0)

CurrentMhvMaxMinValue = CurrentMonitorSpanRecord.MPCValuQ

Else

return result C

Results:

Result	Response Severity

A	You have more than one active High Range SpanScaleCode at the current location for Critical Error Level 1
the hour.

B	You have no active High Range SpanScaleCode at the current location for the hour. Critical Error Level 1

C	The value in the reported span record for [param] is invalid.	Critical Error Level 1

Usage:

1	Process/Category:	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category:	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category:	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:

MATSMHV-12

Check Name:

Related Former Checks:

MATS: Unadjusted Value

Applicability:

Description:

Specifications:

Validates the value and format of the reported unadjusted hourly value.

MonitorHourlyUnadjustedValueStatus = false
Mats Mil vCalculated Value = null

If (MonitorHourlyModcStatus == true)

Case (MatsMh v Record. Mode Code)

= 21:

MatsMhvCalculatedValue = 0.00E0

If (MatsMhvRecord.UnadjustedHourly Value == 0.00E0)
MonitorHourlyUnadjustedValueStatus = true

Else

return result A
= All Other Codes:

If (MatsMhvRecord.ModcCode in set MatsMhvMeasuredModcIJst)

If (Mc/?.sM/iV'/?6'cwY/.U nadj ustedHourly Value is null)
return result B

Else if (MatsMh vRecord. U nadj ustedHourly Va 1 uc is not reported in scientific notation to three significant
digits)

return result C

Else if (MatsMh vRecord. U nadj ustedHourly Va 1 uc < 0.00E0)
return result D

MonitorHourlyUnadjustedValueStatus = true

MatsMhvCalculatedValue =	nadj ustedHourly Value

If (CurrentMhvMaxMinValue is not null AND MatsMh vRecord. U nadj ustedHourly Value >
CurrentMhvMaxMin Value)
return result E

Else

Else

If (Mc/?.sM/iV'/?6'cwY/.U nadj ustedHourly Value is not null)
return result F


-------
Results:

Result	Response	Severity

A	You reported an MODCCode of 21 in the MATS Monitor Hourly Value record for Critical Error Level 1

[param], but the UnadjustedHourlyValue does not equal 0.

B	You reported a measured value MODCCode in the MATS Monitor Hourly Value record Critical Error Level 1

for [param] but did not report an UnadjustedHourlyValue.

C	The [fieldname] value in the [key] records is not reported in scientific notation rounded Critical Error Level 1

to three significant figures, with one digit to the left of the decimal point.

D	You reported a negative value, which is invalid, in the field [fieldname] for [key].	Critical Error Level 1

E	Warning: The UnadjustedHourlyValue reported in the MATS MHV record for [param] Informational Message

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 range values. You should investigate the
cause of these exceedances and determine whether adjustments to your monitoring
systems or monitoring plan are necessary.

F	You did not report a measured value MODCCode in the MATS Monitor Hourly Value Critical Error Level 1

record for [param], but did report an UnadjustedHourlyValue.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:

MATSMHV-13

Check Name:

MATS: QA Status Required and QA Status Parameters

Related Former Checks:

Applicability:
Description:

Sets QA Status value and is required parameters.

Specifications:

Set QaStatusComponentBeginDate = MatsMh vRecord. Co mpo lie lit Begi nDa tc
Set QaStatusComponentld = MatsMh vRecord. Co mpo lie lit Id
Set QaStatusComponentldentifier = MatsMh vRecord. Co mpo lie lit Idc nti ficr
Set QaStatusComponentTypeCode = MatsMh vRecord. CompolientTy pcCodc
Set QaStatusSystemDesignationCode = MatsMh vRecord. Sy s t c ill D c s i g na t i o n C o dc
Set QaStatusSystemld = MatsMh vRecord. Sy stc 1111d
Set QaStatusSystemldentifier = MatsMh v Record. Sy s t c 1111 dc 111 i fi c r
Set QaStatusSystemTypeCode = MatsMh vRecord. Sy stcniTypcC0dc

Set DailyCalStatusRequired = false.

Set LinearityStatusRequired = false.

Set QuarterlyGasAuditStatus = false.

Set RataStatusRequired = false.

Set WsiStatusRequired = false.

if (Monitor Hour lyModcStatus == true) AND (MatsMh v Record. Mode Code i 11 MatsMh vMeasuredModc/Jst) AND
(MatsMhvRecord.UnadjustcdHourly Value is not null)

if (MonitorHourlyComponentStatus = true) AND (MatsMh v Record. Co mpo lie lit ID is not null)

if (MatsMh vRecord. ParamctcrCodc is equal to "HGC")

If (MatsMh vRecord. Sy stcmTypcC0dc is equal to "HG")

Set DailyCalStatusRequired = true.
Set LinearityStatusRequired = true.

If (MatsMh vRecord. H gCo m e rtc rl nd is equal to 1)
Set WsiStatusRequired = true.

else if (MatsMh vRecord. ParamctcrCodc is in set {"HCLC", "HFC"})

Set QuarterlyGasAuditStatus = true.

if (MonitorHourlySystemStatus = true) AND (MatsMh vRecord. IVI011 i 10 ri ngSy stc 1111D is not null)

Set RataStatusRequired = true.


-------
Results:

Result	Response

Usage:

1	Process/Category:

2	Process/Category:

3	Process/Category:

Emissions Data Evaluation Report	MATS

Emissions Data Evaluation Report	MATS

Emissions Data Evaluation Report	MATS

Severity

HC1 Concentration Monitor Hourly Evaluation
HF Concentration Monitor Hourly Evaluation
Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-14

Check Name:	MATS HgC: Complete

Related Former Checks:

Applicability:

Description:	Assigns the calculated values for MATS Hg Concentration Monitor Hourly.

Specifications:

MatsMhvCalculatedHgcValue = MatsMhvCalculatedValue
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-15

Check Name:	MATS HC1C: Complete

Related Former Checks:

Applicability:

Description:	Assigns the calculated values for MATS HC1 Concentration Monitor Hourly.

Specifications:

MatsMhvCalculatedHclcValue = MatsMhvCalculatedValue
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation


-------
Check Code:	MATSMHV-16

Check Name:	MATS HFC: Complete

Related Former Checks:

Applicability:

Description:	Assigns the calculated values for MATS HF Concentration Monitor Hourly.

Specifications:

MatsMhvCalculatedHfcValue = MatsMhvCalculatedValue
Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation


-------
Check Code:

MATSMHV-17

Check Name:

Related Former Checks:

MATS: QA Status Analyzer Range Parameters

Applicability:
Description:

Sets analyzer range parameters for Linearity and Daily Calibration QA status checking.

Specifications:

If (LinearityStatusRequired == true) OR (DailyCalStatusRequired == true)

Set DualRangeStatus = false.

Set ApplicableComponentID = null.

Set ApplicableSystemlDs = null.

Set CurrentAnalyzerRangeUsed = null.

Set HighRangeComponentID = null.

Set LowRangeComponentID = null.

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the ComponentID is equal to the
QaStatusComponentld.

If (AnalyzerRangeRecordsByHourLocation is not found OR if more than one AnalyzerRangeRecordsByHourLocation is found)

Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false

return result A

Else if (AnalyzerRangeRecordsByHourLocation.DualRangelndicator =1)

Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false

return result B

Else if (AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode <> "H")

Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false

return result C

Else

Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation.AnalyzerRangeCode.

Set ApplicableComponentID = QaStatusComponentld.

Set HighRangeComponentID = QaStatusComponentld.

For each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the
ApplicableComponentID

Append MonitorSystemComponentRecordsByHourLocation.SystemlT> to ApplicableSystemlDs.

if (MonitorSystemComponentRecordsByHourLocation is not found)

set LinearityStatusRequired = false
set DailyCalStatusRequired = false

return result D


-------
Results:

Result
A

B

C

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 dual range
analyzers are not allowed for MATS. The QA Status of the linearity and/or daily
calibration tests for this component will not be evaluated.

You reported that ComponentID [COMPID] is not a high range analyzer, but only a
high range analyzer is allowed for MATS. 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	MATS HC1 Concentration Monitor Hourly Evaluation

Process/Category: Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Process/Category:

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Code:

MATSMHV-19

Check Name:	MATS HgC: 3-Level System Integrity Status Check

Related Former Checks:

Applicability:

Description:	Ensures that a 3-Level system integrity was performed for a non-like-kind analyzer component. Iif a 120 or 125

certification event occurred, this check ensures that either 168 days has not elapsed since the event, or thatthat a
3-Level system integrity was performed after the event.

Specifications:

If WsiStatusRequired is equal to true, AND QaStatusComponentldentifier does not begin with "LK"

Set SystemlntegrityRecord to null.

Set CertEventRecord to null.

Locate the most recent Mats3LevelSystemIntegrityRecordsForQaStatus record where:

a)	ComponentID is equal to QaStatusComponentld.

b)	EndDateHour is prior to CurrentDateHour.

If found,

Set SystemlntegrityRecord to the located record in Mats3LevelSystemIntegrityRecordsForQaStatus.

Else

Set SystemlntegrityRecord to the located record in null.

If SystemlntegrityRecord is NOT null,

Locate the most recent record in QACertificationEventRecords where:

a)	QaCertEventDateHour is prior to CurrentDateHour.

b)	ComponentID is equal to QaStatusComponentld.

c)	QaCertEventCode is equal to "120" or "125"

d)	QaCertEventDateHour is after SystemlntegrityRecord.EndDateHour.

If found,

Set CertEventRecord to the located record in QACertificationEventRecords

Else

Locate the most recent record in QACertificationEventRecords where:

a)	QaCertEventDateHour is prior to CurrentDateHour.

b)	ComponentID is equal to QaStatusComponentld.

c)	QaCertEventCode is equal to "120" or "125"

If found,

Set CertEventRecord to the located record in QACertificationEventRecords

If CertEventRecord is NOT null

If CurrentDateHour is 168 hours after CerffiVewtftecordQaCertEventDateHour,
If SystemlntegrityRecord is null,
return result A.

Else

return result B.


-------
Else if SystemlntegrityRecord is null
return result C.

Results:

Result	Response	Severity

A	The conditional data period for QACertEventCode [code] QACertEventDate [eventdate] Critical Error Level 1

for SystemID [EVENTKEY] has expired. A prior 3 Level System Integrity test was
ignored.

B	The conditional data period for QACertEventCode [code] QACertEventDate [eventdate] Critical Error Level 1

for [key] has expired.

C	A3 Level System Integrity test is required for component [COMPID],	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation


-------
Check Category:

MATS Operating Hour Checks


-------
Check Code:

MATSHOD-1

Check Name:	MATS Hg: Locate Active Monitor Method

Related Former Checks:

Applicability:

Description:	Locates the active Monitor Method record with Parameter Code equal to 'HGRE' or 'HGRH' and for the current

hour and location. Returns a negative result if more than one active record is found. Returns the record and the
Parameter Code in the record as output parameters if one record is found.

Specifications:

Set MatsHgMethodRecord to null.

Set MatsHgParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate MonitorMethodRecordsByHourLocation records where ParameterCode is equal to "HGRE" or "HGRH".

If more than one record was located,

return result A

Else if one record was located,

Set MatsHgMethodRecord to the located record.

Set MatsHgParameterCode to MatsHgMethodRecord. PimuncicrCodc.

Results:

Result	Response	Severity

A	You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1

location.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-2

Check Name:	MATS HC1: Locate Active Monitor Method

Related Former Checks:

Applicability:

Description:	Locates the active Monitor Method record with Parameter Code equal to 'HCLRE' or 'HCLRH' and for the

current hour and location. Returns a negative result if more than one active record is found. Returns the record
and the Parameter Code in the record as output parameters if one record is found.

Specifications:

Set MatsHclMethodRecord to null.

Set MatsHclParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate MonitorMethodRecordsByHourLocation records where ParameterCode is equal to "HCLRE" or "HCLRH".

If more than one record was located,

return result A

Else if one record was located,

Set MatsHclMethodRecord to the located record.

Set MatsHclParameterCode to MatsHclMeth od Record. P a ra 1 lie t e rC o de.

Results:

Result	Response	Severity

A	You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1

location.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-3

Check Name:	MATS HF: Locate Active Monitor Method

Related Former Checks:

Applicability:

Description:	Locates the active Monitor Method record with Parameter Code equal to 'HFRE' or 'HFRH' and for the current

hour and location. Returns a negative result if more than one active record is found. Returns the record and the
Parameter Code in the record as output parameters if one record is found.

Specifications:

Set MatsHfMethodRecord to null.

Set MatsHfParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate MonitorMethodRecordsByHourLocation records where ParameterCode is equal to "HFRE" or "HFRH".

If more than one record was located,

return result A

Else if one record was located,

Set MatsHfMethodRecord to the located record.

Set MatsHfParameterCode to MatsHfMethodRecord.ParameterCode.

Results:

Result	Response	Severity

A	You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1

location.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-4

Check Name:	MATS S02: Locate Active Monitor Method

Related Former Checks:

Applicability:

Description:	Locates the active Monitor Method record with Parameter Code equal to 'S02RE' or 'S02RH' and for the

current hour and location. Returns a negative result if more than one active record is found. Returns the record
and the Parameter Code in the record as output parameters if one record is found.

Specifications:

Set MatsSo2 Met It otlRecord to null.

Set MatsSo2ParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate MonitorMethodRecordsByHourLocation records where ParameterCode is equal to "S02RE" or "S02RH".

If more than one record was located,

return result A

Else if one record was located,

Set MatsSo2MethodRecord to the located record.

Set MatsSo2ParameterCode to MatsSo2MethodRecord.FammsterCode.

Results:

Result	Response	Severity

A	You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1

location.

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	MATSHOD-5

Check Name:	MATS: Set MATS Expected Flag

Related Former Checks:

Applicability:

Description:	Uses whether MATS Hg Method Code, MATS HC1 Method Code, MATS HF Method Code or MATS S02

Method Code is not null to determine whether MATS is expected.

Specifications:

If MatsHgParameterCode, MatsHclParameterCode, MatsHfParameterCode or MatsSo2 ParameterCode is not null,

Set MatsExpected to true.

Else

Set MatsExpected to false.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	MATSHOD-6

Check Name:	MATS Hg: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Derived Hourly record with Parameter Code equal to 'HGRE' or 'HGRH' and for the current

hour and location. Returns a negative result if more than one active record is found. Returns the record, flags
indicating whether 'HGRE' or 'HGRH' checks are needed, and a flag indicating that Hg Concentration is needed,
if one record is found.

Specifications:

Set MatsHgreDhvChecksNeeded to false.

Set MatsHgrhDhvChecksNeeded to false.

Set MatsHgcNeeded to false.

Set MatsHgDhvRecord to null.

Set MatsHgDhvParameterDescription to "MATS Hg Rate".

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MutsDh vRecordsBy Hour Location where ParameterCode is equal to "HGRE" or
"HGRH".

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHgParameterCode is null, and RecordCount is greater than 0,

return result A.

Else if RecordCount is greater than 1,

return result B.

Else if RecordCount is equal to 1,

Set MatsHgDhvRecord to the located MatsDhvRecordsByHour Location record.
If MatsHgDhvRecord.FammsterCode is equal to MatsHgParameterCode
Set MatsHgcNeeded to true.

if MatsHgDhvRecord.ParameterCode is equal to 'HGRE',

Set MatsHgreDhvChecksNeeded to true,
if MatsHgDhvRecord.ParameterCode is equal to 'HGRH',

Set MatsHgrhDhvChecksNeeded to true.

Else /* DHV and Method parameter code mismatch */
return result C.

Else /* Non Operating Hour */

If RecordCount is greater than 0,
return result D.


-------
Results:

Result	Response	Severity

A	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

B	You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1

hour.

C	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1

the unit did not operate in the hour.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-7

Check Name:	MATS HC1: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Derived Hourly record with Parameter Code equal to 'HCLRE' or 'HCLRH' and for the

current hour and location. Returns a negative result if more than one active record is found. Returns the record,
flags indicating whether 'HCLRE' or 'HCLRH' checks are needed, and a flag indicating that Hg Concentration is
needed, if one record is found.

Specifications:

Set MatsHclreDhvChecksNeeded to false.

Set MatsHclrhDhvChecksNeeded to false.

Set MatsHclcNeeded to false.

Set MatsHclDhvRecord to null.

Set MatsHclDhvParameterDescription to "MATS HC1 Rate".

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsDhvRecordsByHourLocation where ParameterCode is equal to "HCLRE"
or "HCLRH".

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHclParameterCode is null, and RecordCount is greater than 0,

return result A.

Else if RecordCount is greater than 1,

return result B.

Else if RecordCount is equal to 1,

Set MatsHclDhvRecord to the located MatsDhvRecordsByHourLocation record.
If MatsHclDhvRecord.ParameterCode is equal to MatsHclParameterCode
Set MatsHclcNeeded to true.

if MatsHclDhvRecord.ParameterCode is equal to 'HCLRE',

Set MatsHclreDhvChecksNeeded to true,
if MatsHclDhvRecord.ParameterCode is equal to 'HCLRH',

Set MatsHclrhDhvChecksNeeded to true.

Else /* DHV and Method parameter code mismatch */
return result C.

Else /* Non Operating Hour */

If RecordCount is greater than 0,

return result D.


-------
Results:

Result	Response	Severity

A	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

B	You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1

hour.

C	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1

the unit did not operate in the hour.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	MATSHOD-8

Check Name:	MATS HF: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Derived Hourly record with Parameter Code equal to 'HFRE' or 'HFRH' and for the current

hour and location. Returns a negative result if more than one active record is found. Returns the record, flags
indicating whether 'HFRE' or 'HFRH' checks are needed, and a flag indicating that Hg Concentration is needed,
if one record is found.

Specifications:

Set MatsHfreDhvChecksNeeded to false.

Set MatsHfrhDhvChecksNeeded to false.

Set MatsHfcNeeded to false.

Set MatsHfDhvRecord to null.

Set MatsHfDhvParameterDescription to "MATS HF Rate".

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsDhvRecordsByHourLocation where ParameterCode is equal to "HFRE" or
"HFRH".

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHf ParameterCode is null, and RecordCount is greater than 0,

return result A.

Else if RecordCount is greater than 1,

return result B.

Else if RecordCount is equal to 1,

Set MatsHfDhvRecord to the located MatsDhvRecordsByHourLocation record.

If MatsHfDhvRecord. ParameterCode is equal to MatsHf ParameterCode
Set MatsHfcNeeded to true.

if MatsHfDh v Record. P a ra l lie t e rC o de is equal to 'HFRE',

Set MatsHfreDhvChecksNeeded to true,
if MatsHfDh v Record. P a ra l lie t e rC o de is equal to 'HFRH',

Set MatsHfrhDhvChecksNeeded to true.

Else /* DHV and Method parameter code mismatch */
return result C.

Else /* Non Operating Hour */

If RecordCount is greater than 0,
return result D.


-------
Results:

Result	Response	Severity

A	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

B	You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1

hour.

C	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1

the unit did not operate in the hour.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-9

Check Name:	MATS S02: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Derived Hourly record with Parameter Code equal to 'S02RE' or 'S02RH' and for the

current hour and location. Returns a negative result if more than one active record is found. Returns the record,
flags indicating whether 'S02RE' or 'S02RH' checks are needed, and a flag indicating that Hg Concentration is
needed, if one record is found.

Specifications:

Set MatsSo2reDhvChecksNeeded to false.

Set MatsSo2rhDhvChecksNeeded to false.

Set MatsSo2cNeeded to false.

Set MatsSo2DhvRecord to null.

Set MatsSo2DhvParameterDescription to "MATS S02 Rate".

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsDhvRecordsByHourLocation where ParameterCode is equal to "S02RE"
or "S02RH".

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsSo2 ParameterCode is null, and RecordCount is greater than 0,

return result A.

Else if RecordCount is greater than 1,

return result B.

Else if RecordCount is equal to 1,

Set MatsSo2DhvRecord to the located MatsDhvRecordsByHourLocation record.
If MatsSo2DhvRecord.ParameterCode is equal to MatsSo2ParameterCode
Set MatsSo2cNeeded to true.

if MatsSo2DhvRecord.ParameterCode is equal to 'S02RE',

Set MatsSo2reDhvChecksNeeded to true,
if MatsSo2DhvRecord.ParameterCode is equal to 'S02RH',

Set MatsSo2rhDhvChecksNeeded to true.

Else /* DHV and Method parameter code mismatch */
return result C.

Else /* Non Operating Hour */

If RecordCount is greater than 0,
return result D.


-------
Results:

Result	Response	Severity

A	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

B	You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1

hour.

C	MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1

method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1

the unit did not operate in the hour.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-IO

Check Name:	MATS Hg: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Monitor Hourly record with Parameter Code equal to 'HGC' and for the current hour and

location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HGC' checks are needed, if one record is found.

Specifications:

Set MatsHgcMhvChecksNeeded to false.

Set MatsHgcMh vRecord to null.

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsMhvHgcRecordsByHourLocation.

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHgcNeeded is equal to false,

If RecordCount is greater than 0,

return result A.

Else if RecordCount is equal to 0,

return result B.

Else if RecordCount is greater than 1,

return result C.

Else /* RecordCount is equal to 1 */

Set MatsHgcMh v Record to the located MatsMhvHgcRecordsByHour Location record.
Set MatsHgcMhvChecksNeeded to true.

Else /* Non Operating Hour */

If RecordCount is greater than 0,

return result D.

Results:

Result
A

B

C
D

Usage:

1

Response	Severity

You reported a MATS Monitor Hourly Value for [param], but did not report either a Critical Error Level 1

MATS Derived Hourly Value or monitoring method for that pollutant.

You did not report a MATS Hourly Monitor Value record for [param], though reporting Critical Error Level 1
a MATS Derived Hourly Value for the hour.

You reported more than one [param] MATS Monitor Hourly Value for the hour.

You reported a MATS Hourly Monitor Value record for [param] for a non-operating
hour.

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Critical Error Level 1
Critical Error Level 1


-------
Check Code:

MATSHOD-11

Check Name:	MATS HC1: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

Description:	Locates the MATS Monitor Hourly record with Parameter Code equal to 'HCLC' and for the current hour and

location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HCLC' checks are needed, if one record is found.

Specifications:

Set MatsHclcMhvChecksNeeded to false.

Set MatsHclcMh vRecord to null.

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsMhvHclcRecordsByHourLocation.

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHclcNeeded is equal to false,

If RecordCount is greater than 0,

return result A.

Else if RecordCount is equal to 0,

return result B.

Else if RecordCount is greater than 1,

return result C.

Else /* RecordCount is equal to 1 */

Set MatsHclcMh vRecord to the located MatsMhvHclcRecordsByHourLocation record.
Set MatsHclcMhvChecksNeeded to true.

Else /* Non Operating Hour */

If RecordCount is greater than 0,

return result D.

Results:

Result
A

B

C
D

Usage:

1

Response	Severity

You reported a MATS Monitor Hourly Value for [param], but did not report either a Critical Error Level 1

MATS Derived Hourly Value or monitoring method for that pollutant.

You did not report a MATS Hourly Monitor Value record for [param], though reporting Critical Error Level 1
a MATS Derived Hourly Value for the hour.

You reported more than one [param] MATS Monitor Hourly Value for the hour.

You reported a MATS Hourly Monitor Value record for [param] for a non-operating
hour.

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation

Critical Error Level 1
Critical Error Level 1


-------
Check Code:

MATSHOD-12

Check Name:	MATS HF: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

Description:

Specifications:

Set MatsHfcMhvChecksNeeded to false.

Set MatsHfcMh vRecord to null.

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsMhvHfcRecordsByHourLocation where ParameterCode is equal to
"HFC".

If CurrentHourly(ipRecord .0pcrati ngTi me is greater than 0

If MatsHfcNeeded is equal to false,

If RecordCount is greater than 0,

return result A.

Else if RecordCount is equal to 0,

return result B.

Else if RecordCount is greater than 1,

return result C.

Else /* RecordCount is equal to 1 */

Set McitsHfcMh vRecord to the located MatsMhvHfcRecordsByHourLocation record.
Set MatsHfcMhvChecksNeeded to true.

Else /* Non Operating Hour */

If RecordCount is greater than 0,

return result D.

Locates the MATS Monitor Hourly record with Parameter Code equal to 'HFC' and for the current hour and
location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HFC' checks are needed, if one record is found.

Results:

Result
A

B

C
D

Response	Severity

You reported a MATS Monitor Hourly Value for [param], but did not report either a Critical Error Level 1

MATS Derived Hourly Value or monitoring method for that pollutant.

You did not report a MATS Hourly Monitor Value record for [param], though reporting Critical Error Level 1
a MATS Derived Hourly Value for the hour.

You reported more than one [param] MATS Monitor Hourly Value for the hour.	Critical Error Level 1

You reported a MATS Hourly Monitor Value record for [param] for a non-operating Critical Error Level 1
hour.

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:

MATSHOD-13

Check Name:	MATS: Check MATS Load

Related Former Checks:

Applicability:

Description:	Enusres that the MATS Load is reported when the current hour is operating and an active HGRE, HCLRE,

HFRE or S02RE method exists.

Specifications:

If CurrentHourlyOpRecord is not null

IF CurrentHourly()pRecord.Opcrati ngTi me is greater than 0,

IF MatsHgParameterCode is equal to "HGRE", OR MatsHclParameterCode is equal to "HCLRE", OR
MatsHfParameterCode is equal to "HFRE", OR MatsSo2ParameterCode is equal to "S02RE",

IF CurrentHourlyOpRecord.MatsRourLoad is null,

return result A

Else iF CurrentHourlyOpRecord.LoadUmtsOfMeasureCode = "MW" AND
CurrentHourlyOpRecord. MatsHourLoad is less than CurrentHourlyOpRecord .HourLoad

return result D

Else

IF CurrentHourlyOpRecord.MatsHourLoad is not null,
return result B.

Else

IF CurrentHourlyOpRecord.MatsRowLoad is not null,
return result C.

Results:

Result	Response

A	You did not provide a MATSHourLoad record, which is required when you report an

output based emission rate.

B	You provided a MATSHourLoad record which is not required when you report a heat

input based emission rate.

C	You reported a MATSHourLoad record, but this is not appropriate For a non-operating

hour.

D	The reported MATSHourLoad is less than the reported HourLoad value.

Severity

Critical Error Level 1
InFormational Message
Critical Error Level 1
Critical Error Level 1

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	MATSHOD-14

Check Name:	Update Sorbent Trap Operating Date List

Related Former Checks:

Applicability:

Description:	For operating hours, this check inserts the current date into OperatingDateList for the current location's sorbent

traps that are active for the current hour.

Specifications:

If CurrentHourlyOpRecord is NOT null,

For each entry in MatsSorbentTrapListByLocationArray where the array index is CurrentMonitorPlanLocationPosition,

When:

1)	CurrentHourlyOpRecord.OpemtingTims is greater than 0.

2)	CurrentOperatingDate is on or after the date of the entry's SorbentTrapBeginDatehour.

3)	CurrentOperatingDate is on or before the date of the entry's SorbentTrapEndDatehour.

4)	CurrentOperatingDate is not in the entry's OperatingDateList.

Then:

Append CurrentOperatingDate to the entry's OperatingDateList.

Results:

Result	Response	Severity

Usage:
1

Process/Category: Emissions Data Evaluation Report	Operating Hour Evaluation


-------
Check Code:	MATSHOD-15

Check Name:	Initialize Message Plug-ins

Related Former Checks:

Applicability:

Description:	Initializes the plugin parameters.

Specifications:

Set MatsHclDhvParameterDescription to "HCLRE or HCLRH".

Set MatsHclMhv Parameter Description to "HCLC".

Set MatsHfDhvParameterDescription to "HFRE or HFRH".

Set MatsHfMhvParameterDescription to "HFC".

Set MatsHgDhvParameterDescription to "HGRE or HGRH".

Set MatsHgMhvParameterDescription to "HGC".

Set MatsSo2DhvParameterDescription to "S02RE or S02RH".

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report Summary Value Initialization


-------
Check Category:

MATS Sampling Train Checks


-------
Check Code:	MATSTRN-1

Check Name:	Component ID Valid

Related Former Checks:

Applicability:

Description:	Ensure that sampling train component id exists and that the associated component type is "STRAIN".

Specifications:

Set MatsSamplingTrainComponentldValid equal to false.

IF MatsSamplingTrainRecord. Co mpo ncnt ID is null,

Set MatsSamplingTrainProblemComponentExists equal to true.

Return result A.

Else if MatsSamplingTrainRecord.ComponenfTypeCode is not equal to "STRAIN",

Set MatsSamplingTrainProblemComponentExists equal to true.

Return result B.

Else

Set MatsSamplingTrainComponentldValid equal to true.

Add an entry to MatsSamplingTrain Dictionary with a key equal to MatsSampling Train Record. T ra i n ID and the value record
initialized with the following values:

1)	Set HgConcentration equal to null

2)	Set TrainQAStatusCode equal to null

3)	Set ReferenceSFSRRatio equal to null

4)	Set TotalSFSRRatioCount equal to 0

5)	Set DeviatedSFSRRationCount equal to 0

6)	Set SamplingTrainValid equal to true

Add the same entry to MatsSorbentTrapSamplingTrainList.

Results:

Result	Response	Severity

A	For [key], you have not reported a value for [fieldname], which is required.	Critical Error Level 1

B	The [fieldname] in the monitoring plan is [component type]. A [component type]	Critical Error Level 1

[fieldname] is not associated with sorbent trap data.

Usage:
1

Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-2

Check Name:	Sorbent Trap Serial Number

Related Former Checks:

Applicability:

Description:	Check that a sorbent trap serial number is provided.

Specifications:

If the MatsSampling Train Record. S o rb c n t T ra p S n is null,

Return result A.

Results:

Result	Response	Severity

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

Usage:
1

Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:

MATSTRN-3

Check Name:

Related Former Checks:

Train Quality Assurance Status Valid

Applicability:
Description:

Check Sampling Train Quality Assurance Status Matches Lookup Table

Validation Tables:

Train Qa Status Code (Lookup Table)

Specifications:

Set MatsSamplingTrainQaStatusCodeValid to false.

If MatsSampling Train Record. T ra i nQ A S t a t u s C ode is null,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SamplingTrainValid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result A,

Else if MatsSampling Train Record. T ra i nQ A S ta t u s C ode does not match a value in MatsSamplingTrainQaStatusLookupTable,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampWngY rain Valid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result B.

Else

Set MatsSamplingTrainQaStatusCodeValid to true.

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary. TrainQAStatusCode to MatsSampling Train Record. T ra i 11Q A S t a t u s C ode where the key
cq ua 1 s MatsSampling Train Record. T ra i n ID.

Results:

Result

A

B

Response

For [key], you have not reported a value for [fieldname], which is required.
For [key] you reported a [value] which is not valid for [fieldname].

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-4

Check Name:	Main Trap Hg Valid

Related Former Checks:

Applicability:

Description:	Main Trap Hg Null or Reported to Two Decimal Places

Specifications:

Set MatsMainTrapHgValid to false.

IF MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrain Record. IVTa i 11TrapHg is null,

If the MatsSampling Train Record. Q A S t a t u s Code is not "INC", "EXPIRED", or "LOST",

Return result A.

Otherwise

Set MatsMainTrapHgValid to true.

Else,

If the MatsSampling Train Record. Q A S ta t u s Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else, if the MatsSamplingTrain Record MmnYrapHg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),

Return result C.

Otherwise

Set MatsMainTrapHgValid to true.

Results:

Result
A

B

C

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-5

Check Name:	BT Trap Hg Valid
Related Former Checks:

Applicability:

Description:	BT Trap Hg Null or Reported to Two Decimal Places
Specifications:

Set MatsBtTrapHgValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord. BTTrapHg is null,

If the MatsSamplingTrainRecord.QASlalusCodc is not "INC", "EXPIRED", or "LOST",

Return result A.

Otherwise

Set MatsBtTrapHgValid to true.

Else,

If the Mats Sampling Train Record. Q A S t a t u s Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else if the MatsSamplingTrainRecord. BTT rapHg is not reported in scientific notation rounded to three decimal places,
keeping one to the left of the decimal point (x.xx-E-x),

Return result C.

Otherwise

Set MatsBtTrapHgValid to true.

Results:

Result
A

B

C

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-6

Check Name:	Spike Trap Hg Valid

Related Former Checks:

Applicability:

Description:	Spike Trap Hg Null or Reported to Two Decimal Places

Specifications:

Set MatsSpikeTrapHgValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord.SpikcTrapHg is null,

If the MatsSamplingTrainRecord.QAStatasCode is not "INC", "EXPIRED", or "LOST",

Return result A.

Otherwise

Set MatsSpikeTrapHgValid to true.

Else,

If the MatsSampling Train Record. Q A S ta t u s Code is not "PASSED", "FAILED", or "UNCERTAIN",

Return result B.

Else if the MatsSampling Train Record. S p i k eT ra p H g is not reported in scientific notation rounded to three decimal places,
keeping one to the left of the decimal point (x.xx-E-x),

Return result C.

Otherwise

Set MatsSpikeTrapHgValid to true.

Results:

Result
A

B

C

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-7

Check Name:	Spike Reference Value Valid

Related Former Checks:

Applicability:

Description:	Spike Reference Value Null or Reported to Two Decimal Places

Specifications:

Set MatsSpikeReferenceValueValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecorcl.SpikcRcfcrcnccVnhic is null,

If the SamplingTrainData.QAStatasCode is not "INC", "EXPIRED", or "LOST",

Return result A.

Otherwise

Set MatsSpikeReferenceValueValid to true.

Else,

If the MatsSamplingTrainRecord.QAStatus Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else if the MatsSamplingTrain Record.SpikcRcrcrcncc'V'dluc is not reported in scientific notation rounded to three
decimal places, keeping one to the left of the decimal point (x.xx-E-x),

Return result C.

Otherwise

Set MatsSpikeReferenceValueValid to true.

Results:

Result
A

B

C

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:

MATSTRN-8

Check Name:	Total Sample Volume DSCM Valid

Related Former Checks:

Applicability:

Description:	Total Sample Volume DSCM Null or Reported to Two Decimal Places

Specifications:

Set MatsTotalSampleVolumeDSCMValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord.TotalSampleVohimeDSCM is null,

If the SamplingTrainData.QAStatusCode is not "INC", "EXPIRED", or "LOST",
Return result A.

Otherwise

Set Mats TotalSample VolumeDSCM Valid to true.

Else,

If the MatsSamplingTrainRecord.QAStatus Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.

Else if the MatsSampling Train Record. To ta 1S a m p 1 c Vo 1 u mc D S CIVI is less than than two decimal places ,

Return result C.

Otherwise

Set Mats TotalSample VolumeDSCM Valid to true.

Results:

Result
A

B

C

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

For [key], the [fieldname] value must be reported to at least two decimal places.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Process/Category: Emissions Data Evaluation Report ¦

¦ MATS Sampling Train Evaluation


-------
Check Code:

MATSTRN-9

Check Name:

Related Former Checks:

Reference SFSR Ratio Valid

Applicability:

Description:

Specifications:

Reference SFSR Ratio Null or Reported to Two Decimal Places

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord.RcfcrcnccSFSRRatio is null,

If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SamplingTrainValid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result A.

If the MatsSampling Train Record. Q A S t a t u s Code is not "PASSED", "FAILED", or "UNCERTAIN",

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampYmgY rain Valid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result B.

Else if the MatsSampling Train Record. Rc fc rc ncc S F S R Ra t io is not reported to one decimal place,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampYmgY rain Valid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result C.

Else if the MatsHourly (iFMRecord. HourlySFSRRatio is not greater than or equal to 1.0 and less than or equal to 100.0,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SmnpUngT rain Valid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result D.

Else

If MatsSamplingTrainComponentldValid is true,

Set MatsSampling Train Dictionary. Rc fc rc ncc S F S R Ra t i o to
MatsSampling Train Record. Rc fc rc ncc S F S R Ra t i o where the key equals
MatsSamplingTrainRecord. T rainID.

Else,


-------
Results:

Result
A

B

C
D

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value for [key] should be reported to one decimal place.
The [fieldname] value for [key] must be a number between 1 and 100.

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	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-10

Check Name:	Sampling Ratio Check Result Code Valid

Related Former Checks:

Applicability:

Description:	Sampling Ratio Check Result Code Valid

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

IF MatsSamplingTrainRecord.SamplingRatioChsckResultCode is null,

If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",

IF MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SamplingTrainValid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result A.

Else,

If MatsSampUngTrainRecord.SmnpUngRnUoChcckRcsuhCodc is equal to "PASSED",

If MatsSampling Train Record. Q A S ta t u s Code is not equal "PASSED", "FAILED", or "UNCERTAIN",

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrain Dictionary.Sam$\i ngTrai n Val id to false where the key equals
MatsSampling Train Record. T ra i n ID.

Return result B.

Else if MatsSamplingTrainRecord.SamplingRatioCheckResultCode is equal to "FAILED",

If MatsSampling Train Record. Q A S ta t u s Code is not equal "FAILED",

If MatsSamplingTrainComponentldValid is true,

Set Mat.sSamplingTrain Dictionary.Si\mp\i ngT rai n Val id to false where the key equals
MatsSampl ing Train Record. T ra i n ID.

Return result C.

Otherwise

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampYmgY rain Val id to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result D.


-------
Results:

Result
A

B

C
D

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

For [key], you reported that the sampling train SFSR Ratio check FAILED, but did not

also report the train QA Status Code as FAILED.

For [key], the [fieldname] is not reported as PASSED or FAILED..

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	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-11

Check Name:	Post Leak Check Result Code Valid

Related Former Checks:

Applicability:

Description:	Post Leak Check Result Code Valid

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord.FosiLedkChsckResultCode is null,

If the MatsSamplingTrainRecord.QAStatasCode is not "INC", "EXPIRED" or "LOST",

Return result A.

Else

If MatsSamplingTrainRecord.PostLeakCheckResultCode is equal to "PASSED",

If MatsSampling Train Record. Q A S t a t u s Code is not equal to "PASSED", "FAILED", OR "UNCERTAIN",
Return result B.

Else if MatsSamplingTrainRecord.PostLQskCheckResultCode is equal to "FAILED",

If MatsSampling Train Record. Q A S t a t u s Code is not equal to "FAILED",

Return result C.

Otherwise

Return result D.

Results:

Result	Response

A	You did not report a [fieldname] value in the [key] records which is required if the

sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

B	You reported a [fieldname] value in the [key] records which is reported only if the

sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

C	The [fieldname] value of [value] from the [key] records exceeds the PS-12B

breakthrough criteria, but you did not report the train QA Status Code as FAILED.

D	The [fieldname] is not reported as PASSED or FAILED.

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	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-12

Check Name:	Sample Damage Explanation

Related Former Checks:

Applicability:

Description:	Sample Damage Explanation is provided if QA Status Code equals LOST.

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSampling Train Record. S a m p 1 c D a ma gc E \ p 1 a nation is null,

If the MatsSamplingTrainRecord.QAStatus Code is equal to "LOST",

Return result A.

Results:

Result	Response	Severity

A	For [key], you did not report a SampleDamageExplanation which is required if the Critical Error Level 1

sorbent train QA Status Code is LOST.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:

MATSTRN-13

Check Name:

Related Former Checks:

Hg Concentration reported properly

Applicability:

Description:

Specifications:

Hg Concentration is reported properly

Set MatsCalcTrainHgConcentration = null.

If MatsSamplingTrainQaStatusCodeValid is true,

IF MatsSamplingTrainRecord. H gCo nccnt rat io n is null,

If MatsSampling Train Record. T ra i nQ A S t a t u s C ode is not "INC", "EXPIRED", or "LOST",

IF MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SamplingTminValid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result A.

If MatsSampling Train Record. T ra inQ AStat usCodc is not "PASSED", "FAILED", or "UNCERTAIN",

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampYmgY rain Valid to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result B.

Else if MatsSamplingTrainRecord. HgCo ncc lit rat io n is not reported in scientific notation rounded to three decimal places,

keeping one to the left of the decimal point (x.xx-E-x).

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampWngYxamVaWd to false where the key equals
MatsSamplingTrainRecord. T rainID.

Return result C.

Else if Mats Main TrapHg Valid is true AND MatsB TTrapHg Valid is true AND Mats TotalSample VolumeDSCM Valid is

true,

Set MatsCalcTrainHgConcentration = (MatsSamplingTrainRecord. IVTai nTrapHg +

MatsSamplingTrain Record.BTTrapHg) / MatsSamplingTrainRecord.ToVA\Smnp\cVo\umcDSCM. rounded to

three significant figures, using scientific notation (x.xx-E-2).

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.HgConccnlri\Uon to MatsCalcTrainHgConcentration where the key
c q ua 1 s MatsSampling Train Record. T ra i n ID.

If MatsSampling Train Record. H g C o lie c n t ra t i o n is not equal to MatsCalcTrainHgConcentration,

Else,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SampYmgYrai 11 Valid to false where the key equals
MatsSampling Train Record. T ra i 111D.

Return result D


-------
Else // A calculation input is not valid

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary.SamplingTrainValid to false where the key equals
MatsSamplingTrainRecord. T rainlD.

Results:

Result
A

B

C
D

Response

You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
The [fieldname] is inconsistent with the value [value] calculated from the reported [key]
records used in the calculation.

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	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-14

Check Name:	Percent Breakthrough reported properly.

Related Former Checks:

Applicability:

Description:	Percent Breakthrough is reported properly. Includes alternate criteria for RAT As

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord.PerceniBrQskthiough is null,

lftheMatsSamplingTrainRecord.QAStatus Code is "PASSED", "FAILED", or "UNCERTAIN", AND the.
MatsSamplingTrainRecordMgConcentiation is greater than or equal to 0.2,

Return result A.

Else,

If the MatsSampling Train Record. Q A S t a t u s C ode is "LOST", "EXPIRED", or "INC",
Return result B

Else if the MatsSamplingTrainRecord.FerceniBreakthrough is NOT reported to one decimal place.

Return result C

Else if MatsMainTrapHgValid is equal to true, and MatsBtTrapHgValid is equal to true,

Set MatsCalcTrainPercentBreakthrough = (MatsSampling Train Record. B TT ra p H g /

MatsSamplingTrain Record.MmnT rapHg) x 100, rounded to one decimal place.

If MatsSamplingTrain Record.PcrccniBrc'dkihrough is NOT equal to MatsCalcTrainPercentBreakthrough,
Return result D,

Else, if the MatsSamplingTrain Record. HgConccnt rat ion is NOT less than 0.2,

IfTheMatsSamplingTrainRecord.PerceniBrQskthioughis greater than 10%, OR
the MatsSamplingTrainRecord.PercentBreakthrough is greater than 5%, AND the
MatsSamplingTrainRecord.HgConcentration is greater than 0.5,

If MatsSampling Train Record. T ra i nQ A S t a t u s C ode is NOT equal to "FAILED",

Return result E

Results:

Result
A

B

C
D

Response	Severity

For [key], you did not report a [fieldname] value which is required if the sorbent train Critical Error Level 1

QA Status Code is PASSED, FAILED, or UNCERTAIN, and the train Hg

Concentration is not less than 10% of the Hg limit equivalent concentration or less than

or equal to 0.1 ug/dscm if performing a RATA.

For [key], you reported a [fieldname] value which is not reported if the sorbent train QA Critical Error Level 1
Status Code is LOST, EXPIRED, or INC.

The [fieldname] value for [key] should be reported to one decimal place.

The [fieldname] is inconsistent with the value [value] calculated from the reported [key]
records used in the calculation.

The [fieldname] value of [value] from the [key] records exceeds the PS-12B
breakthrough criteria, but you did not report the train QA Status Code as FAILED.

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1


-------
Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation


-------
Check Code:	MATSTRN-15

Check Name:	Percent Spike Recovery reported properly

Related Former Checks:

Applicability:

Description:	Percent Spike Recovery reported properly

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSampling Train Record. PcrccntSpikcRccovery is null,

If the MatsSamplingTrainRecord.Q ASlalus Code is not "INC", "EXPIRED", or "LOST",

Return result A.

Else

If the MatsSamplingTrainRecord.Q ASVMus Code is not "PASSED", "FAILED", or "UNCERTAIN",

Return result B.

Else if the MatsSamplingTrainRecord.PercentSpikeRecovery is not reported to one decimal place,

Return result C.

Else if MatsSpikeTrapHgValid is equal to true, AND MatsSpikeReferenceValueValid, is equal to true,

Set MatsCalcTrainPercentSpikeRecovery = MatsSampIing Train Record. S p i k c T ra p H g /

MatsSampllng Train Record. S p ike Re fc re nee Va 1 lie) x 100, rounded to one decimal place.

If MatsSampI ing Train Record. PcrccntSpikcRccovery is not equal to MatsCalcTrainPercentSpikeRecovery,

Return result D.

Else if the MatsSamplingTrainRecord. PcrccnlSplkcRccovct} is less than 75% or greater than 125%
If MatsSampling Train Record. T ra i nQ A S t a t u s C ode is not equal to "FAILED",

Return result E

Results:

Result	Response

A	You did not report a [fieldname] value in the [key] records which is required if the

sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

B	You reported a [fieldname] value in the [key] records which is reported only if the

sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.

C	The [fieldname] value for [key] should be reported to one decimal place.

D	The [fieldname] is inconsistent with the value [value] calculated from the reported [key]

records used in the calculation.

E	The [fieldname] value of [value] from the [key] records exceeds the PS-12B

breakthrough criteria, but you did not report the train QA Status Code as FAILED.

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Seventy

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1


-------
Check Code:

MATSTRN-16

Check Name:

Related Former Checks:

Check Hourly Sampling Ratios

Applicability:
Description:

Compare Hourly Sampling Ratio with PS12B Requirement

Specifications:

If MatsSamplingTrain Dictionary contains the key MatsSamplingTrainRecord.Trai n ID.

Set SamplingTrainValid to MatsSamplingTrain Dictionary.Samp 1 ingTrainVa 1 id where the key equals
MatsSamplingTrainRecord. T rainID.

Else

Set SamplingTrainValid to false.

If SamplingTrainValid is true,

Set TotalSFSRRatioCount to MatsSamplingTrain Dictionary.ToVa\SFSRR'M\oCoui\1 where the key equals
MatsSamplingTrainRecord. T rainID.

Set DeviatedSFSRRatioCount to MatsSamplingTrain Dictionary.Dcv'vMcdSFSRRaUoCounl where the key equals
MatsSamplingTrainRecord. T rainID.

If TotalSFSRRatioCount is greater than or equal to 100,

Set MatsCalcPercentSFSRRatioDev to DeviatedSFSRRatioCount I TotalSFSRRatioCount x 100, rounded to an integer.

If the MatsSamplingTrainRecord.SamplingRatioChsckResultCode is equal to "PASSED"

If the MatsCalcPercentSFSRRatioDev is greater than 5,

Return result A.

Else if the MatsSamplingTrain Record.SmnpWngRaUoChcckRcsullCodc is equal to "FAILED",

If the MatsCalcPercentSFSRRatioDev is less than or equal to 5
Return result B.

Else // TotalSFSRRatioCount is less than 100

If the MatsSamplingTrainRecord.SamplingRatioChsckResultCode is equal to "PASSED"

If the DeviatedSFSRRatioCount is greater than 5,

Return result C.

If the MatsSamplingTrain Record.Si\mp\ingR'MioC\\cckRcsu\lCodc is equal to "FAILED",

If the DeviatedSFSRRatioCount is less than or equal to 5,

If MatsSorbentTrapDictionary entry for MatsSamplingTrainRecord Trapld exists with
SorbentTrapForQuarterBorder equal to false,

Return result D.


-------
Results:

Result
A

B

C

D

Response	Severity

For [key], you reported that the SFSR Ratio Check PASSED, but more than five percent Critical Error Level 1

of hourly SFSR Ratios deviated from the reference ratio by more than 25 percent.

For [key], you reported that SFSR Ratio Check FAILED, but not more than five percent Critical Error Level 1
of hourly SFSR Ratios deviated from the reference ratio by more than 25 percent.

For [key], you reported that the SFSR Ratio Check PASSED, but more than five hourly
SFSR Ratios deviated from the reference ratio by more than 25 percent.

For [key], you reported that the SFSR Ratio Check FAILED, but not more than five
hourly SFSR Ratios deviated from the reference ratio by more than 25 percent.

Critical Error Level 1

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sampling Train Last Hour Evaluation


-------
Check Category:
MATS Sorbent Trap Data


-------
Check Code:	MATSTRP-1

Check Name:	Begin Date Valid

Related Former Checks:

Applicability:

Description:	This check determines if the sorbent trap data begin date is valid.

Specifications:

Set MatsSorbentTrapBeginDateValid equal to false.

If the MatsSorbent TrapRecoril. Bcgi nDa tc is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else

Set MatsSorbentTrapBeginDateValid equal to true.

Results:

Result	Response	Severity

A	For [key], a value for [fieldname] is required.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation


-------
Check Code:

MATSTRP-2

Check Name:

Related Former Checks:

Begin Hour Valid

Applicability:
Description:

This check determines if the sorbent trap data begin hour is valid

Specifications:

Set MatsSorbentTrapBeginDateHourValid equal to false.

If MatsSorbentTrapBeginDate Valid,

If the MatsSorbentTrapRecord. Begi nHour is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else, if the MatsSorbentTrapRecord. BeginHour is less than 0 or greater than 23,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result B.

Else

MatsSorbentTrapBeginDateHourValid equal to true.

Results:

Result

A

B

Response

For [key], a value for [fieldname] is required.

For [key], you have reported a Begin Hour not between 0 and 23.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation


-------
Check Code:	MATSTRP-3

Check Name:	End Date Valid

Related Former Checks:

Applicability:

Description:	This check determines if the sorbent trap data end date and hour is valid

Specifications:

Set MatsSorbentTrapEndDateValid equal to false.

If the MutsSorbent TrapRecord. E ndDatc is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else

Set MatsSorbentTrapEndDateValid equal to true.

Results:

Result	Response

A	For [key], a value for [fieldname] is required.

Usage:

1	Process/Category: Emissions Data Evaluation Report

Severity

Critical Error Level 1

— MATS Sorbent Trap Hour and Range Evaluation


-------
Check Code:	MATSTRP-4

Check Name:	End Hour Valid

Related Former Checks:

Applicability:

Description:	This check determines if the sorbent trap data end hour is valid

Specifications:

Set MatsSorbentTrapEndDateHourValid equal to false.

If the MatsSorbentTrapRecord.EndHour is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else, if the MatsSorbentTrapRecord.EndHour is less than 0 or greater than 23,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result B.

Else

Set MatsSorbentTrapEndDateHourValid equal to true.

Results:

Result	Response	Severity

A	For [key], a value for [fieldname] is required.	Critical Error Level 1

B	For [key], you have reported an End Hour that is not between 0 and 23.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation


-------
Check Code:	MATSTRP-5

Check Name:	Begin and End Times Consistent

Related Former Checks:

Applicability:

Description:	Check that the Sorbent Trap end date and time occurs after the begin date and time.

Specifications:

Set MatsSorbentTrapDatesAndHoursConsistent to false.

If MatsSorbentTrapBeginDateHourValid is true AND MatsSorbentTrapEndDateHourValid is true,

If the the MatsSorbent Trap Record. B eg i n Da tc H o u r is after the MatsSorbentTrapRecord.EndDateHour,

Set MatsSorbentTrapEvaluationNeeded to false.

Return result A.

Else

Set MatsSorbentTrapDatesAndHoursConsistent to true.

Results:

Result	Response	Severity

A	For [key], the BeginDate/Hour is inconsistent with the EndDate/Hour.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation


-------
Check Code:	MATSTRP-6

Check Name:	Check For Overlap With Another Sorbent Trap

Related Former Checks:

Applicability:

Description:	Check for overlap with the last Sorbent Trap from the previous emission report or with another Sorbent Trap

reported in the current emission report.

Specifications:

Locate MatsSorbentTrapRecords where:

1)	Systemld equalsMatsSorbentTrapRecord.Systemld

2)	Trapld does not equal MutsSorbentTrapRecord.Trap Id

3)	BeginDateHour is before MatsSorbentTrapRecord.EndDateRow

4)	EndDateHour is after MutsSorbentTrapRecord. BeginDateHour

If found,

Set MatsSorbentTrapEvaluationNeeded to false.

Return result A.

Results:

Result	Response	Severity

A	For [key], you reported sorbent traps with overlapping sampling periods.	Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap Overlap Evaluation


-------
Check Code:	MATSTRP-7

Check Name:	Initialize MATS Sorbent Trap Parameters

Related Former Checks:

Applicability:

Description:	Initialize MATS Sampling Train Data

Specifications:

Set MatsSorbentTrapValidExiststo false.

Set MatsSorbentTrapSamplingTrainList to null.

Set MatsSamplingTrainProblemComponentExists to false.

For MatsSorbentTrapRecord:

If MatsSorbentTrapRecord.EndDateHour is after CurrentReportingPeriodEndHour,

Set SorbentTrapForQuarterBorder to true.

Else

Set SorbentTrapForQuarterBorder to false.

Set SorbentTrapInformation record with:

1)	SorbentTrapValidExists set to true.

2)	SorbentTrapForQuarterBorder set to SorbentTrapForQuarterBorder.

3)	SorbentTrapId set to MatsSorbentTrapRecord. T rap I d

3)	SorbentTrapBeginDateHour set to MatsSorbentTrapRecord.BeginDateHour

4)	SorbentTrapEndDateHour set to MatsSorbentTrapRecord.EndDalcHour

5)	SorventTrapModcCd set to MatsSorbentTrapRecord.ModcCd

6)	SamplingTrainProblemComponentExists set to false.

7)	SamplingTrainList with a record containing the following fields:

a)	HgConcentration as a decimal

b)	TrainQAStatusCode as a string

c)	ReferenceSFSRRatio as an integer

d)	TotalSFSRRatioCount as an integer

e)	DeviatedSFSRRatioCount as an integer

f)	SamplingTrainValid as a boolean

8)	OperatingDateList set to an empty list of dates.

Set MatsSorbentTrapDictionary to SorbentTrapInformation, where the Trapld key is equal MatsSorbentTrapRecord.Trapld.
Append SorbentTrapInformation to MatsSorbentTrapListByLocationArray element for CurrentMonitorPlanLocationPosition.

Set MatsSorbentTrapValidExists to MatsSorbentTrapDictionary.SorbcnlTrapV'dlidExisls where MatsSorbentTrapDictionary key
is equal to MatsSorbentTrapRecord J rapid.

Set MatsSorbentTrapSamplingTrainList to MatsSorbentTrapDictionary.Samp\ingTrainList where MatsSorbentTrapDictionary
key is equal to MatsSorbentTrapRecord Trapld.

Set MatsSamplingTrainProblemComponentExists to M«?.s;SV>/*/)6'rt?7/Y//>/)icftVwc//*j.SampliiigTraiiiProblcmCompoiiciitE\ists where
MatsSorbentTrapDictionary key is equal to MatsSorbentTrapRecord.Trapld.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap First Hour Initialization


-------
Check Code:	MATSTRP-8

Check Name:	Monitoring System Check

Related Former Checks:

Applicability:

Description:	Ensure that Monitoring System exists for Monitoring System ID, and that the Monitoring System type is "ST".
Specifications:

If the MatsSorbentTrapRecord. Mo n i to ri ng Sy stc m ID is null,

Set MatsSorbentTrapValidExiststo false.

Return result A.

Else, if the MatsSorbentTrapRecord. Sy stc mTy pcCodc of the associated system is not equal to "ST",

Set MatsSorbentTrapValidExists to false.

Return result B.

Results:

Result	Response	Severity

A	For [key], you have not reported a value for [fieldname], which is required.	Critical Error Level 1

B	The SystemTypeCode in the monitoring plan is [system type]. This type of system does Critical Error Level 1

not report sorbent trap data.

Usage:

1

Process/Category:

Emissions Data Evaluation Report

MATS Sorbent Trap Evaluation


-------
Check Code:

MATSTRP-9

Check Name:

Related Former Checks:

Number and Validity of Sampling Trains

Applicability:
Description:

Check that two Sorbent Train Data Records are provided for each Sorbent Trap Data Record.

Specifications:

Set MatsSamplingTrainsValid to false,

If MatsSamplingTrainProblemComponentExists is false,

If number of entries in MatsSorbentTrapSamplingTrainList is not equal to 2,

Set MatsSorbentTrapValidExiststo false.

Return result A.

Else if MatsSorbentTrapSamplingTrainList. SamplingTrainValid for one or both sampling train components is false,
Set MatsSorbentTrapValidExists to false.

Else

Set MatsSamplingTrainsValid to true

Results:

Result
A

Response

For [key], you did not report two sets of sorbent train records for the sorbent trap.

Severity

Critical Error Level 1

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation


-------
Check Code:

MATSTRP-10

Check Name:

Related Former Checks:

Sorbent Trap MODC Code is Valid

Applicability:
Description:

Check Sorbent Trap MODC Code Valid

Specifications:

Set MatsSorbentTrapMODCCodeValid to false

If MatsSorbentTrapRecord.MODCCode is not equal to "01", "02", "32", "33", "34" or "35",

Set MatsSorbentTrapValidExiststo false.

Return result A.

Else if MatsSamplingTrainsValid,

If MatsSorbentTrapRecord.MODCCode is equal to "01" or "02",

If MatsSorbentTrapSamplingTrain/.ist.TrainQ AStatusCode for both sampling train components are equal to "PASSED",

Set MatsSorbentTrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result B

Else if MatsSorbentTrapRecord.MODCCode is equal to "32",

If MatsSorb en t TrapSampling Train /. ist. T ra i nQ A S t a t u s C o dc are equal to "PASSED" for one sampling train component,
AND "FAILED" or "LOST" for the other,

Set MatsSorbentTrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result C

Else if the MatsSorbentTrapRecord.MODCCode is equal to "33",

If MatsSorb en t TrapSampling Train I. ist. T ra i nQ A S t a t u s C ode for both sampling train components are equal to
"UNCERTAIN",

Set MatsSorbentTrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result D

Else if the MatsSorbentTrapRecord.MODCCode is equal to "34",

If MatsSorb en t TrapSampling Train /. ist. T ra i nQ A S t a t u s C ode for both sampling train components are equal to "FAILED",

Set MatsSorbentTrapMODCCodeValid equal to true.

Else If MatsSorb en t TrapSampling Train /. ist. T ra i nQ A S t a t u s C o dc for both sampling train components are equal to
"UNCERTAIN",

Set MatsSorbentTrapMODCCodeValid equal to true.


-------
Else if MatsSorbentTrapSamplingTrainList.TrainQAStatusCode for one or both sampling train components is equal to
"LOST", "EXPIRED" or "INC",

Set MatsSorbentTrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExiststo false.

Return result E

Else if the MatsSorbent TrapRecord MOD CCode is equal to "35",

Set MatsSorbentTrapMODCCodeValid equal to true.

Results:

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

INC.

Result	Response

A	For [key] you reported a [value] which is not valid for [fieldname].

B	For [key], you reported a [fieldname] of [value] which is valid if the QA Status Codes of

both trains is PASSED.

C	For [key], you reported a [fieldname] of [value] which is valid if the QA Status Code of

one train is PASSED and the other FAILED.

D	For [key] you reported a [fieldname] of [value] which is valid if the QA Status Code of

both trains is UNCERTAIN.

E	For [key], you reported a [fieldname] of [value] which is valid if the QA Status Code of

both trains is FAILED or UNCERTAIN, or one or both trains is LOST, EXPIRED, or

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation


-------
Check Code:

MATSTRP-11

Check Name:

Related Former Checks:

Paired Trap Agreement Validation and Re-calculation

Applicability:

Description:

Specifications:

Determine if the Paired Trap Agreement is Valid.

Set MatsSorbentTrapPairedTrapAgreementValid to false.
Set MatsCalcTrapAbsoluteDifference = null.
Set MatsCalcTrapPercentDifference = null.

If the MatsSorbentTrapMODCCodeValid is equal to true,

If MatsSorbentTrapRecord.FmredTmpAgreement is null,

If MatsSorbentTrapRecord.MOBCCode is not "32", "34", or "35",

Set MatsSorbentTrapValidExiststo false.

Return result A.

Else if Mc/?.svVw/)6'rt?7>c//>/?6'cwY/. Absolute Difference Indicator is not null,

Set MatsSorbentTrapValidExists to false.

Return result B.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true

If MatsSorbentTrapRecord MODCCode is not "01", "02", or "33",

Set MatsSorbentTrapValidExists to false.

Return result C.

Else if MatsSorbentTrapRecord.PairQdTrwpAgrQQment is not rounded to two decimal places

Set MatsSorbentTrapValidExists to false.

Return result D.

Else if MatsSorbentTrapRecord. AbsoluteDifferencelndicator is equal to 0, OR
MatsSorbentTrapRecord. Abso lute D i ffc re nee I ndicato r is equal to 1,

Set MatsCalcTrapAbsoluteDifference = the absolute value of the difference between the
MatsSorbentTrapSamplingTrainList.HgConcentiation for each train.

Set MatsCalcTrapPercentDifference = 100 * MatsCalcTrapAbsoluteDifference divided by the sum of the

MatsSorb en t TrapSampling Train /. ist. H g C o nc c n t ra t i o n for each train.

Round MatsCalcTrapAbsoluteDifference to 2 decimal places.

Round MatsCalcTrapPercentDifference to 2 decimal place.

If MatsSorbentTrapRecord. AbsoluteDifferencelndicator is equal to 0,

If MatsSorbentTrapRecord.PmrcdT rap Agreement does not equal MatsCalcTrapPercentDifference,

Set MatsSorbentTrapValidExists to false.

Return result G.

Else if MatsSorbentTrapRecord.PmrcdT rap Agreement is less than or equal to 10,

Else


-------
If MatsSorbentTrapRecord.MODCCode is not equal to "01" OR "02",

Set MatsSorbentTrapValidExists to false.

Return result H.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.

Else if MatsSorbentTrapRecord.PmrcdT rap Agreement is less than or equal to 20, and the
MatsSorbentTrapRecord. HgSystcmConccntration is less than or equal to 1.0,

If MatsSorbentTrapRecord MODCCode is not equal to "01" OR "02",
Set MatsSorbentTrapValidExists to false.

Return result I.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.

Else

If MatsSorbentTrapRecord.MODCCode is not equal to "33",

Set MatsSorbentTrapValidExists to false.

Return result J.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.

Else // AbsoluteDifferencelndicator is equal to 1

If MatsSorbentTrapRecord.PmrcdT rap Agreement is less than or equal to 0.03,

If MatsSorbentTrapRecord.PmrcdTmpAgrccmcnl does not equal
MatsCalc TrapAbsoluteDifferen ce.

Set MatsSorbentTrapValidExists to false.

Return result E.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result F.

Else // AbsoluteDifferencelndicator is null (not 0 or 1)

Set MatsSorbentTrapValidExists to false.

Return result K.


-------
Results:

Result
A

B
C

D

E

G

H

I

J

K

Response

For [key], you did not report a [fieldname] value which is required if the sorbent trap
system MODC Code is [value].

For [key], you reported a [fieldname2], but did not report a [fieldname].

For [key], you reported a [fieldname] value which is not reported if the sorbent trap

system MODC Code is [value].

The [fieldname] value for [key] should be reported to two decimal places.

The [fieldname] is inconsistent with the value [value 1] calculated from the reported

[key] records used in the calculation.

For [key], you reported an Absolute Difference Indicator of 1 that can only be used if
the absolute difference between the Hg concentrations of the paired traps is less than or
equal to 0.03 ug/m3.

The [fieldname] is inconsistent with the value [value2] calculated from the reported
[key] records used in the calculation.

For [key], you reported a passing Paired Trap Agreement that is not consistent with an
MODC Code other than 01 or 02.

For [key], you reported a passing Paired Trap Agreement that is not consistent with an
MODC Code other than 01 or 02.

For [key], you reported a failed Paired Trap Agreement that is not consistent with an
MODC Code other than 33.

For [key], you did not report a [fieldname2] value which is required if the sorbent trap
system MODC Code is [value].

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

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation


-------
Check Code:

MATSTRP-12

Check Name:

Related Former Checks:

Hg System Concentration Validation and Re-calculation

Applicability:

Description:

Specifications:

Determine if the Hg System Concentration is Valid.

Set MatsCalcHgSystemConcentration equal to null.

If the MatsSorbentTrapPairedTrapAgreementValid is equal to true,

If the MatsSorbentTrapRecord.HgSystemConcentration is null,

If the MatsSorbentTrapRecord MODCCode is not "34" or "35",

Set MatsSorbentTrapValidExiststo false.
Return result A.

Else

If theMatsSorbentTrapRecord.MOBCCode is not "01", "02", "32", or "33",

Set MatsSorbentTrapValidExists to false.

Return result B.

Else if the MatsSorbentTrapRecord.HgSxsicmConccnimtion is not reported in scientific notation rounded to three
significant figures, keeping one to the left of the decimal point (x.xx-E-x).

Set MatsSorbentTrapValidExists to false.

Return result C.

If MatsSorbentTrapRecord MODCCode is equal to "32",

Set HgConcentrationCalculation = multiply 1.111 times the
MatsSorbentTrapSamplingTrain/.ist, HgCo liec lit ratio n entry where
MatsSorbentTrapSamplingTrainlJst.TrmnQASVMusCodc is equal to "PASSED".

Else if MatsSorbentTrapDataRecord.MODCCode is equal to "33",

Set HgConcentrationCalculation = the higher of the

MatsSorb en t TrapSampling Train /. ist. H g C o lie c n t ra t i o n entries for the sampling train components.

Else //MODC "01" or "02"

Set HgConcentrationCalculation = the sum of the MatsSorbentTrapSamplingTrainIJst.HgConccnln\Uon
for each train divided by two.

Set MatsCalcHgSystemConcentration to HgConcentrationCalculation in scientific notation with three significant
digits, keeping one to the left of the dicmal point (x.xxEx).

If MatsSorbentTrapRecord.HgSyslcmConccnlmUon does not equal MatsCalcHgSystemConcentration,

Set MatsSorbentTrapValidExists to false.

Return result D.

Else


-------
Results:

Result
A

B

C

D

Response

For [key], you did not report a [fieldname] value which is required if the sorbent trap
system MODC Code is [value].

For [key], you reported a [fieldname] value which is not reported if the sorbent trap
system MODC Code is [value].

The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
The [fieldname] is inconsistent with the value [value 1] calculated from the reported
[key] records used in the calculation.

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	MATS Sorbent Trap Evaluation


-------
Check Code:

MATSTRP-13

Check Name:

Update Sorbent Trap Parameters

Related Former Checks:

Applicability:

Description:

Specifications:

For SorbentTrapDictionary entry where the key is equal to MatsSorbentTrap Record.TrapId. set:

1)	SorbentTrapValidExists set to MatsSorbentTrapValidExists.

2)	SamplingTrainProblemComponentExists set to MatsSamplingTrainProblemComponentExists.

Results:

Result

Response

Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation


-------
Check Code:	MATSTRP-14

Check Name:	Number of Unit Operating Days

Related Former Checks:

Applicability:

Description:	Check the Number of Unit Operating Days During Sampling Period.
Specifications:

If MatsSorbentTrapRecord.ModcCode is NOT equal to "34",

If MatsSorbentTrapDictionaryOpemtingDateList where MatsSorbentTrapDictionary key is equal to
MiitsSorhentTrapRecoril. Trap Id contains more than 14 dates,

Return result A.

Results:

Result	Response	Severity

A	You reported a sorbent trap sampling period longer than the maximum 14 operating Critical Error Level 1

days.

Usage:
1

Process/Category:

Emissions Data Evaluation Report

MATS Sorbent Trap Last Hour Evaluation


-------
Check Category:

RATA Status


-------
Check Code:	RATSTAT-1

Check Name:	Check Low Sulfur and FLOW Exemptions

Related Former Checks:

Applicability:	CEM Check

Description:	This check determines if an S02 system is exempt for RATA Status purposes or determines the maximum

number of levels applicable to a FLOW system for determination of RATA Status.

Specifications:

Set CurrentRATAStatus = null.

Set OverrideRATABAF = null.

Set MaxLevelCount = null.

Set FlowRATAExemption = false.

if (O a Statu sSystem Typ eCode begins with "S02")

Locate a record in TestExtensionExemptionRecords for the location where the SystemID is equal to the QaStatusSystemld, the
reporting period is the Current Reporting Period, AND the ExtensionExemptionCode is equal to "LOWSYTD"

if {TestExtensionExemptionRecords is found)

Set CurrentRATAStatus = "IC-Exempt"

else

Locate a record in MonitorQualificationRecordsByHour for the hour and where MonitoringLocationld =
CurrentMonitorLocationld

and the QualificationTypeCode is equal to "LOWSULF".
if {MonitorQualificationRecordsByHour is found)

Set CurrentRATAStatus = "IC-Exempt".
else if {QaStatusSystemTypeCode = "FLOW")

Set PeakingBypass = false,
if {CurrentEntityType is equal to "CS" or "MS")

Locate the record in LocationAttributeRecordsByHourLocation for the hour and location,
if (LocationAttributeRecords. By pass I nd == 1)

Set PeakingBypass = true.

else

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".

if {MonitorQualificationRecordsByHour is NOT found)

Set PeakingBypass = false.

Exit for.


-------
else if (CurrentUnitisPeaking)

Set PeakingBypass = true,
if (PeakingBypass)

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where the MonitoringLocationld =
CurrentMonitorLocationld and QualificationTypeCode is equal to "PRATA1"

if (MonitorQualificationRecordsByHour is found)

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld =
CurrentMonitorLocationld and the QualificationTypeCode is equal to "PRATA2"

if (MonitorQualificationRecordsByHour is found)

Set MaxLevelCount = 2.

else

Set MaxLevelCount = 3.

Append QaStatusSystemld to FLOWSystemIDArray for the location.

Locate a record in TestExtensionExemptionRecords for the location where the SystemID is equal to the QaStatusSystemld, the
ComponentID is equal to the the QaStatusComponentld 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

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	

	Hg RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation


-------
Check Code:	RATSTAT-2

Check Name:	Locate Most Recent Prior RATA Test

Related Former Checks:

Applicability:	CEM Check

Description:	Determines if there is an applicable prior RATA test.

Specifications:

Set PriorRA TA Record = 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
QaStatusComponentld.

For each record found,

Append MonitorSystemComponentRecordsforHourandLocation.Syslcm\D to the ApplicableSystemlDList.

else

Append QaStatusSystemld 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 CurrentDateHour

if (RATATestRecordsByLocationForQAStatus is found)

Set Prior RA TA Record = the found record in RATATestRecordsByLocationForQAStatus.

if (CurrentRATAStatus 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 CurrentDateHour and the EndDate/Hour is greater than the
PriorRAEndDate/Hour 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 CurrentDateHour

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

Results:

Result

Response

Severity


-------
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:

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/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation


-------
Check Code:

RATSTAT-3

Check Name:

Locate Most Recent Prior Event

Related Former Checks:

Applicability:
Description:

CEM Check

Determines if there is an applicable prior event.

Specifications:

Set Prior RA TA E vent Record = null.

If (CurrentRATAStatus is null)

Locate the most recent record in QACertificationEventRecords where the SystemID is in the ApplieableSystemlDList and
RATARequired is equal to "Y" and the QACertEventDate is either:

a)	prior to the CurrentDateHour OR

b)	equal to both the CurrentDateHour and the ConditionalBeginDate/Hour;

AND either:

a)	PriorRA TA Record is null OR

b)	QACertEventDate/Hour is after the PriorRA TA Record. E ndDa tc/H o u r OR

c)	QACertEventDate/Hour is equal to the Prior RA TA Record. EndDatc/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the PriorRA 7>1/?6'cwy/. 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 CurrentDateHour
AND either:

a)	QaStatusSystemTypeCode NOT is set (HCL, HF, HG, ST) OR

b)	QACertEventCode is in set (101, 110, 125, 130)

if {QACertificationEventRecords is found)

Set Prior RA TA E ventRecord = the found record in QACertificationEventRecords.

if (Prior RA TAE ventRecord is null)

if (PriorRA TA Record is null)

Set CurrentRATAStatus = "OOC-No Prior Test or Event"

if (CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF = 1.0

else if (InvalidRATARecord is not null AND PriorRATAEventRecord.QACertEventDate/Hour is after
InvalidRA TA Record. EndDatc/Hour)

Locate the earliest record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal to
the QaStatusSystemld and the EndDate/Hour is after the PriorRA TA EventRecord. Q A Cc rt E vc n t Da tc/H o u r and the
EndDate/Hour is prior to CurrentDateHour and the TestResult is equal to "INVALID"

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

else


-------
Set InvalidRA TARecord = 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

8

Process/Category:

Emissions Data Evaluation Report

Severity

C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation


-------
Check Code:	RATSTAT-4

Check Name:	Check RATA Result

Related Former Checks:

Applicability:	CEM Check

Description:	Checks the result of the prior Rata test.

Specifications:

if (CurrentRATAStatus is null and Prior RA TA Record is not null and Prior RATAEventRecord is null)

Set EvaluateMultiLevelRATA = true.

if (PriwrRA 7>l/?6'cwY/.QANccdsE\ aluationFlag = "Y")

Set CurrentRATAStatus = "Prior Test Not Yet Evaluated".

else if (Prior RA TA Record. Tc s t R c s u 11C o dc = null or Prior RA TARecord.T cstRcsultCodc = "FAILED" or
Prior RA TA Record. Tc s t R c s u 11C o dc = "ABORTED")

Locate the most recent record in QACertificationEventRecords where the SystemID is in the ApplieableSystemlDList and
RATARequired is equal to "Y" and the ConditionalBeginDate/Hour is:

a)	on or prior to the CurrentDateHour AND

b)	on or after the Prior RA 7/4/?ec««/. EndDatc/Hour: AND

c)	Annual Reporting Requirement is equal to true OR QACertEventDate/Hour is on or after April 1 of the year of the
CurrentDateHour.

if (QACertificationEventRecords is found)

Set Prior RAT AEventRecord = found record in QACertificationEventRecords.

elseif (Prior RA TARecord.T cstRcsultCodc = null)

Set CurrentRATAStatus = "OOC-Prior Test Has Critical Errors".

if (CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = PriorRA 7>l/?6'cwY/.0\cral IB ias Adjustment Factor.

elseif (PriorRA TA Record. Tc s t R c s u 11C o dc = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Test Failed".

if (CurrentMh vParameter == "FLOW")

Set OverrideRATABAF = PriorRA 7M/?ectf/Y/.Ovcral IB ias Adjustment Factor.

elseif (PriorRA TA Record. Tc s t R c s u 11C o dc = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Test Aborted".

if (CurrentMh vParameter == "FLOW")

Set OverrideRATABAF =	7M/?ectf/Y/.Ovcral IB ias Adjustment Factor.

Results:

Result

Response

Severity


-------
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:

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/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation


-------
Check Code:

RATSTAT-5

Check Name:

Related Former Checks:

Determine Event Conditional Status

Applicability:

Description:

Specifications:

CEM Check

If a QA Cert Event was found that affects this MHV record, evaluate the conditional status.

Set SubsequentRATARecord = null.

Set RATAMissingOpDatalnfo = null.

Set RA TA Event Operating Level Count = null.

if (CurrentRATAStatus is null and PriorRA TAEventRecord is not null)

if (Prior RA 7M£Vewf/?ectf/Y/.ConditionalDataBcginDatc/Hour is null or CurrentDateHour is prior to the
/3/w/*/?/17>l£'v'6'rt?/?6'cwY/. Conditional DataBeginDatc/Hour)

Set CurrentRATAStatus = "OOC-Event".
Set OverrideRATABAF = 1.0.

else

Locate the earliest record in RATATestRecordsByLocationForQAStatus where the SystemID is equal to the

PriorRA TAEventRecord. Sy stcmID, the TestResult is not equal to "INVALID" and the EndDate/Hour is on or after the

Prior RA TAEventRecord. ConditionalDataBeginDate/Hour.

if (RATATestRecordsByLocationForQAStatus is found)

Set SubsequentRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

if (RATATestRecordsByLocationForQAStatus.QANeedsEvaluationFlag = "Y")

Set CurrentRATAStatus = "Recertification Test Not Yet Evaluated".

else if (RATATestRecordsByLocationForQAStatus.TestResultCode is null)

Set CurrentRATAStatus = "OOC-Recertification Test Has Critical Errors".

if (CurrentMh vParameter == "FLOW")

Set OverrideRATABAF = SuhsequentRA7/4/?6'ewl/?6'cwY/.0\ crallBiasAdjustnicntFactor.

else if (RA TA TestRecordsRy Location ForOAStatus.7cs[Rcsu\[Codc = "ABORTED")

Set CurrentRATAStatus = "OOC-Recertification Test Aborted".

if (CurrentMh vParameter == "FLOW")

Set OverrideRATABAF = SuhsequentRA7>l/?6'cwY/.0\ crallBiasAdjustnicntFactor.

else

if (PriorRA TA Record is null)

RequiredLevelCount = MaxLevelCount

else (if PriorRA TAEventRecord.RAT A3 Required is equal to "Y")


-------
RequiredLevelCount = 3

else (if PriorRA TAEventRecord .RATA2Rcquircd is equal to "Y")

RequiredLevelCount = 2

else

RequiredLevelCount = 1

If (number of levels inRATATestRecordsByLocationForQAStatus.OpLevelCodeList is less than

RequiredLevelCount)

Set CurrentRATAStatus = "OOC-Incomplete Recertification".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATABAF = SubsequentRA 7>l/?6'cwY/.0\crallBiasAdjustincntFactor.

else

Set RA TA Event Operating Level Count to the RequiredLevelCount.

If (InvalidRATARecord is null)

Locate the earliest record in RA TA TestRecordsByLocationForOAStatus where the SystemID is equal to
the PriorRATAEventRecord.SystemID, the TestResult is equal to "INVALID" and the EndDate/Hour is
on or after the 7^i7w7L47M.E'veM£/te£w "FLOW" and PriorRA TAEventRecord. EventCodc = 125) or
(CurrentMh vParameter == "FLOW" and PriorRA TAEventRecord.EventCodc = 305))

if (the associated BeginDate of the system in the PriorRA TAEventRecord is null)


-------
Set CurrentRATAStatus = "Invalid Monitor System"

else

If (the associated SystemTypeCode of the system in the Prior RA TA E vent Record ==
"S02")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {ARP, CAIRS02,
TRS02G1, TRS02G2} 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
{ARP, CAIRS02, TRS02G1, TRS02G2} 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 PriorRA TAEventRecord ==
"NOX")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {ARP, NBP,
NHNOX, CAIRNOX, CAIROS, TRNOX, TRNOXOS, 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
{ARP, NBP, NHNOX, CAIRNOX, CAIROS, TRNOX, TRNOXOS,
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 Prior RA TA E ventRecord ==
"NOXC")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {NBP, NHNOX,
CAIRNOX, CAIROS, TRNOX, TRNOXOS, 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, TRNOX, TRNOXOS,

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 Prior RA TA E ventRecord in
set ('HCL, HG, ST"))

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {MATS} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the Prior RA TA E ventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)


-------
Locate the record in LocationProgramRecordsByHourLocation with the
latest EmissionsRecordingBeginDate where the ProgramCode is in set
{MATS} and the EmissionsRecordingBeginDate is ON OR BEFORE the
associated BeginDate of the system in the PriorRATAEventRecord.

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 PriorRATAEventRecord.

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 PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Set CurrentRATAStatus = 'Missing Program".

else if (LocationProgramRecordsByHourLocationUmtMomtorCertDeadline is not null)

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocationUmtMomtorCertDeadlim)
Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATAHAF = 1.0.

else

if (CurrentDate is prior to the

LocationProgramRecordsByHourLocation.UmtMomtorCertBeginDate +180
days)

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATAHAF = 1.0.

If (the number of calendar days ON OR AFTER the PriorRA TA E vent Record. Q A C c rt E v e n t D a t c
and ON OR BEFORE the CurrentDateHour > 180)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATABAF = 1.0.

else if (the quarter of the PriorRA TA EventRecorcl. Q ACcrt Eve nt Da tc is equal to the quarter of the
CurrentDateHour)


-------
If (the number of calendar days ON OR AFTER the

PriorRA TA E ventRecord.QACcr[E\cn[Di\[c and ON OR BEFORE the CurrentDateHour

>90)

If {Rpt Period Op Hours Accumulator Array for the location == -1)
Set CurrentRATAStatus = "Invalid Op Data".

else if (the number of calendar days ON OR AFTER the

PriorRA TAEventRecord. Q ACc rt Eyent Datc and ON OR BEFORE the

CurrentDateHour is equal to Rpt Period Op Days Accumulator Array for the

location)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRA TAIiAF = 1.0.

else

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "IC-Conditional".

else if (PriorRA TAEventRecord. M i nO p D ay s P ri o rQ ua rt e r is null)
Set PriorRATAEventRecord.MmOpDaysPriorQuarter = 0
Set PriorRA TA E ventRecord. Ma \ O p D ay s P ri o rQ ua rt c r = 0

For each quarter beginning with the quarter of the

PriorRATAEventRecord.QACertEventDate and continuing through the quarter BEFORE
the CurrentDateHour:

if (Earliest!.ocationReportDate <= 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)

Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is
equal to "Q"),

Set PriorRA TAEventRecord.IVTinOpDay sP rio rQuartcr =
-1

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.

else

If the quarter being checked is the quarter of the
PriorRA TAEventRecord. Q ACertEventDate

If ((tperatingSuppDataRecordsbyL ocation.O p Va 1 lie

MINUS the number of calendar days in the quarter


-------
being checked that are PRIOR to the
PriorRA TAEventRecord.Q ACcrt Eve ntDatc > 0)

Set

PriorRATAEventRecordMwO^DaysVnoxQvw
ter =

OperatingSuppDataRecordsbyLocation. OpVal
ue MINUS the number of calendar days in the
quarter being checked that are PRIOR to the
PriorRA TA EventRecord. Q A Cc rt E v e n t D a tc

If (()peratingSuppDataRecordsbyLocation.Op Va 1 lie is

less than the number of calendar days in the quarter
being checked that are ON OR AFTER the
PriorRA TA EventRecord. Q A C c rt E v e n t D a tc)

Set

PriorRA TA EventRecord. IVTa\0pDay s Prio rQua

rter =

OperatingSuppDataRecordsbyLocation. OpVal
ue.

else

Set

PriorRA TA E ventRecord. IVT a\0 p Day s P rio rQua
rter = the number of calendar days in the
quarter being checked that are ON OR AFTER
the

PriorRATAEventRecordQACertEventDate.

else

Set PriorRA TAEventRecord. IVT i nOpDay sP rio rQua rtc r =
PriorRA TAEventRecordMmO^Day sPriorQuarter +
()peratingSuppDataRecordsbyL ocation.O p V a 1 lie.
Set PriorRA TAEventRecord.MnxOpDnys PriorQuarter
= PriorRA TA EventRecord. IVI a \ O p D ay s P ri o rQ ua rt c r +
()peratingSuppDataRecordsbyL ocation.O p V a 1 lie.

if (PriorRATAEventRecord. MinOpDay sPriorQuarter == -1
set CurrentRATAStatus to "Missing Op Data"

else if (PriorRATAEventRecordMinOpDaysPriorQuarter + Rpt Period Op Days
Accumulator Array for the Location > 90)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh vParameter == "FLOW")

Set OverrideRATAHAF = 1.0.

else if {PriorRA TAEventRecord.MaxOpDay sPriorQuarter + Rpt Period Op Days
Accumulator Array for the Location > 90)

Set CurrentRATAStatus = "Undetermined-Conditional Data".

else

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "IC-Conditional".


-------
If (the quarter of the PriorRA 7/4£V677?/?6'cw 720,

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRA TAHAF = 1.0.

else

Set CurrentRATAStatus = "IC-Conditional".

else

if (PriorRA TA EventRecord. IVI i nOpHours Prio rQuartcr is null)

Set PriorRA TA E ventRecord. IVI i nOp H o u rs P rio rQ ua rtc r = 0
Set PriorRA TA E ventRecord. IVI a \ O p H o u rs P ri o rQ ua rt c r = 0

for each quarter beginning with the quarter of the

PriorRA 7M£Vewf/?ec«/Y/.ConditionalBcginDatc and continuing through the quarter
BEFORE the CurrentDateHour.

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)

Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is
equal to "Q"),

Set PriorRA TA EventRecord. IVI i nOpHoursPrio rQua rtc r
= -1

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.


-------
else

If the quarter being checked is the quarter of the
PriorRA TAEventRecord. ConditionalBeginDate

If (()peratingSuppI)ataRecordsbyL ocation.Op V a 1 lie

MINUS the number of calendar hours in the quarter
being checked that are PRIOR to the
/3/w/*/?/17>l£'v'6'rt?/?6'cwY/. Conditional BeginDate/Hour >

0)

Set

Prior RA TA E ventRecord. IVT i nO p H o u rs P rio rQu

arter =

OperatingSuppDataRecordsby Location.OpW'c\\
ue MINUS the number of calendar hours in the
quarter being checked that are PRIOR to the
Prior RA TAEventRecord.Condi\\\om\\BcgmDi\\

e/Hour

If (()peratingSuppl)ataRecordsbyL ocat ion.Op V a 1 lie is

less than the number of calendar hours in the quarter
begin checked that are ON OR AFTER the
PriorRATAEventRecord.Conditiom\\Bcgh\D'Mc/Hour)

Set

Prior RA TA E ventRecord. IVT a\0 p H o u rs P rio rQu

arter =

OperatingSuppDataRecordsby Location.OpVi\\
ue.

else

Set

Prior RA TA E ventRecord. IVT a\0 p H o u rs P ri o rQu

arter = the number of calendar hours in the
quarter being checked that are ON OR AFTER
the

Prior RA TAEventRecord.Condi\\\om\\BcgmDi\\
e/Hour.

Set Prior RA TA E ventRecord. IVI i nO p H o u rs P ri o rQua rtc r
= PriorRA TA EventRecord. IVI i nOp H o u rs P rio rQua rtc r +
()peratingSuppl)ataRecordsbyL ocat ion.O p Va 1 lie.

Set PriorRA TA E ventRecord. IVI axO p H o u rs PriorQuarter
= PriorRA TA E ventRecord. IVI a \ O p H o u rs P ri o rQ ua rt c r +
()peratingSuppl)ataRecordsbyL ocation.O p Va 1 lie.

if (PriorRA TA EventRecord. IVI i nOp H o u rs P rio rQua rtc r == -1)
set CurrentRATAStatus to "Missing Op Data"

else if (Rpt Period Op Days Accumulator Array for the location == -1)

if (PriorRA TA E ventRecord. IVI i nO p H o u rs P ri o rQ ua rt c r > 720)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".


-------
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.

else

Set CurrentRATAStatus = "Invalid Op Data".

else

if (PriorRA TAEventRecord. IVI i nOpHours Prio rQuartcr + Rpt Period Op Hours
Accumulator Array for the Location > 720)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if (CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = 1.0.

else if (Prior E ventRecord. IVI a\Op H o u rs P ri o rQua rtc r + Rpt Period Op Hours
Accumulator Array for the Location > 720)

Set CurrentRATAStatus = "Undetermined-Conditional Data".

else

Set CurrentRATAStatus = "IC-Conditional".

Results:

Result	Response	Severity

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	

	Hg RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation


-------
Check Code:

RATSTAT-6

Check N ame:	Evaluate Prior Multi-Level RAT A

Related Former Checks:

Applicability:	CEM Check

Description:	Determines (if applicable) if a prior multi level RATA exists and is acceptable.

Specifications:

Set PriorRatalsAlternateSingleLevelRATA = false.

Set ThreeLoadRATAExpirationDate to null.

If (CurrentMh vParameter == "FLOW" AND PriorRA TA Record is not null AND CurrentRATAStatus is null, starts with "IC", or starts
with "Undetermined")

Set PriorRataIsAlternateSingleLevelRATA = true.

Set PriorMultiLevelRATARecord = null.

Set InvalidMultiLevelRATARecord = null.

Set Prior MaxLeve!RA TA Record = null.

if (the number of levels in Prior RA TA Record. O p Lc v e 1C o dc Li s t is greater than or equal to the MaxLevelCount)

Set PriorRataIsAlternateSingleLevelRATA = false,
exit check.

else if (PriorRATARecord.OpLevolCodeList contains 2 levels)

Set PriorRatalsAIternateSingleLevelRATA = false,
if (MaxLevelCount <> 3)
exit check.

else if (AnnualReportingRequiremnt == true)

if (PriorRA TA Record.OpLc\c\CoAcL\s{ contains 1 level and Prior RA TA Record. Tc s t C1 a i m C o dc == "SLC")

Set PriorRatalsAlternateSingleLevelRA TA = false.

if (PriorRatalsAlternateSingleLevelRATA == true AND RATAEventOperatingLevelCount is null or less than 2)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal
to the PriorRATARecord.SystemID and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to
the PriorRA TA Record. EndDate/Hour. and (the number of operating levels in the OpLevelCodeList is greater than or equal
to 2 or the TestClaimCode == "SLC").

if (RATATestRecordsByLocationForQAStatus is found)

Set PriorMultiLevelRAT ARecord = the found record in RATATestRecordsByLocationForQAStatus.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the PriorRA TA Record. Sy stem ID and the EndDate/Hour is prior to the
PriorRA TA Record. EndDatc/H our and the EndDate/Hour is greater than the

Prior Mu ItiL e ve/RA TA Record. EndDate/Hour and the TestResult is equal to "INVALID", and (the number of
operating levels the OpLevelCodeList is greater than or equal to 2 or the TestClaimCode == "SLC").

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidMultiLevelRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

else


-------
Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the PriorRA TA Record. Sy stem ID and the EndDate/Hour is prior to the

PriorRA TARecord EndDatc/Hour 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 (RATATestRecordsByLocationForQAStatus is found)

Set In validMultiLevelRA TA Record = the found record in RATATestRecordsByLocationForQAStatus.

if {PriorMultiLevelRATARecord is not null)

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the

Prior Mu ItiL evelRA TA Record. SystemID and RATA2Required is equal to "Y" and the QACertEventDate is either:

a)	prior to the CurrentDateHour OR

b)	equal to both the CurrentDateHour and the ConditionalBeginDate/Hour;

AND either:

a)	QACertEventDate/Hour is after the PriorMultiLevelRA TARecord.EndDMc/Hour OR

b)	QACertEventDate/Hour is equal to the PriorMultiLevelRA TA Record. EndDate/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the
PriorMultiLevelRA 7M/?ecwf/. 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 CurrentDateHour

if (QACertificationEventRecords is found)

Set SubsequentRA TA Record = Prior MultiLevelRATARecord.

Set CurrentRataStatus = "OOC-Incomplete Recertification".

Set OverrideRataBaf = 1.0.

else

if {PriorMultiLevelRATARecord .QANeedsEvaluationFlag = "Y")

Set CurrentRATAStatus = "Prior Multi-Level RATA Not Yet Evaluated".

else if (PriorMultiLevelRA TA Record TestResultCode = null or PriorMultiLevelRA TARecord

.TestResultCode = "FAILED" or PriorMultiLevelRA TARecord .TestResultCode = "ABORTED")

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

Set OverrideRataBaf = P/w/*/?/!'//!/?6'cwY/.0\eral IB ias Adjust merit Factor.

else if (the number of levels i n Prior Mu ItiL evelRA TA Record. OpLevelCodeList is greater than or equal to
MaxLevelCount)

exit check.

else

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

Set OverrideRataBaf = fWw7L47/l/te£w
-------
Set InvalidMultiLevelRATARecord = null.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal
to the QaStatusSystemld and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to the
PriorRA TA Record. E ndDatc/Hour and the number of operating levels in the OpLevelCodeList is equal to the
MaxLevelCount.

if (RATATestRecordsByLocationForQAStatus is found)

Set PriorMuxLevelRA TARecord = the found record in RA TA TestRecordsByLocationForQAStatus.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the QaStatusSystemld and the EndDate/Hour is prior to the PriorRA TARecord.EndDate/Hour and the
EndDate/Hour is greater than the PriorMaxLevelRATARecord.EndDate/Hour and the TestResultCode is equal to
"INVALID" and the number of operating levels the OpLevelCodeList is equal to the MaxLevelCount.

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidMultiLevelRATARecord = the found record inRATATestRecordsByLocationForQAStatus.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the QaStatusSystemld and the EndDate/Hour is prior to the PriorRA TARecord. EndDate/Hour and the
TestResultCode is equal to "INVALID" and the number of operating levels the OpLevelCodeList is equal to the
MaxLevelCount.

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidMultiLevelRATARecord = the found record inRATATestRecordsByLocationForQAStatus.

if (Prior MaxLevetRA TARecord is null)

Set CurrentRATAStatus = "OOC-No Prior Maximum Level RATA".
Set OverrideRataBaf =1.0.

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the
QaStatusSystemld and

AND either

a)	MaxLevelCount is equal to 2 and RATA2Required is equal to "Y" OR

b)	MaxLevelCount is equal to 2 and RATA3Required is equal to "Y" OR

c)	MaxLevelCount is equal to 3 and RATA3Required is equal to "Y"

AND the QACertEventDate is either:

a)	prior to the CurrentDateHourOR

b)	equal to both the CurrentDateHourand the ConditionalBeginDate/Hour;

AND either:

a)	QACertEventDate/Hour is after the PriorMuxLevelRA TARecord. EndDate/Hour OR

b)	QACertEventDate/Hour is equal to the PriorMuxLevelRA 7>1/?6'cwy/.EndDate/Hour AND (TestCompletionDate
is null or the TestCompletionDate/Hour is after the PriorMaxLevelRATARecord.EndDate/Hour)

if {QACertificationEventRecords is found)


-------
Set SubsequentRA TARecord = PriorM axLevelRA TA Record.
Set CurrentRataStatus = "OOC-Incomplete Recertification".

Set OverrideRataBaf =1.0.

else if (PriorM axLevelRA 7M/?ec«/Y/.Q ANccdsEvaluationFlag = "Y")

Set CurrentRATAStatus = "Prior Maximum Level RATA Not Yet Evaluated".

else if (PriorM axLevelRA TARecord J cstRcsultCodc = null)

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Has Critical Errors".
Set OverrideRataBaf = PriorRA 7>l/?6'cwY/.0\ crallBiasAdjustincntFactor.

else if (PriorMaxL eveIRA TA Record. Tc s t R c s u 11C o dc = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Failed".
Set OverrideRataBaf = PriorRA 7M/?ec«/Y/. Overall Bias Adjustment Factor.

else if (PriorMaxL eveIRA TA Record. Tc s t R c s u 11C o dc = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Aborted".
Set OverrideRataBaf = PriorRA 7M/?ec«/Y/. Overall Bias Adjustment Factor.

if PriorM axLevelRA TARecord J cstRcasonCodc = "INITIAL",

Locate the latest record in QACertificationEventRecords where

1)	SystemID is equal to the QaStatusSystemld

2)	QaCertEventCode is equal to "305"

3)	QACertEventDate/Hour is prior to the CurrentDateHour,

if (QACertificationEventRecords is found, and the TestCompletionDate in the located record is
after PriorM axLevelRA TARecordEmUDato)

Set PriorM axLevelRA TARecord J cstExpi rationDatc = the end of the quarter twenty
quarters after the TestCompletionDate .

else

Set PriorMaxL eveIRA TA Record. Tc s t Ex p i ra t i o n D a t c = the end of the quarter twenty
quarters after the PriorM axLevelRA TARecord. EndDatc.

else

Set PriorMaxL eveIRA TA Record. Tc s t Ex p i ra t i o n D a t c = the end of the quarter twenty quarters
after the PriorM axLevelRA TARecord. EndDatc.

if (the date for CurrentDateHour is after the PriorMaxL eveIRA TA Record. Tc s t Ex p i ra t io n Da tc)

if (Annual Reporting Requirement == false)

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".
Set OverrideRataBaf = fWw7L47M./te£w
-------
else if (GraceOpHours > 720)

else

Results:

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".
Set OverrideRataBaf = PriorRA	Overal IB ias Adjust mentFactor.

For each quarter beginning with the quarter after the

Prior MaxLeve/RA TARecord.TcstE\pi ratio nDatc and continuing through the
quarter prior to the CurrentDateHour,

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 CurrentRATAStatus = "OOC-Prior
Maximum Level RATA Expired".
Set OverrideRataBaf =

PriorRA TA Record. O v e ra 11B i a s A dj lis t mc n t Fa c t
or.

exit for.

else

Locate the record in ReportingFrequencyByLocation
where CalendarYear/Quarter are equal to the quarter
being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequ en cyliyL o cation. Rc po rt i ng F rcq lie ncy C
ode is equal to "Q"),

Set CurrentRATAStatus = '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.

Result

Response

Severity


-------
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:

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/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation


-------
Check Code:	RATSTAT-7

Check Name:	Determine Expiration Dates for Most Recent Prior RATA Test

Related Former Checks:

Applicability:	CEM Check

Description:	Determines the expiration dates for the Applicable Prior RATA test. This includes the Test Expiration Date

both with and without any extensions

Specifications:

if (CurrentRATAStatus is null and Prior RA TA Record is not null and Prior RATAEventRecord is null)

Set PriorTestExpirationDate = null

Set PriorTestExpirationDateWithExtension = null

Set MissingOpData = false

Set NumberOfExtensionQuarters = 0

Set PriorTestExpirationDate = PriorRA TARecord JcstExpirationDatc.

Set PriorTestExpirationDateWithExtension = PriorRA TA Record. Te s t Ex p i ra t i o n D a t e W i t h Ex te n s i o n.

If (PriorRA 7>1/?6'cwy/. IgnorcGraccForExtensions is equal to 1)

Set PriorTestlgnoreGraceForExtensions = true

Else

Set PriorTestlgnoreGraceForExtensions = false

if (PriorTestExpirationDate is null)

if {Annual Reporting Requirement == false)

if (PriorRA TARecord. EndDate is between 10/01/2007 and 12/31/2007)

Set PriorTestExpirationDate = 09/30/2008

else

Set PriorTestExpirationDate = September 30th of the year of the PriorRA TA Record. E ndDate.

else if (QaStatusSystemDesignationCode == "B")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the QaStatusSystemld and
the ExtensionExemptionCode is equal to "NRB720" and a ReportingPeriod equal to the CurrentReportingPeriod.

if (TestExtensionExemptionRecords is found)

Set PriorTestExpirationDate = the end of the quarter eight quarters after the PriorRA TARecord. EndDate.

if (PriorTestExpirationDate is null)

if (PriorRataIsAlternateSingleLevelRATA== true)

Set PriorTestExpirationDate = the end of the quarter one year after the
Prior MultiLevelRA TARecordlLndDate.

if (Prior Mu ItiLeveIRA TA Record. G race Pe ri od I nd == 1)

Set PriorTestExpirationDate = the end of the quarter prior to the PriorTestExpirationDate.

else

if (PriorRA	Rata Frequency Cd in set {4QTRS,8QTRS})

Locate the most recent QACertificationEventRecords for the PriorRA TA Record. Sy stem ID where
RATARequired is equal to " Y" and the BeginDate/Hour is prior to the
PriorRA TA Record. BeginDate/Hour.


-------
if (QACertificationEventRecords is found and RATACertEvent== "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
PriorRA TA Record. E nd D a tc/ H o u r)

if (PriorRA TARecord. Sy stc mTy pcCodc is in set (HCL, HF, HG, ST))

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and
the EmissionsRecordingBeginDate is ON OR BEFORE the BeginDate of the
associated system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecordingBeginDate is later than
OA CertificationEventRecords. CompletionT estDate)

Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecordingBeginDate.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
OA CertificationEventRecords. CompletionT estDate.

if (PriorRA TA Record. G race Pe ri od I nd == 1)

Set PriorTestlgnoreGraceForExtensions = true.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
OA CertificationEventRecords. CompletionT estDate.

if (PriorRA TA Record.Grace Pe riodl nd == 1)

Set PriorTestExpirationDate = the end of the quarter prior to the

Pri orTestExpirati onDate.

if (PriorRA TA Record. Sy stc mTy pcCodc is in set (HCL, HF, HG, ST))

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and
the EmissionsRecordingBeginDate is ON OR BEFORE the BeginDate of the
associated system in the Prior RATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecordingBeginDate is later thanPriorRATARecord.EndDate)

Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecordingBeginDate.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
PriorRA TARecordSavSDsAq.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
PriorRA TARecordEmSDntQ.

if (PriorRA TA Record. G ra ce Pe ri o d I nd = = 1)


-------
Set PriorTestExpirationDate = the end of the quarter prior to the

PriorTestExpirationDate.

else

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
PriorRA TA Record. B c g i n D a tc/ H o u r.

if (QACertificationEventRecords is found AND RATACertEvent== "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
PriorRA TARecord.En&DMdHoux)

Set PriorTestExpirationDate = the end of the quarter two quarters after the
QACertiJicationEventRecords.CompletionTestDate.

else

Set PriorTestExpirationDate = the end of the quarter two quarters after the
PriorRA TARecordEwSDatQ.

Set PriorRA TARecord AestExpirationDate = PriorTestExpirationDate.

If (PriorTestlgnoreGraceForExtensions is true)

Set PriorRA 7>1/?6'cwy/.IgnorcGraccForExtensions = 1

Else

Set PriorRA 7>1/?6'cwy/.IgnorcGraccForExtensions = 0

if (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate)

Set CurrentRATAStatus = "IC".

else if {Annual Reporting Requirement == false)

Set CurrentRATAStatus = "OOC-Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATABAF = fW
-------
Set StartNonQaPrimaryBypassQuarter = StartQuarter

For each quarter beginning with the StartQuarter and continuing through the earlier of the quarter prior to the
quarter of the CurrentDateHour and EndQuarter

II Prevent extensions beyond the maximum expiration date

if PriorTestExpirationDate plus NumberOfExtensionQuarters + 1 is after MaximumExtensionDate,
exit loop

if (Earliest Location ReportDate > the last day of the quarter being checked)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one quarter.

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
OperatingSuppDataRecordsfiy Location.Op\Ia\uc < 168)

Set NumberOfExtensionQuarters — NumberOfExtensionQuarters + 1.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one quarter.

else if (OaStatusSystemTypeCode begins with "S02")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
QaStatusSystemld and the 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.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one

quarter.

else if (OperatingSuppDataRecordsByLocation is not found)

Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the year/quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is equal to "Q"),

Set Missing Op Data to true.

Set RATAMissingOpDataInfo= "[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 (QaStatusSystemDesignationCode == "PB")

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
QaStatusSystemld 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.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one


-------
quarter.

else if (OperatingSuppDataRecordsByLocation is not found)

Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the year/quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is equal to "Q"),

Set Missing Op Data to true.

Set RATAMissingOpDiitalnfo = "[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)

Locate the record in ReportingFrequencyByLocation where CalendarYear/Quarter are
equal to the year/quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is equal to "Q"),

Set Missing Op Data to true

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

if (QaStatusSystemDesignationCode == "PB")

// Allow additional extensions for non QA Primary Bypass exemptions.

For each quarter beginning with StartNonQaPrimaryBypassQuarter and continuing through the quarter
prior to the quarter of the CurrentDateHour

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
QaStatusSystemld 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

exit loop.

Set PriorTestExpirationDateWithExtension = PriorTestExpirationDate.

Add NumberOfExtensionQuarters to PriorTestExpirationDate WithExtension.

If PriorTestExpirationDateWithExtension is greater thanMaximumExtensionDate
Set PriorTestExpirationDate WithExtension = MaximumExtensionDate

Set PriorRATARecord.TestExpirationDateWithExtension = PriorTestExpirationDateWithExtension.

else

Set PriorRA TARecord.TcstE\pi rationDatcWithE\tcnsion = PriorTestExpirationDate
If (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDateWithExtension)

Set CurrentRATAStatus = "IC-Extension".
else if (Missing Op Data is true)


-------
Set CurrentRATAStatus = "Missing Op Data".

Set PriorRA TARecord.Tcst E\pi rat io nDatc W ithE\tcnsio n = null

else if (RptPeriodOpTimeAccumulatorArray == -1)

Set CurrentRATAStatus = "Invalid Op Data".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location.

if (GraceOpHours > 720)

Set CurrentRATAStatus = "OOC-Expired".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATABAF = 7>ior7t42M7?ecor 720)

Set CurrentRATAStatus = "OOC-Expired".

if (CurrentMh v Parameter == "FLOW")
Set OverrideRATABAF =

Prior RA TA Record. O v e ra 11B ias Adj ustmentFactor.

exit for.

else

Locate the record in ReportingFrequencyBy Location where
CalendarYear/Quarter are equal to the year/quarter being checked.

if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iyLocation.RcpovUngFrcqucncyCodc is equal to


-------
Set CurrentRATAStatus = "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.

if (CurrentRATAStatus is null)

Set CurrentRATAStatus = "IC-Grace".

If (PriorRatalsAlternateSingleLevelRATA == true AND CurrentRATAStatus = "OOC-Expired")
Set CurrentRATAStatus = "OOC-Incomplete QA RATA".

if (CurrentMh v Parameter == "FLOW")

Set OverrideRATABAF = 7>i7w7L47M./te£w
-------
Check Code:	RATSTAT-8

Check Name:	Determine Final RATA Status

Related Former Checks:

Applicability:	CEM Check

Description:	Evaluates the determined RATA Status and changes it if needed based on an ignored test or the status of the

alternate system.

Specifications:

Set AlternateRATARecord = null.

if (CurrentRATAStatus begins with "OOC")

Set InvalidRATATestNumber = null.

if (InvalidMultiLevelRATARecord is not null)

Set Invalid RATA Test Number = Inval'ulMuItiLevelRA TARecord.TcstNumbcr
Set CurrentRATAStatus = CurrentRATAStatus &

if (CurrentMh vParameter == "FLOW")

Set RATA StatusBAF = InvalidMultiLevelRA 7M/tecwf/.Ovcral IB ias Adjust mcntFactor.

else if (InvalidRATARecord is not null)

Set InvalidRATATestNumber = In val'ulRA TA Record. Tc st N u mbc r
Set CurrentRATAStatus = CurrentRATAStatus &

if (CurrentMh vParameter == "FLOW")

Set RATA Status BAF = In val'ulRA TA Record. O v c ra 11B i a s A d j u s t mc n t Fa c t o r.

else if (OverrideRATABAF is not null)

if (CurrentMh vParameter == "FLOW")

Set RATA Status BAF = OverrideRATABAF

else if (CurrentRATAStatus begins with "IC" or "Undetermined"

If (QaStatusSystemTypeCode== "NOX")

Set ComponentlDList = null.

Set AlternateSystemlDList = null.

For each record in MonitorSystemComponentRecordsforHourandLocation where the SystemID is equal to the
QaStatusSystemld and ComponentTypeCd in list {"C02", "NOX", "02"}

Add MonitorSystemComponentRecordsforHourandLocation.ComponcnUD to ComponentlDList.

if (ComponentlDList is not null)

For each record in MonitorSystemComponentRecordsjorHourandLocation where the ComponentID is in
ComponentlDList and SysTypeCd in list {"C02", "02", "NOXC"}.

Add MonitorSystemComponentRecordsforHourandLocation.SystemiD to AlternateSystemlDList.

if {AlternateSystemlDList is not null)

If (Prior RA TAEventRecord is not null)

If (/3/w/*/?/17>l£'v'6'rt?/?6'cwY/.ConditionalBcginDatc is not null)


-------
Locate the most recent record in RA TA TestRecordsByLocationForQAStatus for the location
where the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to the
CurrentDateHour and the EndDate/Hour is after the
Prior RA 7M£Vewf/?ectf/Y/.ConditionalBcginDatc/Hour.

If there are multiple records found with the same begindate, prefer the record with TestResultCode
= "PASSED" or "PASSAPS", then prefer the record with TestResultCode = "FAILED" or
"ABORTED".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

if (AltemateRA TARecord.T cstRcsultCodc = null)

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Has Critical
Errors".

else if (A Item ateRA TA Record. TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Failed",
else if (A Item ateRA TA Record. TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Aborted".

else

Locate the most recent record inRATATestRecordsByLocationForQAStatus for the
location where the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to
the CurrentDateHour and the EndDate/Hour is after the

Prior RA 7M£Vewf/?ectf/Y/.ConditionalBcginDatc/Hour and the QANeedsEvaluationFlag is
equal to "Y".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

Set CurrentRATAStatus = "Prior Alternate System RATA Not Yet Evaluated".

else if (PriorRA TA Record 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 CurrentDateHour and the
EndDate/Hour is after the PriorRA TA Record. EndDate/Hour.

If there are multiple records found with the same begindate, prefer the record with TestResultCode=
"PASSED" or "PASSAPS", then prefer the record with TestResultCode = "FAILED" or "ABORTED".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRATARecord = the found record inRATATestRecordsByLocationForQAStatus.

if (AltemateRA TARecord.T cstRcsultCodc = null)

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Has Critical Errors".

else if (A Item ateRA TA Record. TestResultCode = "FAILED")


-------
Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Failed".

else if (A Item ateRA TA Record. Tc s t R c s u 11C o dc = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Aborted".

else

Locate the most recent record inRATATestRecordsByLocationForQAStatus for the location
where the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to the
CurrentDateHour and the EndDate/Hour is after the PriorRA TA Record. EndDate/Hour and the
QANeedsEvaluationFlag is equal to "Y".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.

Set CurrentRATAStatus = "Prior Alternate System RATA Not Yet Evaluated".
If {Current RATA Status begins with "IC" or "Undetermined")

If (PriorRA TA Record is null)

Set RA TA Status BAF = 1

else if {Current RATA Status begins with "IC-Cond", "Undetermined-Cond" or "PendingOOC-Cond" AND

( PriorRA TA E vent Record. Q A C c rt E v e n t C o dc is in set {40, 50, 51, 100, 101, 120, 125, 151, 250, 255,
300, 305}) OR PriorRATARecord.TestResultCode does NOT begin with "PASS"))

Set RA TA Status BAF = 1

else if {QaStatusSystemld is NOT equal to PriorRATARecord.SystemID)

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the QaStatusSystemld, the TestResultCode is NOT equal to "INVALID" and the EndDate/Hour is prior
to the CurrentDateHour

If found,

Set RA TA Status BAF to the OverallBiasAdjustmentFactor in the RATA record found above.

else

Set CurrentRATAStatus to "OOC-No Prior Test or Event".

Locate the most recent record in RA TA TestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the QaStatusSystemld, the TestResultCode is equal to "INVALID" and the
EndDate/Hour is prior to the CurrentDateHour.

If found,

Set InvalidRATATestNumber to the TestNumber in the RATA record found above.
Set CurrentRATAStatus = CurrentRATAStatus &

else

Set RA TA Status BAF = PriorRA TA Record. O v e ra 11B i a s A d j u s t me n t Fa c t o r

If {CurrentRATAStatus does not begin with "IC")

Return result CurrentRATAStatus


-------
Results:

Result

Invalid Monitor
System

Invalid Op Data
Missing Op Data

Missing Program

OOC-Conditional
Period Expired
OOC-Conditional
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*
OOC-Prior
Alternate System
RATA Aborted
OOC-Prior
Alternate System
RATA Failed

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. A prior 3 Level System Integrity test 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. If applicable, please
review the prior single-level RATA to determine if it contained a single load flow claim
qualification record under Part 75, Appendix B, Section 2.3.1.3(c)(3)).

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].

You did not report a valid prior [max]-level flow RATA for [key]. An invalid RATA
with TestNumber [invtestnum] was ignored.

You did not report a prior [testtype] or certification event 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

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
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.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] was
aborted, so [key], which contains a component that is also in the former system, is
out-cf -control.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] failed, so Critical Error Level 1
[key], which contains a component that is also in the former system, is out-cf-control.


-------
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*

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*

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] has Critical Error Level
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

aborted.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] was	Critical Error Level

aborted. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has expired Critical Error Level

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has expired. Critical Error Level
An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed. Critical Error Level

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed. An Critical Error Level
invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has critical Critical Error Level
errors.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has critical Critical Error Level
errors. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] was aborted. Critical Error Level

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] was aborted.	Critical Error Level
An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] failed.	Critical Error Level

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] failed. An Critical Error Level
invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] has critical Critical Error Level
errors.

The prior RATA for SystemlD [RATASYS] with TestNumber [testnum] has critical Critical Error Level
errors. An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The subsequent recertification RATA for SystemlD [subsys] with TestNumber
[subtestnum] was aborted.

The subsequent recertification RATA for SystemlD [subsys] with TestNumber
[subtestnum] was aborted. An invalid [testtype] with TestNumber [invtestnum] was
ignored.

The subsequent recertification RATA for SystemlD [subsys] with TestNumber
[subtestnum] failed.

The subsequent recertification RATA for SystemlD [subsys] with TestNumber
[subtestnum] failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification RATA for SystemlD [subsys] with TestNumber
[subtestnum] has critical errors.

Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level

Critical Error Level

The subsequent recertification RATA for SystemlD [subsys] with TestNumber	Critical Error Level

[subtestnum] has critical errors. An invalid [testtype] with TestNumber [invtestnum]
was ignored.


-------
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-Co
nditional Data

The RATA status for [key] could not be determined, because a prior RATA with
TestNumber [alttestnum] for MonitoringSystemID [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.

Critical Error Level 1

Critical Error Level 1

The RATA status could not be determined, because the prior multi-level flow RATA for Critical Error Level 1
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

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	

	Hg RATA Status Evaluation

5

Process/Category:

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Process/Category:

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Process/Category:

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Process/Category:

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation


-------
Check Category:

Weekly System Integrity Status


-------
Check Code:	WSISTAT-1

Check Name:	Initialize Status Checking

Related Former Checks:

Applicability:

Description:	Initialized parameters need for status checking.

Specifications:

Set WsiStatus to null.

Set WsiPluginEventRecord to null.

Results:

Result	Response

Usage:

1	Process/Category: Emissions Data Evaluation Report —

Severity

Hg System Integrity Status Evaluation


-------
Check Code:	WSISTAT-2

Check Name:	Locate Prior Test

Related Former Checks:

Applicability:

Description:	This check locates the test prior to the current hour. If a test was not found it determines whether the status is

OOC because at least 7 total operating days have occurred.

Specifications:

For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.

If (WsiTestDictionary entry exists)

Set WsiPriorTestRecord to WsiTestDiction. MostRcccntTcstRcCO rd.

Else

Set WsiPriorTestRecord to null.

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hg System Integrity Status Evaluation


-------
Check Code:	WSISTAT-3

Check Name:	Check For Intervening Event

Related Former Checks:

Applicability:

Description:	Locates an event with codes 110 and 130 and a matching component id, and a test date and hour preceeding the

current hour but after the current test.

Specifications:

Set WsilnterveningEventRecord to null.

If (WsiStatus is equal to null)

Locate the most recent record in QACertificationEventRecords where:

a)	ComponentID is equal to QaStatusComponentld.

b)	QaCertEventDateHour is prior to CurrentDateHour.

c)	QaCertEventDateHour is after Wsi Prior Test Record. Tc s t D a tc H o u r.

d)	QaCertEventCode is equal to "110" or "130"

If found

Set WsilnterveningEventRecord to the located record.

Set WsiPluginEventRecord to the located record.

Set WsiStatus to "OOC-Event".

Else

If (Wsi Prior Test Record. Tc s t R c s u 11C o dc is equal to null)

Set WsiStatus to "OOC-Test Has Critical Errors".

Else if (WsiPriorTestRecord J cstRcsultCodc is equal to "FAILED")

Set WsiStatus to "OOC-Test Failed".

Else

For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.

If (JFsiTes/Z)icft7wary.OperatingDateList is not null) AND (the count of days in
WsiTestDictionary.OpcratingDateList is greater than 7)

Set WsiStatus to "OOC-Expired".

Else

Set WsiStatus to "IC".

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hg System Integrity Status Evaluation


-------
Check Code:	WSISTAT-4

Check Name:	Return the Final Status

Related Former Checks:

Applicability:

Description:	Returns the value in WSI Result Status as the check result.

Specifications:

If (WsiStatus does not begin with "IC")
return result WsiStatus.

Results:

Result
OOC-Event

OOC-Expired
OOC-No Prior
Test

OOC-Test Failed
OOC-Test Has
Critical Errors

Response

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [event] for [compkey], and have not yet performed the required
recertification tests.

The prior weekly system integrity test for [compkey] on [date] has expired.

You did not report a prior weekly system integrity test for [compkey] during the
reporting period. Any weekly system integrity that may have been completed in a prior
reporting period has expired.

The prior weekly system integrity test for [compkey] completed on [date] failed.
The prior weekly system integrity test for [compkey] completed on [date] has critical
errors.

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	Hg System Integrity Status Evaluation


-------
Check Code:

WSISTAT-5

Check Name:	Check for Intervening Like-Kind Event

Related Former Checks:

Applicability:	General Check

Description:	When a previous test does not exist, this check locates an event with codes 140 and 141 and a matching

component id, and an event date and hour preceeding the current hour. If found and at least seven operating
days occurred between the event and the current hour, an OOC-NoPriorTest occurs. If the event is not found,
and at least seven operating days have occurred since the beginning of the quarter, an OOC-NoPriorTest also
occurs.

Specifications:

Set WsilnterveningLinkKindEventRecord to null.

Locate the most recent record in QACertificationEventRecords where:

a)	ComponentID is equal to QaStatusComponentld.

b)	QaCertEventCode is equal to "140" or "141"

c)	QaCertEventDateHour is prior to CurrentDateHour.

d)	If WsiPriorTestRecord is NOT equal to null, then QaCertEventDateHour is after WsiPrior Test Record. Tc st Da tc H o u r.

If found

Set WsilnterveningLinkKindEventRecord to the located record in QACertificationEventRecords.

Set EarliestOperatingDate equal to the day after WsilnterveningLinkKindEventRecord.QaCertEventDate.

If (the count of days on or after EarliestOperatingDate in OperatingDateArray for current location is greater than 7)
If WsiPriorTestRecord is equal to null

Set WsiStatus to "OOC-No Prior Test".

Else

Set WsiPluginEventRecord to WsilnterveningLinkKindEventRecord.

Set WsiStatus to "OOC-Event".

Else

Set WsiStatus to "IC-Undetermined".

Else

If WsiPriorTestRecord is equal to null

Set EarliestOperatingDate equal to the day after QaStatusComponentBeginDate.

If (the count of days on or after EarliestOperatingDate in OperatingDateArray for current location is greater than 7)
Set WsiStatus to "OOC-No Prior Test".

Else

Set WsiStatus to "IC-Undetermined".

Results:

Result	Response	Severity

Usage:

1	Process/Category: Emissions Data Evaluation Report	Hg System Integrity Status Evaluation


-------