DRAFT
ECMPS
Check Specifications

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

Ariel Rios Building
1200 Pennslyvania Avenue
Washington DC 20460

December 16, 2015


-------
Table of Contents:

ADESTAT

2

DAILY

36

DAYCAL

51

DCSTAT

105

EMTEST

117

EMWSI

123

EMWTS

134

F2LSTAT

143

HOURAD

156

HOURAE

224

HOURAGG

242

HOURAPP

291

HOURCV

310

HOURDHV

378

HOURGEN

456

HOURMHV

491

HOUROP

555

INTSTAT

621

LINSTAT

627

LKSTAT

652

LME

661

MATSCHV

714

MATSDHV

741

MATSGFM

761

MATSHOD

772

MATSMHV

794

MATSTRN

820

MATSTRP

847

RATSTAT

867

WSISTAT

903


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-1

Check Name:

Determine Appendix E Status

Related Former Checks:

Applicability:

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 TestResult Code 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 Syste m
ID is equal to the AppENOXESystemID and the TestResult Code 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 AppendixETestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the AppE NOXE System ID and the TestResult Code 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 (Prior AppendixERecord is not null)

if (Prior AppendixERecord .QANeedsEvaluationFlag = "Y")

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

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

else

Environmental Protection Agency

Page 2 of 907


-------
Draft Check Specifications

12/16/2015

Set PriorTestExpirationDate = PriorAppendixERecord .TestExpirationDate

if (PriorTestExpirationDate is null)

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

if ( CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate )

Set CurrentAppendixEStatus = "OOC-Expired".

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

if ( QACertificationEventRecords is found)

Set PriorAppendixEEventRecord = the found record in QACertificationEventRecords .

if (the number of calendar days ON OR AFTER the PriorAppendixEEventRecord .QACertEventDate
and ON OR BEFORE the CurrentOperatingDate/Hour > 180)

Set CurrentAppendixEStatus = "OOC-Event".

else if (PriorAppendixEEventRecord .MinOpDaysPriorQuarter is null)

Set PriorAppendixEEventRecord .MinOpDaysPriorQuarter = 0

Set PriorAppendixEEventRecord .MaxOpDaysPriorQuarter = 0

for each quarter beginning with the quarter of the PriorAppendixEEventRecord .QACertEventDate
and continuing through the quarter BEFORE the CurrentOperatingDate/Hour :

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

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

if ( OperatingSuppDataRecordsbyLocation is not found)

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

If ( OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorAppendixEEventRecord QACertEventDate > 0)

Set PriorAppendixEEventRecord .MinOpDaysPriorQuarter =
OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorAppendixEEventRecord. QACertEventDate

Environmental Protection Agency

Page 3 of 907


-------
Draft Check Specifications

12/16/2015

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

Set PriorAppendixEEventRecord .MaxOpDaysPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

else

Set PriorAppendixEEventRecord .MaxOpDaysPriorQuarter = the number
of calendar days in the quarter being checked that are ON OR AFTER the
PriorAppendixEEventRecord QACertEventDate.

else

Set PriorAppendixEEventRecord .MinOpDaysPriorQuarter =
PriorAppendixEEventRecord .MinOpDaysPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

Set PriorAppendixEEventRecord .MaxOpDays PriorQuarter =
PriorAppendixEEventRecord MaxOpDaysPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

If ( CurrentAppendixEStatus does NOT begin with "OOC")

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

set CurrentAppendixEStatus = "Invalid Op Data"

elseif (PriorAppendixEEventRecord .MinOpDaysPriorQuarter == -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".

else

if (AppE FuelCode is not equal to "MIX")

Locate the earliest record in AppendixETestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the AppENOXESystemID and the TestResult Code 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 AvvendixETestRecordsBvLocationForOAStatus for the location where the

Environmental Protection Agency	Page 4 of 907


-------
Draft Check Specifications

12/16/2015

SystemID is equal to the AppENOXESystemID and the TestResult Code is equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour and the EndDate/Hour is before the
SubsequentAppendixERecord .EndDate/Hour

if (AppendixETestRecordsByLocationForQAStatus is found)

Set InvalidAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus .

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

If OperatingSuppDataRecordsbyLocation is found)

Set FuelOpSuppDataRecord = the found record in OperatingSuppDataRecordsbyLocation

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

if (If OperatingSuppDataRecordsby Location 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 AppE FuelCode.

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

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

Set CurrentAppendixEStatus = "Invalid Location Fuel"
else if (FuelRecordsByHourLocation .IndicatorCode is equal to "S",
if (SubsequentAppendixERecord .QANeedsEvaluationFlag = "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 TestResult Code is equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour

if (AppendixETestRecordsByLocationForQAStatus is found)

Environmental Protection Agency	Page 5 of 907


-------
Draft Check Specifications

12/16/2015

Set InvalidAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus .

else

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

Set CurrentAppendbcEStatus = CurrentAppendbcEStatus &
if ( CurrentAppendbcEStatus does not begin with "IC")

Return result CurrentAppendbcEStatus .

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

Description

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.

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

Environmental Protection Agency

Page 6 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:
1

2

3

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

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

The subsequent recertification Appendix E test TestNumber [subtestnum] for Critical Error Level 1
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	Critical Error Level 1

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

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

operating day window required to conduct another Appendix E test following
QACertEventCode [code] QACertEventDate [eventdate] for
MonitoringSystemID [ID],

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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

Condition: App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 7 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-2

Check Name:

Locate Most Recent Prior Accuracy Test

Related Former Checks:

Applicability:

Specifications:

Set CurrentAccuracy Status = null.

Set Prior Accuracy Record = null.

Set Invalid Accuracy Record = null.

Set Inappropriate Transmitter Transducer Test to false.

L ocate the most recent record in Accuracy TestRecordsByLocationForQAStatus for the location where the ComponentID is
equal to the FuelFlowComponentRecordToCheck .ComponentID 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 Accuracy Record = the found record in Accuracy TestRecordsByLocationForQAStatus .

if (PriorAccuracyRecord TestTypeCode is equal to "FFACCTT" AND FuelFlowComponentRecordToCheck
.SampleAcquisitionMethod is \ul not\ulnone equal to "ORF", "NOZ", or "VEN")

Set Inappropriate Transmitter Transducer Test to true.

Locate the most recent record in Accuracy TestRecordsByLocationForQAStatus 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 Accuracy Record .EndDate/Hour and the
TestResult is equal to "INVALID".

if (Accuracy TestRecordsByLocationForQAStatus is found)

Set Invalid Accuracy Record = the found record in Accuracy TestRecordsByLocationForQAStatus .
if (Prior Accuracy Record .QANeedsEvaluationFlag = "Y")

Set CurrentAccuracy Status = " Accuracy Test Not Yet Evaluated",
else if (Prior Accuracy Record .TestResultCode is null)

Set CurrentAccuracy Status = "OOC- Accuracy Test Has Critical Errors",
else if (Prior Accuracy Record .TestResultCode = "FAILED")

Set CurrentAccuracy Status = "OOC- Accuracy Test Failed",
else if (Prior Accuracy Record .TestResultCode = "ABORTED")

Set CurrentAccuracy Status = "OOC-No Prior Accuracy Test"

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

if (Accuracy TestRecordsByLocationForQAStatus is found)

Environmental Protection Agency	Page 8 of 907

Set CurrentAccuracy Status = "OOC- Accuracy Test Aborted".

else


-------
Draft Check Specifications

12/16/2015

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

Usage:

1	Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 9 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-3

Check Name:

Locate Most Recent Prior Accuracy Event

Related Former Checks:

Applicability:

Specifications:

Set Prior Accuracy EventRecord = null.

If ( CurrentAccuracy Status is null)

Locate the most recent record in QACertiflcationEventRecords WHERE

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

b)	FFACCRequired is equal to "Y" AND

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

d)	the QACertEventDate/Hour is after the later of the Prior Accuracy Record .EndDate/Hour and the Prior Accuracy
Record. Reinstallation Date/Hour .

if ( QACertiflcationEventRecords is found)

Set Prior Accuracy EventRecord = the found record in QACertiflcationEventRecords .

Set CurrentAccuracy Status = "OOC-Event".

else

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

Set PriorTestExpirationDate = 4 quarters after the end of the quarter of the later of the Prior Accuracy Record
.EndDate/Hour and the Prior Accuracy Record. Reinstallation Date/Hour.

Set Prior Accuracy Record .TestExpirationDate = PriorTestExpirationDate .

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

Set CurrentAccuracy Status = "IC".

.EndDate/Hour.

if ( CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate )

Set CurrentAccuracy Status = "OOC- Accuracy Test Expired".

else

Usage:
1

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 10 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-4

Check Name:

Determine Eligibility for Fuel Flow to Load Testing (Accuracy)

Related Former Checks:

Applicability:

Specifications:

Set FF2LAccuracyEligible = null.

Set FF2LAccuracyC1ieckDate = null.

if ( Current Accuracy Status is null)

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the TestResult is equal to " PASSED ", "EXC168H", "INPROG", or
"FAILED" and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter
of the later of the PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set FF2LAccuracyEligible = true.

Set FF2LAccuracyCheckDate = the later of the PriorAccuracy Record EndDate and the PriorAccuracy Record
.ReinstallationDate.

for each record in FuelFlowComponentRecords

if ( FuelFlowComponentRecords .ComponentID is not equal to FuelFlowComponentRecordToCheck
.ComponentID)

L ocate 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 PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

if (Accuracy TestRecordsByLocationForQAStatus 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 (Accuracy TestRecordsByLocationForQAStatus .TestTypeCode is equal to "FFACCTT")

Locate the latest record in PEI TestRecordsByLocationForQAStatus 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
PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

if (PEI TestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

else

else

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the PEI
TestRecordsByLocationForQAStatus .EndDate.

Environmental Protection Agency

Page 11 of 907


-------
Draft Check Specifications

12/16/2015

else if (Prior Accuracy Test Record .TestTypeCode is equal to "FFACCTT")

Locate the latest record in PEI TestRecordsByLocationForQAStatus 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 PriorAccuracyRecord .EndDate.

if (PEI TestRecordsByLocationForQAStatus is not found)

Set FF2LAccuracyEligible = false, and exit this check.

else

Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the PEI
TestRecordsByLocationForQAStatus .EndDate.

Usage:
1

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 12 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-5

Check Name:

Evaluate Fuel Flow to Load Tests (Accuracy)

Related Former Checks:

Applicability:

Specifications:

Set FF2LAccuracyBeginYearQuarter = null.

Set FF2LAccuracyEndYear Quarter = null.

Set InvalidFF2LTestNumber = null.

Set MissingFF2L YearOuarter = null.

if ( FF2LAccuracyEligible == true)

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID 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 PriorAccuracy Record
.EndDate and the PriorAccuracy Record .ReinstallationDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set Current Accuracy Status = "OOC-Fuel Flow to Load Test Failed".

exit check.

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID 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 PriorAccuracy Record .EndDate and
the PriorAccuracy Record .ReinstallationDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set Current Accuracy Status = "OOC-Fuel Flow to Load Test Has Critical Errors".

exit check.

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID 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
PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set Current Accuracy Status = "Fuel Flow to Load Test Has Not Yet Been Evaluated".

exit check.

Locate the earliest record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID 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 PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

Environmental Protection Agency

Page 13 of 907


-------
Draft Check Specifications

12/16/2015

if ( FF2L TestRecordsByLocationForQAStatus is found)

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

else

Set FF2LAccuracyBeginYearQuarter = null

Locate the latest record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID 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 PriorAccuracy Record
.EndDate and the PriorAccuracy Record .ReinstallationDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

if ( FF2LAccuracyBeginYearQuarter is not null AND FF2L TestRecordsByLocationForQAStatus Year/Quarter >
FF2LAccuracyBeginYearQuarter)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set Current Accuracy Status = "OOC-Invalid Fuel Flow to Load Test".

exit check.

else if (FF2L TestRecordsByLocationForQAStatus .Year/Quarter is more than 4 quarters after the quarter of the
FF2LAccuracyCheckDate)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

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 FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .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 PriorAccuracy Record .EndDate and the PriorAccuracy Record .ReinstallationDate.

Set FF2LAccuracyEndYearQuarter = FF2L TestRecordsByLocationForQAStatus .Year & FF2L
TestRecordsByLocationForQAStatus . Quarter.

for each quarter between the FF2LAccuracyBeginYearQuarter and the FF2LA ccuracyEnd YearQuarter (inclusive)

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the quarter is equal to the quarter to check.

if ( FF2L TestRecordsByLocationForQAStatus is found)

if ( FF2L TestRecordsByLocationForQAStatus .TestResult = "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
quarter is equal to the quarter to check and the OpValue >= 168.

if ( OperatingSuppDataRecordsbyLocation is found)

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

Environmental Protection Agency

Page 14 of 907


-------
Draft Check Specifications

12/16/2015

If not found,

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set CurrentAccuracy 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 CurrentAccuracy Status = "Undetermined-Missing Fuel Flow to Load Test".

Exit check.

Usage:
1

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 15 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-6

Check Name:

Determine Accuracy Test Expiration Date

Related Former Checks:

Applicability:

Specifications:

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

Set PriorTestExpirationDate = PriorAccuracyRecord .TestExpirationDate.

for each quarter subsequent to the quarter of the later of the PriorAccuracyRecord .EndDate/Hour and the
PriorAccuracyRecord .ReinstallationDate/Hour and prior to the quarter of the CurrentOperatingDate/Hour

Set OSO Reporter to false.

Locate a Location ReportingFrequency record for the test location where ReportingFrequencyCode = " OS the Begin

Quarter is on or before the quarter being checked , and the End Quarter is null or is on or afte r 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.

else

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

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)

Add 1 quarter to the PriorTestExpirationDate.

else

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 ( OperatingSuppDataRecordsby Location .OpValue <= 168)

Add 1 quarter to the PriorTestExpirationDate.

Environmental Protection Agency

Page 16 of 907


-------
Draft Check Specifications

12/16/2015

else

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

if ( TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

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

if (FF2LAccuracyEligible == true and the quarter to check is between the FF2LAccuracyBeginYearQuarter and
the FF2LA ccuracyEnd YearQuarter (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 Component ID is equal to
the FuelFlowComponentRecordToCheck .Component ID, the reporting period is equal to the quarter to
check , AND the ExtensionExemptionCode is equal to " NONQADB " .

if ( TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

else if ( OSO Reporter == true and the quarter to check is the 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 Component ID is equal to
the FuelFlowComponentRecordToCheck .Component ID, the reporting period is equal to the quarter to
check , AND the ExtensionExemptionCode is equal to " NONQADB " .

if ( TestExtensionExemptionRecords is found)

Add 1 quarter to the PriorTestExpirationDate.

Environmental Protection Agency

Page 17 of 907


-------
Draft Check Specifications

12/16/2015

if ( CurrentOperatingDate/Hour > PriorTestExpirationDate )
if (AccuracyMissingOpDatalnfo is not null)

Set Current Accuracy Status = "Missing Op Data"

Return result CurrentAccuracy Status .
else if (FF2LAccuracyEligible == false)

Set CurrentAccuracy Status = "OOC-Accuracy Test Expired-Fuel Flow To Load Test Ignored".
Return result CurrentAccuracy Status .

else

Set CurrentAccuracy Status = "OOC-Accuracy Test Expired"

else

Set CurrentAccuracy Status = "IC-Extension"

If ( CurrentAccuracy Status does not begin with "IC" and is not null)
if ( CurrentAccuracy Status starts with "OOC" or "Undetermined" AND Invalid Accuracy Record is not null)

Set CurrentAccuracy Status = CurrentAccuracy Status &

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

Return result "Inappropriate Transmitter Transducer Test" // do \ul NOT\ulnone 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

Description

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 a prior fuel-
flow-to-load test for MonitoringSystemID [ID] with TestNumber
[ff21testnum] has not yet been evaluated.

The prior [testtype] for [key] with TestNumber [testnum] is a
transmitter/transducer 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 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.

The prior [testtype] for [key] with TestNumber [testnum] was aborted. An
invalid prior [testtype] with TestNumber [invtestnum] was ignored.

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

Severity

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

Environmental Protection Agency

Page 18 of 907


-------
Draft Check Specifications

12/16/2015

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

OOC-Fuel Flow to
Load Test Has
Critical Errors*

OOC-Invalid Fuel
Flow to Load Test

OOC-Invalid Fuel
Flow to Load Test*

The prior [testtype] for [key] with TestNumber [testnum] has expired. An
invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior [testtype] for [key] with TestNumber [testnum] has expired. A
prior 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.

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

The prior [testtype] for [key] with TestNumber [testnum] failed. An invalid
prior [testtype] with TestNumber [invtestnum] was ignored.

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

The prior [testtype] for [key] with TestNumber [testnum] has critical errors.
An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

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

You reported a QA Certification Event record for QACertEventCode [code]
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 test for MonitoringSystemID [ID] with TestNumber
[fl21testnum] has failed.

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

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

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

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

The [testtype] status for [key] could not be determined, because one or more
prior fuel-flow-to-load tests, including the test for MonitoringSystemID [ID]
with TestNumber [fl21testnum], 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 I test type I with TestNumber

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 19 of 907


-------
Draft Check Specifications

12/16/2015

OOC-No Prior
Accuracy Test

OOC-No Prior
Accuracy Test*

Undetermined-
Baseline Period
Expired

Undetermined-
Missing Fuel Flow
to Load Test

[invtestnum] was ignored.

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

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

The [testtype] status for [key] could not be determined, because, according to
the fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber
[ff21testnum], baseline data was still being collected after the deadline.

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report ¦

¦ Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 20 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-7

Check Name:

Determine if Component Requires a PEI Test

Related Former Checks:

Applicability:

Specifications:

Set PEIRequired = false.

if (PriorAccuracy Record is not null and PriorAccuracy Record .TestTypeCode is equal to "FFACCTT")
Set PEIRequired = true.

Usage:
1

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 21 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

Set CurrentPEI Status = null.

Set Prior PEI Record = null,
if (PEIRequired == true)

Locate the most recent record in PEI TestRecordsByLocationForQAStatus for the location where the ComponentID is
equal to the FuelFlowComponentRecordToCheck .ComponentID and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour

if (PEI TestRecordsByLocationForQAStatus is found)

Set Prior PEI Record = the found record in PEI TestRecordsByLocationForQAStatus .
if (Prior PEI Record .QANeedsEvaluationFlag = "Y")

Set CurrentPEI Status = " PEI Test Not Yet Evaluated",
else if (Prior PEI Record .TestResultCode is null)

Set CurrentPEI Status = "OOC- PEI Test Has Critical Errors",
else if (Prior PEI Record .TestResultCode = "FAILED")

Set CurrentPEI Status = "OOC- PEI Test Failed",
else if (Prior PEI Record .TestResultCode = "ABORTED")

Set CurrentPEI Status = "OOC- PEI Test Aborted".

else

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

Return result CurrentPEI Status .

ADESTAT-8

Locate Most Recent Prior PEI Test

Results:

Result

OOC-No Prior PEI
Test

OOC-PEI Test
Aborted

OOC-PEI Test
Failed

OOC-PEI Test Has
Critical Errors

PEI Test Not Yet
Evaluated

Description

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

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

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

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

Severity

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

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

Environmental Protection Agency

Page 22 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

Fuel Flowmeter QA Status Evaluation

Page 23 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-9

Check Name:

Locate Most Recent Prior PEI Event

Related Former Checks:

Applicability:

Specifications:

Set Prior PEI EventRecord = null.

If (PEIRequired == true AND CurrentPEI Status is null)

Locate the most recent record in QACertiflcationEventRecords WHERE

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

b)	PEIRequired is equal to "Y" AND

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

d)	the QACertEventDate/Hour is after the Prior PEI Record .EndDate/Hour .
if ( QACertiflcationEventRecords is found)

Set Prior PEI EventRecord = the found record in QACertiflcationEventRecords .

Set CurrentPEI Status = "OOC-Event".

else

Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the Prior PEI Record
.EndDate.

if ( CurrentOperatingDate is AFTER the PriorTestExpirationDate )

Set CurrentPEI Status = "OOC- PEI Test Expired".

else

Set PriorTestExpirationDate = 12 quarters after the end of the quarter of the Prior PEI Record .EndDate.
Set Prior PEI Record .TestExpirationDate = PriorTestExpirationDate .

If ( CurrentOperatingDate is ON OR BEFORE the PriorTestExpirationDate )

Set CurrentPEI Status = "IC".

If ( CurrentPEI Status starts with "OOC")

Return result CurrentPEI Status .

Results:

Result

Description

Severity

OOC-Event

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.

Critical Error Level 1

OOC-PEI Test
Expired

Critical Error Level 1

Usage:

Environmental Protection Agency

Page 24 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 25 of 907


-------
Draft Check Specifications

12/16/2015

Check Name:

Check Code:

ADESTAT-10

Determine Eligibility for Fuel Flow to Load Testing (PEI)

Related Former Checks:

Applicability:

Specifications:

Set FF2LPEIEligible = null
Set FF2LPEICheckDate = null.

if (PEIRequired == true AND CurrentPEIStatus is null)

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID 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 PriorPEIRecord .EndDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set FF2LPEIEligible = true.

Set FF2LPEICheckDate = PriorPEIRecord EndDate.
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 .EndDate.

if (Accuracy TestRecordsByLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the Accuracy

TestRecordsByLocationForQAStatus .EndDate and the Accuracy TestRecordsByLocationForQAStatus
.ReinstallationDate.

if ( FuelFlowComponentRecords .ComponentID is not equal to FuelFlowComponentRecordToCheck
.ComponentID AND Accuracy TestRecordsByLocationForQAStatus .TestTypeCode is equal to
"FFACCTT")

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

if (PEI TestRecordsByLocationForQAStatus is not found)

Set FF2LPEIEligible = false, and exit check.

else

else

Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the PEI

TestRecordsByLocationForQAStatus .EndDate.

Usage:

Environmental Protection Agency

Page 26 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 27 of 907


-------
Draft Check Specifications

12/16/2015

Check Name:

Check Code:

ADESTAT-11

Evaluate Fuel Flow to Load Tests (PEI)

Related Former Checks:

Applicability:

Specifications:

Set FF2LPEIBeginYearQuarter = null.

Set FF2LPEIEndYearQuarter = null.

if (FF2LPEIEligible == true)

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the TestResult Code 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

if ( FF2L TestRecordsByLocationForQAStatus is found)

Locate a record in QACertiflcationEventRecords WHERE

a)	the Component ID is equal to the FuelFlowComponentRecordToCheck . Component 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
TestRecordsByLocationForQAStatu s record.

e)	the QACertEventDate /Hour is prior to the CurrentOperatingDate/Hour
if ( QACertiflcationEventRecords is not found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set CurrentPEIStatus = "OOC-Fuel Flow to Load Test Failed".

Return result CurrentPEI Status .

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the TestResult Code 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 Prior PEIRecord .EndDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set CurrentPEI Status = "OOC-Fuel Flow to Load Test Has Critical Errors".

Return result CurrentPEI Status .

Locate any record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID 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 Prior PEIRecord

.EndDate.

.EndDate.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Environmental Protection Agency

Page 28 of 907


-------
Draft Check Specifications

12/16/2015

Set CurrentPEIStatus = "Fuel Flow to Load Test Has Not Yet Been Evaluated".

Return result CurrentPEI Status .

Locate the earliest record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to
the FuelFlowComponentRecordToCheck .SystemID and the TestResult Code 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.

if ( FF2L TestRecordsByLocationForQAStatus is found)

Set FF2LPEIBeginYearQuarter = FF2L TestRecordsByLocationForQAStatus .Year & FF2L
TestRecordsByLocationForQAStatus . Quarter.

else

Set FF2LPEIBeginYearQuarter = null

Locate the latest record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the TestResult Code 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 ( FF2L TestRecordsByLocationForQAStatus is found)

if (Set FF2LPEIBeginYearQuarter is not null AND FF2L TestRecordsByLocationForQAStatus Year/Quarter >
FF2LPEIBeginYearQuarter)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

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

Return result CurrentPEI Status .

else if (FF2L TestRecordsByLocationForQAStatus .Year/Quarter is more than 4 quarters after the quarter of the
FF2LPEICh eckDate)

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber

Set CurrentPEI Status = "Undetermined-Baseline Period Expired".

Return result CurrentPEI Status .

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

Locate the latest record in FF2L TestRecordsByLocationForQAStatus for the location where the System ID is equal to the
FuelFlowComponentRecordToCheck .SystemID and the TestResult Code 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 FF2LPEIEndYearQuarter = FF2L TestRecordsByLocationForQAStatus .Year & FF2L
TestRecordsByLocationForQAStatus . Quarter.

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

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

if ( FF2L TestRecordsByLocationForQAStatus is found)

if (FF2L TestRecordsByLocationForQAStatus .CalculatedTestResult = "FEW168H")

Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to

Environmental Protection Agency

Page 29 of 907


-------
Draft Check Specifications

12/16/2015

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 FF2LBaseline RecordsByLocationForQAStatus for the location where the System
ID is equal to the FuelFlowComponentRecordToCheck .SystemID, and the EndDate is within the
quarter being checked.

If not found,

Set InvalidFF2L TestNumber = FF2L TestRecordsByLocationForQAStatus .TestNumber
Set CurrentPEIStatus = "OOC-Invalid Fuel Flow to Load Test".

Return result CurrentPEI Status .

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

if ( OperatingSuppDataRecordsbyLocation is found)

Set MissingFF2LYearQuarter equal to the year/quarter to check.

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

Return result CurrentPEI Status .

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-
Baseline Period
Expired

Undetermined-
Missing Fuel Flow
to Load Test

Description

The [testtype] status for [key] could not be determined, because a prior fuel-
flow-to-load test for MonitoringSystemID [ID] with TestNumber
[ff21testnum] has not yet been evaluated.

The [testtype] status for [key] could not be determined, because a prior fuel-
flow-to-load test for MonitoringSystemID [ID] with TestNumber
[ff21testnum] has failed.

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

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

The [testtype] status for [key] could not be determined, because, according to
the fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber
[fl21testnum], baseline data was still being collected after the deadline.

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

Severity

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

Critical Error Level 2

Critical Error Level 1

Usage:

Environmental Protection Agency

Page 30 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 31 of 907


-------
Draft Check Specifications

12/16/2015

Check Name:

Check Code:

ADESTAT-12

Determine PEI Test Expiration Date

Related Former Checks:

Applicability:

Specifications:

Set PEIMissingOpDatalnfo = null.

if (PEIRequired == true AND CurrentPEI Status is null)

Set PriorTestExpirationDate = PriorPEIRecord .TestExpirationDate.

for each quarter subsequent to the quarter of the PriorPEIRecord .EndDate and prior to the quarter of the
CurrentOperatingDate

Set OSO Reporter to false.

Locate a Location ReportingFrequency record for the test location where ReportingFrequencyCode = " OS the Begin
Quarter is on or before the quarter being checked , and the End Quarter is null or is on or afte r 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))

Add 1 quarter to the PriorTestExpirationDate.

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

if (FF2LPEIEligible == 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 CurrentPEI Status = "Missing Op Data"

else if (FF2LPEIEligible == false)

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

else

Set CurrentPEI Status = "OOC-PEI Test Expired"

Return result CurrentPEI Status .

else

Set CurrentPEI Status = "IC-Extension"

Results:

Environmental Protection Agency

Page 32 of 907


-------
Draft Check Specifications

12/16/2015

Result

Missing Op Data

OOC-PEI Test
Expired

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

Usage:

1

Description

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

Emissions Data Evaluation Report ¦

¦ Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 33 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

ADESTAT-13

Check Name:

Determine System Appendix D Status

Related Former Checks:

Applicability:

Specifications:

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

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 (PEIRequired == 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")

Environmental Protection Agency	Page 34 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:
1

Emissions Data Evaluation Report

Fuel Flowmeter QA Status Evaluation

Environmental Protection Agency

Page 35 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-1

Check Name:

Determine Need for Daily C02 Emissions Record

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 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 \ldblquote C02\rdblquote

FSA Method Count = Active records in MonitoringMethodData for the location and date where
ParameterCode = \ldblquote C02M\rdblquote 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 DailyEmissionsData record
If (Daily Op Time == 0)

Environmental Protection Agency	Page 36 of 907


-------
Draft Check Specifications

12/16/2015

return result E

Results:

Result
A

B
C

D

E

Usage:

1

Description

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

You reported more than one Daily Emissions record for [param] for the day.

You reported a Daily Emissions record for C02M, but you did not report an
active C02M FSA method record in your monitoring plan for the day.

You did not report a Daily Emissions record for C02M for the day.

You reported a Daily Emissions record for C02M, but this is not appropriate
for a non-operating day.

Emissions Data Evaluation Report	C02 Daily Emissions

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 37 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-2

Check Name:

Check Total Daily Emissions Value

Related Former Checks:

Applicability:

Specifications:

Set Calc TDE to null.

If ( Current C02 Mass Daily Record is not null)

If ( Current C02 Mass Daily Record .TotalDailyEmissions >= 0 AND Rpt Period C02 Mass Reported Accumulator Array
for the location >= 0)

Rpt Period C02 Mass Reported Accumulator Array for the location = Rpt Period C02 Mass Reported Accumulator
Array for the location + Current C02 Mass Daily Record .TotalDailyEmissions

i f ( Current C02 Mass Daily Record. Una djustedDailyEmissions is not null OR Calc C02 Unadj is not null)

i f ( Current C02 Mass Daily Record. AdjustedDailyEmissions is null)

Calc TDE = Calc C02 Unadj

else i f ( Current C02 Mass Daily Record. Una djustedDailyEmissions is not null AND Current C02 Mass Daily
Record .AdjustedDailyEmissions is greater than or equal to 0 AND is less than or equal to Current C02 Mass Daily
Record .UnadjustedDailyEmissions)

Calc TDE = Current C02 Mass Daily Record .AdjustedDailyEmissions

else if ( Current C02 Mass Daily Record .AdjustedDailyEmissions is greater than or equal to 0)

Calc TDE = Current C02 Mass Daily Record .AdjustedDailyEmissions

If ( Calc TDE is not null)

If ( Current C02 Mass Daily Record. SorbentRelatedMassEmissions is not null)

If ( Current C02 Mass Daily Record .SorbentRelatedMassEmissions >= 0)

else if ( Current C02 Mass Daily Record .UnadjustedDailyEmissions is null AND Legacy Data Evaluation == true AND
Current C02 Mass Daily Record .TotalDailyEmissions >= 0)

Calc TDE = Current C02 Mass Daily Record TotalDailyEmissions

If( Cede T1)E 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 .TotalDailyEmissions >= 0)

Environmental Protection Agency	Page 38 of 907

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

else

Set Calc TDE to null.


-------
Draft Check Specifications

12/16/2015

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 .TotalDailyEmissions - Calc TDE) > Tolerance )
return result A

else

return result C

else

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

Results:

Result
A

B

C

Usage:

1

Description

The [fieldname] reported in the Daily Emissions record for [param] is
inconsistent with the recalculated value.

The [fieldname] reported in the Daily Emissions record for [param] is
invalid. The value must be greater than or equal to 0.

The TotalDailyEmissions in the Daily Emissions record for [param] could
not be recalculated due to other errors listed in this report.

Emissions Data Evaluation Report	C02 Daily Emissions

Severity

Critical Error Level 1
Critical Error Level 1
Informational Message

Environmental Protection Agency

Page 39 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-3

Check Name:

Check Adjusted Daily Emissions Value

Related Former Checks:

Applicability:

Specifications:

if ( Current C02 Mass Daily Record is not null),

if ( Current C02 Mass Daily Record. AdjustedDailyEmissions is not null),

If ( Current C02 Mass Daily Record .AdjustedDailyEmissions is less than 0),

If ( Current C02 Mass Daily Record .UnadjustedDailyEmissions is greater than or equal to 0 AND is less than
Current C02 Mass Daily Record .AdjustedDailyEmissions),

return result B

return result A

else

Results:

Result

Description

Severity

A

The [fieldname] reported in the Daily Emissions record for [param] is
invalid. The value must be greater than or equal to 0.

The AdjustedDailyEmissions in the Daily Emissions record for [param] is
greater than the UnadjustedDailyEmissions. The adjusted value should be
less than the unadjusted value.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 40 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-4

Check Name:

Check Sorbent Related Emissions

Related Former Checks:

Applicability:

Specifications:

if ( Current C02 Mass Daily Record is not null),

if ( Current C02 Mass Daily Record. SorbentRelatedMassEmissions is not null AND is less than 0),
return result A

Results:

Result

Description

The [fieldname] reported in the Daily Emissions record for [param] is
invalid. The value must be greater than or equal to 0.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 41 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-5

Check Name:

Validate Presence of Adjusted Daily Emissions

Related Former Checks:

Applicability:

Specifications:

if ( Current C02 Mass Daily Record) is not null

if ( Current C02 Mass Daily Record. AdjustedDailyEmissions 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

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 42 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-6

Check Name:

Validate Presence of Sorbent Related Emissions

Related Former Checks:

Applicability:

Specifications:

if ( Current C02 Mass Daily Record) is not null

if ( Current C02 Mass Daily Record. SorbentRelatedMassEmissions is not null),

Missing C02M Formula = null

Locate a Monitor Formula record for the location and hour where the ParameterCode is equal to 'C02M" and the
FormulaCode is equal to "G-5" or "G-6".

If not found,

Set Missing C02M Formula 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 C02M Formula .

If (Missing C02M Formula is not null)

return result A.

Results:

Result

Description

Severity

A

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

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 43 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-7

Check Name:

Check Unadjusted Daily Emissions Value

Related Former Checks:

Applicability:

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 Daily Record .UnadjustedDailyEmissions is null OR is less than 0)
return result A

else i f ( Current C02 Mass Daily Record .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 Record .UnadjustedDailyEmissions - Calc C02 Unadj) > Tolerance )
return result B

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

If (Legacy Data Evaluation == false)
return result A.

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

else

Set Calc C02 Unadj to Current C02 Mass Daily Record .UnadjustedDailyEmissions .

Results:

Result

Description

Severity

A

The [fieldname] reported in the Daily Emissions record for [param] is
invalid. The value must be greater than or equal to 0.

The [fieldname] reported in the Daily Emissions record for [param] is
inconsistent with the recalculated value.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions

Environmental Protection Agency

Page 44 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAILY-8

Check Name:	Check Fuel in Daily Fuel Record

Related Former Checks:

Applicability:	General Check

Specifications:

Locate UnitFuel record for the location and day

where FuelCd = Current Daily Fuel Record .UnitFuelCd
If not found,
return result A

Results:

Result	Description	Severity

A	You did not report an active Unit Fuel record for FuelCode [fueled] in your Critical Error Level 1

monitoring plan.

Usage:

1	Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 45 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-9

Check Name:

Check Daily Fuel Feed

Related Former Checks:

Applicability:

Specifications:

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

else if ( Current Daily Fuel Record. DailyFuelFeed is less than or equal to 0)
return result A.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 46 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-10

Check Name:

Check Carbon Content Used

Related Former Checks:

Applicability:

Specifications:

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

else if ( Current Daily Fuel Record. CarbonContentUsed is less than or equal to 0 or greater than 100 )
return result A.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 47 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-11

Check Name:

Check Fuel Carbon Burned

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 Calc Fuel Carbon Burned = null

if ( Current Daily Fuel Record .DailyFuelFeed is greater than 0 and Current Daily Fuel Record .CarbonContentUsed is greater
than 0 and less than or equal to 100)

Calculate Calc Fuel Carbon Burned = Current Daily Fuel Record .DailyFuelFeed * Current Daily Fuel Record
.CarbonContentUsed /100, and round the result to 1 decimal place.

If Calc Total Carbon Burned is greater than or equal to 0,

Add Calc Fuel Carbon Burned to Calc Total Carbon Burned.

else

Set Calc Total Carbon Burned to -1.

if ( Current Daily Fuel Record .FuelCarbonBurned is null)

return result A.

else if ( Current Daily Fuel Record. FuelCarbonBurned is less than or equal to 0)
return result A.

else if ( Calc Fuel Carbon Burned is not null AND Current Daily Fuel Record . FuelCarbonBurned <> Calc Fuel
Carbon Burned)

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

if (ABS( Current Daily Fuel Record . FuelCarbonBurned - Calc Fuel Carbon Burned) > Tolerance )

return result B.

Results:

Result

Description

Severity

A

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

The [fieldname] in the Daily Fuel record for [key] is inconsistent with the
recalculated value.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Daily Emissions Fuel

Environmental Protection Agency

Page 48 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAILY-12

Check Name:

Intialize Daily Emissions

Related Former Checks:

Applicability:

Specifications:

Set Calc Total Carbon Burned to 0.

Daily Op Time Accumulator Array for the location = 0 .

Usage:
1

Emissions Data Evaluation Report — C02 Daily Emissions Initialization

Environmental Protection Agency

Page 49 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAILY-13

Check Name:	Check Total Carbon Burned

Related Former Checks:

Applicability:

Specifications:

Set Calculate C02M TDE to true.

if ( Current C02 Mass Daily Record .TotalCarbonBurned is null)
if ( Calc Total Carbon Burned is not equal to 0)
return result A.

else if ( Current C02 Mass Daily Record. TotalCarbonBurned is less than 0)
return result B .
else

if ( Calc Total Carbon Burned is greater than 0 AND Current C02 Mass Daily Record. TotalCarbonBurned <> Calc
Total Carbon Burned)

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

if (ABS( Current C02 Mass Daily Record . TotalCarbonBurned - 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 . TotalCarbonBurned.

Results:

Result
A

B

C

Usage:

1

Description

You did not report TotalCarbonBurned in the Daily Emission record for
C02M. You must report this value if you report Daily Fuel records.

The [fieldname] reported in the Daily Emissions record for [param] is
invalid. The value must be greater than or equal to 0.

The [fieldname] reported in the Daily Emissions record for [param] is
inconsistent with the recalculated value.

Emissions Data Evaluation Report	C02 Daily Emissions

Severity

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

Environmental Protection Agency

Page 50 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-1

Check Name:	Daily Calibration Test Component Type Check

Related Former Checks:

Applicability:	CEM Check

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

A

B

C

Usage:

1

Description

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

The ComponentTypeCode in the monitoring plan is [comptype]. This type of
component does not require a calibration test. Only component types 'S02',
'NOX', 'C02', '02', "HG", or 'FLOW' may have a daily calibration test.

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

Emissions Data Evaluation Report	Daily Calibration Test

Severity
Fatal

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 51 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 52 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-2

Check Name:

Related Former Checks:

Aborted and Incomplete Daily Calibration Test Check

Applicability:
Specifications:

CEM Check

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

Description

Severity

A

The TestResultCode indicates that the [type] test for [key] was aborted. If the Informational Message
test was aborted for a reason not related to monitor performance, you should
not report the test.

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 53 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-3

Check Name:

Online Offline Indicator Valid

Related Former Checks:
Applicability:

CEM Check

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.

else

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

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

else

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

If not found,

Set Ignored Daily Calibration Tests to true.

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

set Daily Cal Calc Result to "IGNORED"

Otherwise,

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

Environmental Protection Agency

Page 54 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:
1

Description

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

No Errors

Critical Error Level 2

Critical Error Level 1

Environmental Protection Agency

Page 55 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-4

Check Name:

Related Former Checks:

Test Span Scale Valid

Applicability:
Specifications:

CEM Check

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, \cfl\f2\fs23 \cfl) \fs20 i f 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 i f 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:

Environmental Protection Agency

Page 56 of 907


-------
Draft Check Specifications

12/16/2015

Result

A

B

C

D

Description

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

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

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

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

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 57 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-5

Check Name:

Determine Span Value

Related Former Checks:
Applicability:

CEM Check

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

If found,

else

return result C.

Results:

Result

Description

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

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

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

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:

Environmental Protection Agency

Page 58 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 59 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-6

Check Name:

Daily Calibration Test Upscale Gas Level Code Valid

Related Former Checks:
Applicability:

CEM Check

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

Description

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

Severity

A

Critical Error Level 1

B

C

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

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

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 60 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-7

Check Name:	Reference Values Consistent with Calibration Gas Levels

Related Former Checks:

Applicability:	CEM Check

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

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

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.

Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 61 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-8

Check Name:	Zero Measured Value Valid

Related Former Checks:

Applicability:	CEM Check

Specifications:

For the daily calibration test with a zero injection:
If ZeroMeasuredValue is null,
return result A.

Results:

Severity

Critical Error Level 1

Result	Description

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

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 62 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-9

Check Name:	Zero Reference Value Valid

Related Former Checks:

Applicability:	CEM Check

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:

Result

A

B

Usage:

1

Description

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

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 63 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-10

Check Name:	Zero Calibration Error Valid

Related Former Checks:

Applicability:	CEM Check

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

A

B

Usage:

1

Description

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

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 64 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-11

Check Name:	Zero APS Indicator Valid

Related Former Checks:

Applicability:	CEM Check

Specifications:

For the daily calibration test with a zero injection:
If ZeroAPSIndicator is null,
return result A.

Results:

Severity

Critical Error Level 1

Result	Description

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

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 65 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-12

Check Name:	Upscale Measured Value Valid

Related Former Checks:

Applicability:	CEM Check

Specifications:

For the daily calibration test with an upscale injection:
If UpscaleMeasuredValue is null,
return result A.

Results:

Severity

Critical Error Level 1

Result	Description

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

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 66 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-13

Check Name:	Upscale Reference Value Valid

Related Former Checks:

Applicability:	CEM Check

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:

Result	Description

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.

Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 67 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-14

Check Name:	Upscale Calibration Error Valid

Related Former Checks:

Applicability:	CEM Check

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:

Result

A

B

Usage:

1

Description

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

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 68 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-15

Check Name:	Upscale APS Indicator Valid

Related Former Checks:

Applicability:	CEM Check

Specifications:

For the daily calibration test with an upscale injection:
If UpscaleAPSIndicator is null,
return result A.

Results:

Severity

Critical Error Level 1

Result	Description

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

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 69 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-16

Check Name:

Related Former Checks:

Upscale Injection Time Valid

Applicability:
Specifications:

CEM Check

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

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 70 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-17

Check Name:	Zero Injection Time Valid

Related Former Checks:

Applicability:	CEM Check

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 i f Legacy Data Evaluation == false , the UpscalelnjectionDate is not null, the UpscalelnjectionHour is between 0 and
23, the UpscalelnjectionMinute is between 0 and 59, and the UpscalelnjectionDate, UpscalelnjectionHour, and
UpscalelnjectionMinute are equal to the ZeroInjectionDate, ZeroInjectionHour , and ZeroInjectionMinute , and the
associated ComponentTypeCode is not equal to "FLOW"

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

Otherwise,

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.

Results:

Result

A

B

C

D

Usage:

1

Description

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Environmental Protection Agency

Page 71 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-18

Check Name:

Related Former Checks:

Zero Reference Value Consistent with Span

Applicability:
Specifications:

CEM Check

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

Description

Severity

A

The tag value of at least one Zero level reference signal or calibration gas for Critical Error Level 2
[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.

B

The tag value of at least one zero level reference signal or calibration gas for Non-Critical Error
[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.

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 72 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-19

Check Name:

Related Former Checks:

Upscale Reference Value Consistent with Span

Applicability:
Specifications:

CEM Check

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,

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

Otherwise,

return result D.

Otherwise,

return result F.

Results:

Environmental Protection Agency

Page 73 of 907


-------
Draft Check Specifications

12/16/2015

Result
A

B

Description

The tag value of at least one Mid level reference signal or calibration gas for
[key] is [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 [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.

Severity

Critical Error Level 2

Non-Critical Error

C	The tag value of at least one High level reference signal for [key] is	Critical Error Level 2

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

D	The tag value of at least one High level reference signal for [key] is	Non-Critical Error

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

Critical Error Level 2

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.

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 74 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-20

Check Name:	Calculate Zero Gas Injection or Reference Signal Results

Related Former Checks:

Applicability:	CEM Check

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

Environmental Protection Agency

Page 75 of 907


-------
Draft Check Specifications

12/16/2015

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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( diff / Daily Cal Span Value * 100, 1), 9999.9)

Round diff to 1 decimal places.

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

set Daily Cal Zero Injection Calc Result to diff.

set Daily Cal Zero Injection Calc APS Indicator to 1.

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

Otherwise,

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

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

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

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

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

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

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

Environmental Protection Agency

Page 76 of 907


-------
Draft Check Specifications

12/16/2015

If (Daily Cal Injection Time s 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 and ZeroCalibrationError is greater than or equal to 0, and (
Daily Cal Span Value is less than or equal to 50 AND ZeroCalibrationError is less than or
equal to 5.0) OR (Daily Cal Span Value is greater than 50 AND Daily Cal Span Value is less
than or equal to 200 AND ZeroCalibrationError is less than or equal to 10.0)))

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

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

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

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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 Time s 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

Environmental Protection Agency

Page 77 of 907


-------
Draft Check Specifications

12/16/2015

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 between Daily Cal Zero Injection Calc Result and
ZeroCalibrationError is less than or equal to the Tolerance in the cross-check record)

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

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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.

Environmental Protection Agency	Page 78 of 907


-------
Draft Check Specifications

12/16/2015

set Daily Cal Fail Hour to Zerolnjection Hour.

Otherwise,

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

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

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

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

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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 Time s 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 ")

Environmental Protection Agency

Page 79 of 907


-------
Draft Check Specifications

12/16/2015

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

Round diff to 1 decimal places.

If (Daily Cal Zero Injection Calc Result is greater than 5.0, AND diff is less than or equal to 1.0)
set Daily Cal Zero Injection Calc Result to diff.
set Daily Cal Zero Injection Calc APS Indicator to 1.

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

Otherwise,

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

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

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

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

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

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

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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 and 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 "Difference UGSCM ".

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

Environmental Protection Agency	Page 80 of 907


-------
Draft Check Specifications

12/16/2015

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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 Time s 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

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

Description

The software could not evaluate the [test] calculations reported for [key],
because of the errors listed above.

Severity

Informational Message

A

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 81 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-21

Check Name:	Calculate Upscale Gas Injection or Reference Signal Results

Related Former Checks:

Applicability:	CEM Check

Specifications:

For the daily calibration test with an upscale injection:

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

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

Otherwise,

Calculate diff= abs(UpscaleMeasuredValue - UpscaleReferenceValue)

Set Daily Cal Upscale Injection Calc APS Indicator to 0.

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

Round diff to 1 decimal place.

Set Daily Cal Upscale Injection Calc Result to diff.

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

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

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

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

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

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

set Daily Cal Calc Result to "PASSED".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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.

Environmental Protection Agency

Page 82 of 907


-------
Draft Check Specifications

12/16/2015

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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( diff / Daily Cal Span Value * 100, 1), 9999.9)

Round diff to 1 decimal places.

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

set Daily Cal Upscale Injection Calc Result to diff.

set Daily Cal Upscale Injection Calc APS Indicator to 1.

If (Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "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 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".

Environmental Protection Agency

Page 83 of 907


-------
Draft Check Specifications

12/16/2015

If (Daily Cal Injection Time s 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 (UpscaleAPSIndicator is equal to 1 and UpscaleCalibrationError is greater than or equal to 0,
and (Daily Cal Span Value is less than or equal to 50 AND UpscaleCalibrationError is less
than or equal to 5.0) OR (Daily Cal Span Value is greater than 50 AND Daily Cal Span
Value is less than or equal to 200 AND UpscaleCalibrationError is less than or equal to 10.0)))

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

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

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

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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 Time s 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

Environmental Protection Agency	Page 84 of 907


-------
Draft Check Specifications

12/16/2015

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(difT/ Daily Cal Span Value * 100, 1), 9999.9).
Round diff to 2 decimal places.

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

set Daily Cal Upscale Injection Calc Result to diff.

set Daily Cal Upscale Injection Calc APS Indicator to 1.

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

Otherwise,

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

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

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

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

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

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

set Daily Cal Calc Result to "PASSED".

Otherwise,

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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.

Environmental Protection Agency	Page 85 of 907


-------
Draft Check Specifications

12/16/2015

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 Time s 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 Time s 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 "INC" or "FAILED", or "PASSAPS" or "IGNORED")
set Daily Cal Calc Result to "PASSED".

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

Environmental Protection Agency

Page 86 of 907


-------
Draft Check Specifications

12/16/2015

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

If (Daily Cal Upscale Injection Calc Result is greater than 5.0, AND 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 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 Time s 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 (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 "Difference UGSCM ".

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

Environmental Protection Agency	Page 87 of 907


-------
Draft Check Specifications

12/16/2015

set Daily Cal Calc Result to "PASSAPS".

else

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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.

set Daily Cal Calc Result to "FAILED".

If (Daily Cal Injection Time s 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

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

Description

The software could not evaluate the [test] calculations reported for [key],
because of the errors listed above.

Severity

Informational Message

A

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 88 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-22

Check Name:	Daily Calibration Test End Time Valid

Related Former Checks:

Applicability:	CEM Check

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

A	You reported a test Date, Hour, and Minute that is not the same as the Date, Critical Error Level 1

Hour, and Minute of the last injection in the daily calibration test for [key].

Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 89 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-23

Check Name:

Related Former Checks:

Reported Zero Injection Results Consistent with Recalculated Values

Applicability:
Specifications:

CEM Check

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 "Difference UGSCM

If the absolute value of the difference between the Daily Cal Zero Injection Calc Result and the

Environmental Protection Agency

Page 90 of 907


-------
Draft Check Specifications

12/16/2015

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

Description

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.

Severity

Critical Error Level 1

B	You reported a value of "1" as the [level] APS Indicator for [key], but you Critical Error Level 1

must use the standard performance specification criteria for S02 and NOX
components when the instrument span is greater than or equal to 200.

C	You reported a value of "1" as the [level] APS Indicator for [key], but you Critical Error Level 1

must use the standard performance specification criteria for C02 and 02
components.

D

You did not report a value of "1" in the [level] APS Indicator for [key],
although EPA applied the alternative performance specification to determine
that the injection passed the applicable performance specification.

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

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 91 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-24

Check Name:

Related Former Checks:

Reported Upscale Injection Results Consistent with Recalculated Values

Applicability:
Specifications:

CEM Check

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, i f 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 "Difference UGSCM

If the absolute value of the difference between the Daily Cal Upscale Injection Calc Result and the

Environmental Protection Agency

Page 92 of 907


-------
Draft Check Specifications

12/16/2015

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

Description

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.

Severity

Critical Error Level 1

B	You reported a value of "1" as the [level] APS Indicator for [key], but you Critical Error Level 1

must use the standard performance specification criteria for S02 and NOX
components when the instrument span is greater than or equal to 200.

C	You reported a value of "1" as the [level] APS Indicator for [key], but you Critical Error Level 1

must use the standard performance specification criteria for C02 and 02
components.

D

You did not report a value of "1" in the [level] APS Indicator for [key],
although EPA applied the alternative performance specification to determine
that the injection passed the applicable performance specification.

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

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 93 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-25

Check Name:	Determination of Overall Daily Calibration Test Result

Related Former Checks:

Applicability:	CEM Check

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

Usage:
1

Description

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 94 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DAYCAL-26

Check Name:

Upscale Gas Type Code Valid

Related Former Checks:
Applicability:

CEM Check

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 Cal PGVP Rule Date to System Parameter Param Value 1.

If UpscaleGasTypeCode is null,

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

UpscaleGasTypeValid = false.

return result A.

If the ComponentTypeCode of the associated component is equal to "FLOW", "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,

Otherwise,

UpscaleGasTypeValid = false

return result E.

Environmental Protection Agency

Page 95 of 907


-------
Draft Check Specifications

12/16/2015

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

UpscaleGasTypeValid = false

return result F.

Mine

Results:

Result
A

B

C

D

E
F

Usage:
1

Description

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.

Emissions Data Evaluation Report	Daily Calibration Test

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

Environmental Protection Agency

Page 96 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-27

Check Name:	Cylinder ID Valid

Related Former Checks:

Applicability:	CEM Check

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

C

Usage:

1

Description

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 cylinder gas, but you reported a Cylinderldentifier.

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

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Non-Critical Error

Environmental Protection Agency

Page 97 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-28

Check Name:	Vendor ID Valid

Related Former Checks:

Applicability:	CEM Check

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", \f2\fs22 "SRM",
"NTRM", "GMIS", "RGM", or "PRM", \fs20

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", \f2\fs22 "SRM", "NTRM", "GMIS", "RGM", or "PRM", \fs20
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

A

B

C

D

Description

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

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

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

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

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

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 2

Non-Critical Error

Environmental Protection Agency

Page 98 of 907


-------
Draft Check Specifications	12/16/2015

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

participating in the Protocol Gas Verification Program.

Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

Environmental Protection Agency

Page 99 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-29

Check Name:	Cylinder Expiration Date Valid

Related Former Checks:

Applicability:	CEM Check

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

C
D

Usage:
1

Description

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.

Emissions Data Evaluation Report	Daily Calibration Test

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 2
Critical Error Level 2

Non-Critical Error

Environmental Protection Agency

Page 100 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DAYCAL-30

Check Name:	Upscale Gas Type Code Components Valid

Related Former Checks:	2013 Q1 replacement for DAYCAL-26

Applicability:	CEM Check
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 Cal PGVP Rule Date to System Parameter Param Value 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,

Environmental Protection Agency	Page 101 of 907


-------
Draft Check Specifications

12/16/2015

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.

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

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

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

if Protocol Gas Exclusive Component List is null, and Balance Component Count is equal to 0,
set UpscaleGasTypeValid = false,
return result J.

if Protocol Gas Exclusive Component List is null, and Balance Component Count is greater than 1,
set UpscaleGasTypeValid = false,
return result K.

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

Environmental Protection Agency	Page 102 of 907

Else

Else

Else

Else

Else

Else


-------
Draft Check Specifications

12/16/2015

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

Description

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

Environmental Protection Agency

Page 103 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

Daily Calibration Test

Page 104 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DCSTAT-1

Check Name:	Locate Most Recent Prior Daily Calibration Test

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set Prior DailyCal Record = null.

Set Invalid DailyCal Record = null.

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "Y" AND

c)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DailyCal TestRecordsByLocationForQAStatus is found)

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

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	t he ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "N" AND

c)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

if (DailyCal TestRecordsByLocationForQAStatus is found AND EndDate/Hour/Min is greater than the Prior DailyCal
Record .EndDate/Hour /Min)

Set Invalid DailyCal Record = the found record in DailyCal TestRecordsByLocationForQAStatus .

else

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	t he ComponentID is equal to the ApplicableComponentID AND

b)	ValidFlag is equal to "N" AND

c)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DailyCal TestRecordsByLocationForQAStatus is found)

Set Invalid DailyCal Record = the found record in DailyCal TestRecordsByLocationForQAStatus .

Usage:

1	Emissions Data Evaluation Report	C02 Daily Calibration Status Evaluation

2	Emissions Data Evaluation Report	FLOW Daily Calibration Status Evaluation

3	Emissions Data Evaluation Report	Hg Daily Calibration Status Evaluation

4	Emissions Data Evaluation Report	NOX Daily Calibration Status Evaluation

5	Emissions Data Evaluation Report	02 Dry Daily Calibration Status Evaluation

Environmental Protection Agency

Page 105 of 907


-------
Draft Check Specifications	12/16/2015

6	Emissions Data Evaluation Report	02 Wet Daily Calibration Status Evaluation

7	Emissions Data Evaluation Report	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 106 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DCSTAT-2

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set Prior DailyCal EventRecord = null.

Set CurrentDailyCalStatus = null.

Locate the most recent record in QACertiflcationEventRecords 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)	Prior DailyCal Record is null AND the QACertEventDate/Hour is in the CurrentReportingPeriod OR

b)	QACertEventDate/Hour is after the Prior DailyCal Record .EndDate/Hour
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 ( QACertiflcationEventRecords is found)

Set Prior DailyCal EventRecord = the found record in QACertiflcationEventRecords

if (Prior DailyCal Record 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)

S et Current DailyCal Status = "IC-Undetermined".

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

S et Current DailyCal Status = "IC-Undetermined".

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 HourlyOpData .Date/Hour and the CurrentDateHour is

If (Prior DailyCal EventRecord is null)

else

Environmental Protection Agency

Page 107 of 907


-------
Draft Check Specifications

12/16/2015

less than 8)

S et Current DailyCal Status = "IC-Undetermined".

else

S et Current DailyCal Status = "OOC-No Prior Test".

else

S et Current DailyCal Status = "OOC-No Prior Test".

else

if (Prior DailyCal Record .TestResultCode = null)

Set Current DailyCal Status = "OOC-Test Has Critical Errors",
else if (Prior DailyCal Record .TestResultCode = "FAILED")

Set Current DailyCal Status = "OOC-Test Failed",
else if (Prior DailyCal Record .TestResultCode = "ABORTED")

Set Current DailyCal Status = "OOC-Test Aborted".

else

S et Current DailyCal Status = "OOC- Event".

if (Invalid DailyCal Record is not null and Invalid DailyCal Record EndDate/Hour is BEFORE the Prior DailyCal
EventRecord .QACertEventDate/Hour)

Set Invalid DailyCal Record = null.

Usage:

1

Emissions Data Evaluation Report	

	C02 Daily Calibration Status Evaluation

2

Emissions Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

3

Emissions Data Evaluation Report	

	Hg Daily Calibration Status Evaluation

4

Emissions Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

5

Emissions Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

6

Emissions Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

7

Emissions Data Evaluation Report	

	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 108 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	DCSTAT-3

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

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set OnlineDailyCalRecord to null,
if ( Current Daily Cal Status is null)

if (PriorDailyCalRecord .Onlinelndicator ==1)

if (the number of clock hours between the PriorDailyCalRecord .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 PriorDailyCalRecord .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

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus 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)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (DailyCal TestRecordsByLocationForQAStatus is found

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

Locate the record in DailyCal TestRecordsByLocationForQAStatus for the location where :
a) t he ComponentID is equal to the ApplicableComponentID AND

Environmental Protection Agency

Page 109 of 907


-------
Draft Check Specifications

12/16/2015

b)	ValidFlag is equal to "N" AND

c)	the Onlinelndicator = 1 AND

d)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

if (DailyCal TestRecordsByLocationForQAStatus is found AND the EndDate/Hour is after the
OnlineDailyCalRecord. EndDate/Hour AND the EndDate/Hour is equal to or prior to the
PriorDailyCalRecord .Date/Hour)

set InvalidDailyCalRecord = the found record in DailyCal TestRecordsByLocationForQAStatus .

if ( OnlineDailyCalRecord .TestResultCode = null)

Set Current DailyCal Status = "OOC- Prior Online Test Has Critical Errors".

else if ( OnlineDailyCalRecord .TestResultCode = "FAILED")

Set Current DailyCal Status = "OOC- Prior Online Test Failed".

else if ( OnlineDailyCalRecord .TestResultCode = "ABORTED")

Set Current DailyCal Status = "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)

Environmental Protection Agency

Page 110 of 907


-------
Draft Check Specifications

12/16/2015

Set CurrentDailyCalStatus = "IC-Undetermined".

else

Set CurrentDailyCalStatus = "OOC-Expired".

Usage:

1

Emissions Data Evaluation Report	

	C02 Daily Calibration Status Evaluation

2

Emissions Data Evaluation Report	

	FLOW Daily Calibration Status Evaluation

3

Emissions Data Evaluation Report	

	Hg Daily Calibration Status Evaluation

4

Emissions Data Evaluation Report	

	NOX Daily Calibration Status Evaluation

5

Emissions Data Evaluation Report	

	02 Dry Daily Calibration Status Evaluation

6

Emissions Data Evaluation Report	

	02 Wet Daily Calibration Status Evaluation

7

Emissions Data Evaluation Report	

	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 111 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

DCSTAT-4

Check Name:

Determine Final Daily Calibration Status

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set Alternate DailyCal Record = null.
if ( Current DailyCal Status begins with "OOC")
if (Invalid DailyCal Record is not null)

Set Current DailyCal Status = Current DailyCal Status &

Return result Current DailyCal Status .

else if (DualRangeStatus = true and Current DailyCal Status begins with "IC")
if ( CurrentAnalyzerRangeUsed = "H")

Set AlternateAnalyzerRange = "L".

Set AlternateComponentID = LowRangeComponentID .

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentID = HighRangeComponentID .

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	ComponentID is equal to the AlternateComponentID AND

b)	ValidFlag = "Y" AND

c)	SpanScaleCode is equal to the AlternateAnalyzerRange

if (DailyCal TestRecordsByLocationForQAStatus is found)

Set Alternate DailyCal Record = the found record in DailyCal TestRecordsByLocationForQAStatus .
if (Alternate DailyCal Record is not null)

if (Alternate DailyCal Record .TestResultCode = null)

Set Current DailyCal Status = "OOC- Alternate Range Test Has Critical Errors",
else if ( Alternate DailyCal Record. TestResultCode = "FAILED")

Set Current DailyCal Status = "OOC- Alternate Range Test Failed",
else if (Alternate DailyCal Record .TestResultCode = "ABORTED")

Set Current DailyCal Status = "OOC- Alternate Range Test Aborted".

else

Locate the latest record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a) ComponentID is equal to the AlternateComponentID AND

Environmental Protection Agency

Page 112 of 907


-------
Draft Check Specifications

12/16/2015

b)	t he SpanScaleCode is equal to the. Iliernaie. InalyzcrRangc

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

if (DailyCal TestRecordsByLocationForQAStatus is found AND (either the PriorDailyCalRecord is null or
EndDate/Hour /Minute is after the PriorDailyCal Record .EndDate/Hour/Minute))

Set Current DailyCal Status = "OOC- No Passing Test A fter Alternate Range Failed Test

(Report this status in the Evaluation Report under the PriorDailyCal Record .TestDate/Hour.)

Else

Locate the latest record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	ComponentID is equal to the ApplicableComponentID AND

b)	t he SpanScaleCode is equal to the CurrentAnalyzerRangeUsed

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

if (DailyCal TestRecordsByLocationForQAStatus is found AND EndDate/Hour /Minute is after the
Alternate DailyCal Record .EndDate/Hour/Minute)

Set Current DailyCal Status = "OOC-No Passing Alternate Range Test After Failed Test".

(Report this status in the Evaluation Report under the PriorDailyCal Record .TestDate/Hour.)

if ( Current DailyCal Status begins with "OOC")

if (Invalid DailyCal Record is not nul 1)

Set Current DailyCal Status = Current DailyCal Status &

else

Locate the most recent record in DailyCal TestRecordsByLocationForQAStatus for the location where :

a)	ComponentID is equal to thq AlternateComponentID AND

b)	ValidFlag is equal t o "N" AND

c)	t he SpanScaleCode is equal to thq AlternateAnalyzerRange

if (DailyCal TestRecordsByLocationForQAStatus is found AND the EndDate/Hour is after the Alternate
DailyCal Record .EndDate/Hour)

Set Invalid DailyCal Record = the found record in DailyCal TestRecordsByLocationForQAStatus.

Set Current DailyCal Status = Current DailyCal Status &

Return result Current DailyCal Status .

elsei f ( Current DailyCal Status does not begin with "IC")

Return result Current DailyCal Status .

Results:

Result

Description

Severity

OOC-Alternate
Range Test

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

Environmental Protection Agency

Page 113 of 907


-------
Draft Check Specifications

12/16/2015

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*

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

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

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

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

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

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

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

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

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

The prior daily calibration test for [compkey] was completed on [date],
however a subsequent passing test on [altscale] has not been completed.

When a daily calibration test is failed for a dual-range analyzer, you must
complete a passing daily calibration test on both ranges before the monitor is
considered to be in-control. An invalid daily calibration test completed on
[invdate] was ignored.

The prior daily calibration test for [compkey] was completed on [date],
however a subsequent passing test on [altscale] has not been completed.

When a daily calibration test is failed for a dual-range analyzer, you must
complete a passing daily calibration test on both ranges before the monitor is
considered to be in-control. An invalid daily calibration test completed on
[invdate] was ignored.

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

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

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

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

Environmental Protection Agency

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
Page 114 of 907


-------
Draft Check Specifications

12/16/2015

OOC-No
Probationary
Calibration Test

OOC-No
Probationary
Calibration Test*

OOC-Prior Online
Test Aborted

OOC-Prior Online
Test Aborted*

OOC-Prior Online
Test Expired

OOC-Prior Online
Test Expired*

OOC-Prior Online
Test Failed

OOC-Prior Online
Test Failed*

OOC-Prior Online
Test Has Critical
Errors

OOC-Prior Online
Test Has Critical
Errors*

OOC-Test Aborted

OOC-Test
Aborted*

OOC-Test Failed
OOC-Test Failed*

OOC-Test Has
Critical Errors

OOC-Test Has
Critical Errors*

Usage:

1

2

3

4

5

6

7

a prior reporting period has expired. An invalid daily calibration test
completed on [invdate] was ignored.

This check result is obsolete.

This check result is obsolete.

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

[compkey] completed on [ondate]
l test completed on [invdate] was

[compkey] completed on [ondate]
l test completed on [invdate] was

The prior online daily calibration test for |
was aborted. An invalid daily calibration 1
ignored.

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

The prior online daily calibration test for |
has expired. An invalid daily calibration 1
ignored.

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

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

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

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

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

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

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

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.

No Errors
No Errors

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

Emissions Data Evaluation Report	C02 Daily Calibration Status Evaluation

Emissions Data Evaluation Report	FLOW Daily Calibration Status Evaluation

Emissions Data Evaluation Report	Hg Daily Calibration Status Evaluation

Emissions Data Evaluation Report	NOX Daily Calibration Status Evaluation

Emissions Data Evaluation Report	02 Dry Daily Calibration Status Evaluation

Emissions Data Evaluation Report	02 Wet Daily Calibration Status Evaluation

Emissions Data Evaluation Report	S02 Daily Calibration Status Evaluation

Environmental Protection Agency

Page 115 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 116 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMTEST-1

Check Name:

Daily Test Date Valid

Related Former Checks:
Applicability:

CEM Check

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

Description

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

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

Severity

A

Fatal

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Daily Calibration Test

Emissions Data Evaluation Report	Miscellaneous Emission File Test

2

Environmental Protection Agency

Page 117 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMTEST-2

Check Name:	Daily Test Hour Valid

Related Former Checks:

Applicability:	CEM Check

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:

Severity
Fatal

Critical Error Level 1
Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

2	Emissions Data Evaluation Report	Miscellaneous Emission File Test

Result	Description

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

B	You reported a [Fieldname] of [Hour], which is outside the range of

acceptable values for this hour for [key].

Environmental Protection Agency

Page 118 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMTEST-3

Check Name:	Daily Test Minute Valid

Related Former Checks:

Applicability:	CEM Check

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

Usage:

1	Emissions Data Evaluation Report	Daily Calibration Test

2	Emissions Data Evaluation Report	Miscellaneous Emission File Test

Result	Description

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.

Environmental Protection Agency

Page 119 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMTEST-4

Check Name:	Daily Test System or Component Valid

Related Former Checks:

Applicability:	General Check

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

B
C
D

Usage:

1

2

Description

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

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

The ComponentTypeCode for [key] is not appropriate for this type of test.

You did not provide a MonitoringSystemID for [key], which is required for
this test type.

The SystemTypeCode of the system for [key] is not appropriate for this type
of test.

Emissions Data Evaluation Report	Daily Calibration Test

Emissions Data Evaluation Report	Miscellaneous Emission File Test

Severity

Critical Error Level 1

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

Critical Error Level 1

Environmental Protection Agency

Page 120 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMTEST-5

Check Name:

Daily Test Span Scale Valid

Related Former Checks:
Applicability:

CEM Check

Specifications:

For the daily test:

If the SpanScaleCode is not null,
return result A.

Results:

Result	Description	Severity

A	You reported [fieldname] for [key], which is not appropriate for this test type. Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 121 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMTEST-6

Check Name:

Daily Test Result Code Valid

Related Former Checks:
Applicability:

General Check

Specifications:

For the daily test:

Set EM Test Calc Result to null.

If TestResultCode is null,
return result A.

else i f TestResultCode is not equal to "ABORTED", "PASSED", or "FAILED",
return result B.

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

else

Results:

Result

Description

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

Severity

A

Critical Error Level 1

B

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

Usage:
1

Emissions Data Evaluation Report	Miscellaneous Emission File Test

Environmental Protection Agency

Page 122 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-1

Check Name:

Check Hg Converter Indicator of the Component

Related Former Checks:

Applicability:

Specifications:

If ( CurrentWeeklySystemlntegrityTest .HgConverterlndicator is NOT equal to 1)
Set Weekly TestSummary Valid to false,
return result A.

Results:

Result

Description

For [key] you reported a HgConverterlndicator that is not equal to I, which
indicates that a Weekly System Integrity Test is not necessary.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 123 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-2

Check Name:

Check Gas Level

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

If (GasLevelCode is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (GasLevelCode is NOT in set (HIGH, MID, LOW, ZERO))
Set Weekly TestSummary Valid to false,
return result B.

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

Set Weekly TestSummary Valid to false,
return result C.

Results:

Result

Description

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

For [key] you reported a [levelcode] that is not in the list of valid [fieldname]
for this test type.

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

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 124 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-3

Check Name:

Check Weekly System Integrity Reference Value

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

Set InjectionReferenceValueValid to false.

If (ReferenceValue is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (ReferenceValue is NOT rounded to one decimal place)
Set Weekly TestSummary Valid to false,
return result B.

Else if (ReferenceValue is NOT greater than 0)

If (TestResultCode is NOT equal to "FAILED")
Set Weekly TestSummary Valid to false,
return result C.

Else

Set InjectionReferenceValueValid to true

Results:

Result

Description

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

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

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

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 125 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-4

Check Name:

Check Weekly System Integrity Measured Value

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

Set InjectionMeasuredValueValid to false.

If (MeasuredValue is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (MeasuredValue is NOT rounded to one decimal place)
Set Weekly TestSummary Valid to false,
return result B.

Else if (MeasuredValue is NOT greater than 0)

If (TestResultCode is NOT equal to "FAILED")
Set Weekly TestSummary Valid to false,
return result C.

Else

Set InjectionMeasuredValueValid to true

Results:

Result

Description

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

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

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

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 126 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-5

Check Name:

Calculate System Integrity Error and Alternate Performance Spec Indicator

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

Set CalculatedSystemlntegrityApsIndicator to null.
Set CalculatedSystemlntegrityError to null.

If (InjectionReferenceValueValid AND InjectionMeasuredValueValid)

Set PercentError to (100 * ABS(ReferenceValue - MeasuredValue) / ReferenceValue), rounded to 1 decimal place.
If (PercentError is less than or equal to 10)

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

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 127 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-6

Check Name:

Check Weekly System Integrity Alternative Performance Spec

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

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 CalculatedSystemlntegrityApslndicator)
Set Weekly TestSummary Valid to false,
return result C.

Else

Set WeeklySystemlntegrityApsIsValid to true.

Results:

Result

Description

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

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

The APSIndicator reported for [key] is inconsistent with the APSIndicator
recalculated from the reported reference and measured values.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 128 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-7

Check Name:

Check Weekly System Integrity Error

Related Former Checks:

Applicability:

Specifications:

For Current WeeklySystemlntegrity Test

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 WeeklySystemlntegrityErrorlsValid to true.

Results:

Result

Description

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

[fieldname] is not reported to one decimal place.

The [fieldname] value for [key] is inconsistent with the value of [value],
recalculated from the reported [testtype] records.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 129 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-8

Check Name:

Check Weekly Test Summary Result Against Calculated Value

Related Former Checks:

Applicability:

Specifications:

If ( CalculatedWeeklyTestSummaryResult is NOT null) and ( CurrentWeeklyTestSummary TestResultCode is NOT equal to
CalculatedWeekly TestSummaryResult)

Set CalculatedWeeklyTestSummaryResult to null.

Set Weekly TestSummary Valid to false.

return result A.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 130 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWSI-9

Check Name:

Update Weekly System Integrity Dictionary Component Entry

Related Former Checks:

Applicability:

Specifications:

If ( WsiTestDictionary does NOT contain a key equal to CurrentWeeklySystemlntegrityTest .Componentld)

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 .Componentld:
Set MostRecentTestRecord to CurrentWeeklySystemlntegrityTest.

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 131 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMWSI-10

Check Name:	Update Weekly System Integrity Dictionary Operating Date Information

Related Former Checks:

Applicability:

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

Usage:

1	Emissions Data Evaluation Report	Weekly System Integrity Test Operating Dates

Environmental Protection Agency

Page 132 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMWSI-11

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

Related Former Checks:

Applicability:	General Check

Specifications:

For Current WeeklySystemlntegrity Test

If ( CurrentOperatingTime is equal to 0)

Return result A

Results:

Result	Description	Severity

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

test are only allowed during operating hours.

Usage:

1	Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 133 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-1

Check Name:

Initialize Parameters

Related Former Checks:

Applicability:

Specifications:

Set Weekly TestSummary Valid to true.

Set CalculatedWeeklyTestSummaryResult to null.

Usage:

1	Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 134 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-2

Check Name:

Check Weekly Test Type

Related Former Checks:

Applicability:

Specifications:

For CurrentWeeklyTestSummary

If (TestTypeCode is not equal to "HGSI1"),
Set Weekly TestSummary Valid to false,
return result A.

Results:

Result	Description	Severity

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

weekly test.

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 135 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	EMWTS-3

Check Name:	Check Weekly Test System

Related Former Checks:

Applicability:

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

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

[testtype]. Only a ComponentID is reported for a [testtype].

Usage:

1	Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 136 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-4

Check Name:

Check Weekly Test Component

Related Former Checks:

Applicability:

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

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 137 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-5

Check Name:

Check Weekly Test Date

Related Former Checks:

Applicability:

Specifications:

For CurrentWeeklyTestSummary
Set TestDateValid to false.

If (TestDate is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (TestDate is before 01/01/1993) OR (TestDate is after CurrentReportingPeriodEndHour)
Set Weekly TestSummary Valid to false,
return result B.

Else

Set TestDateValid to true.

Results:

Result

Description

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

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 138 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

EMWTS-6

Check Weekly Test Hour

For CurrentWeeklyTestSummary
Set TestHourValid to false.

If (TestHour is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (TestHour is NOT between 0 and 23)
Set Weekly TestSummary Valid to false,
return result B.

Else

Set TestHourValid to TestDateValid .

Results:

Result

A

B

Usage:

1

Description

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

You reported a [Fieldname] of [Hour], which is outside the range of
acceptable values for this hour for [key].

Severity

Critical Error Level 1
Critical Error Level 1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 139 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

EMWTS-7

Check Weekly Test Minute

For CurrentWeeklyTestSummary
Set TestDateTimeValid to false.
If (TestMinute is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (TestMinute is NOT between 0 and 59)
Set Weekly TestSummary Valid to false,
return result B.

Else if ( TestHourValid)

Set TestDateTimeValid to true.

Results:

Result

A

B

Usage:

1

Description

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

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

Severity

Critical Error Level 1
Critical Error Level 1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 140 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-8

Check Name:

Check Weekly Test Span Scale

Related Former Checks:

Applicability:

Specifications:

For CurrentWeeklyTestSummary
If (SpanScaleCode is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (SpanScaleCode is NOT in set (H, M, L))
Set Weekly TestSummary Valid to false,
return result B.

Else if (TestTypeCode is equal to "HGSI1")
If (SpanScaleCode is NOT equal to "H")
Set Weekly TestSummary Valid to false,
return result C.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

B

C

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

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

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 141 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

EMWTS-9

Check Name:

Check Weekly Test Result

Related Former Checks:

Applicability:

Specifications:

For CurrentWeeklyTestSummary
Set TestResultValid = false.

If (TestResultCode is null)

Set Weekly TestSummary Valid to false,
return result A.

Else if (TestResultCode is not in TestResultCodeList)

Set Weekly TestSummary Valid to false,
return result B.

Else if (TestTypeCode is equal to "HGSI1")

If (TestResultCode is NOT in set (PASSED, PASSAPS, FAILED))
Set Weekly TestSummary Valid to false,
return result C.

Else

Set TestResultValid = true.

Else

Set TestResultValid = true.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

B

C

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

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

Usage:
1

Emissions Data Evaluation Report	Weekly System Integrity Test Evaluation

Environmental Protection Agency

Page 142 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

F2LSTAT-1

Check Name:

Determine Most Recent Flow-to-Load QA Operating Quarter

Related Former Checks:

Applicability:

Specifications:

Set F2LStatusPriorTestRequiredQuarter = null.

Set F2LStatusPriorTestRequiredQuarterMissingOpData = null.

If F2LStatusSystemResultDictionary does not contain lookup value for CurrentMh v Record .SystemID

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to

CurrentMhv Record .SystemID, 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 OperatingSuppDataRecordsByLocation .OpValue >= 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 quarter value of the quarter
being checked.

Exit the check.

Else

Set F2LStatusPriorTestRequiredQuarter = -1.

Append "[YEAR]Q[QTR]" to F2LStatusPriorTestRequiredQuarterMissingOpData (where [YEAR] and
[QTR are the year and number of the quarter being checked .

Environmental Protection Agency

Page 143 of 907


-------
Draft Check Specifications

12/16/2015

Else

Set F2LStatusPriorTestRequiredQuarter = -1.

Set F2LStatusPriorTestRequiredQuarterMissingOpData = "No Prior RATA"

Usage:

1	Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 144 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

F2LSTAT-2

Check Name:

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

Related Former Checks:

Applicability:

Specifications:

If F2LStatusSystemResultDictionary contains lookup value for CurrentMh v Record .SystemID

Set F2LStatusResult = F2LStatusSystemResultDictionary lookup value for CurrentMhvRecord .SystemID.

Set CurrentFlowToLoadStatusCheck = F2LStatusSystemCheckDictionary lookup value for CurrentMh vRecord
.SystemID.

Set F2LStatusMissingOpDataInfo = F2lStatusSystemMissingOpDictionary lookup value for CurrentMh vRecord
.SystemID.

Else

Set F2LStatusResult = null.

Set CurrentFlowToLoadStatusCheck = null.

Set F2LStatusMissingOpDataInfo = null.

Locate the most recent record in F2LCheckRecordsForQaStatus where SystemID is equal to CurrentMh vRecord
.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 CurrentMh vRecord.
If found, and NonLoadBaselnd equals 1
Set F2LStatusResult = "IC-Exempt".

Else

Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the CurrentMh vRecord
.SystemID, the ExtensionExemptionCode is equal to "\f2 F2LEXP ", and the reporting period is the period before
the current reporting period.

If found

Set F2LStatusResult = "IC-Exempt".

Else

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh vRecord 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 .

Environmental Protection Agency

Page 145 of 907


-------
Draft Check Specifications

12/16/2015

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 CurrentMhv Record.SystemDesignationCode 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 F2LStatusResult = "Missing Op Data".

Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData .

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

if CurrentMhvRecord .SystemDesignationCode is equal to "RB"

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

Else

Set F2LStatusResult = "OOC-Prior Check Missing".

Else if CurrentFlowToLoadStatusCheck .TestResultCode = "PASSED"

Set F2LStatusResult = "IC".

Else

If CurrentFlowToLoadStatusCheck .TestResultCode = "PASSED"

Set F2LStatusResult = "IC".

Set F2LStatusSystemResultDictionary lookup value for CurrentMh vRecord .SystemID = F2LStatusResult.
Set F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord .SystemID = CurrentFlowToLoadStatusCheck

Set F2lStatusSystemMissingOpDictionary lookup value for CurrentMhvRecord .SystemID =

F2LStatusMissingOpDataInfo .

Usage:

Environmental Protection Agency

Page 146 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 147 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

F2LSTAT-3

Check Name:

Locate Intervening RATA

Related Former Checks:

Applicability:

Specifications:

Set F2LStatusInterveningRata = null.

If F2LStatusResult is null

Locate the most recent record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhv Record .SystemID, EndDateHour is after CurrentFlowToLoadStatusCheck .EndDateHour and before
CurrentMhv Record .BeginDate/BeginHour, and TestResultCode is not equal to "INVALID"

If found,

Set F2LStatusResult = "IC-Subsequent RATA Performed" .

Set F2LStatusInterveningRata = The located record in RataTestRecordsByLocationForQaStatus .

Usage:
1

Emissions Data Evaluation Report

Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 148 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	F2LSTAT-4

Check Name:	Locate Most Recent QA Cert Event

Related Former Checks:

Applicability:

Specifications:

Set F2LStatusQaCertEvent = null.

Set F2L Status Event Requires RATA = false.

Set F2L Status Event Requires Abbreviated Check = false.

If F2LStatusResult is null

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to CurrentMhvRecord
.SystemID, QaCertEventCode is equal to "312", QaCertEventDateHour is on or after CurrentFlowToLoadStatusCheck
.EndDateHour, and QaCertEventDateHour is on or before CurrentMh vRecord .BeginDate/BeginHour.

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

If found,

F2L Status Event Requires RATA = true.

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

If found,

F2L Status Event Requires Abbreviated Check = true.

If F2LStatusQaCertEvent .LastTestCompletedDateHour is on or before CurrentMh vRecord .BeginDate/BeginHour

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 F2LStatusQaCertEvent .ConditionalDataBeginDateHour is after
CurrentMh vRecord .BeginDate/BeginHour,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is null or is equal to
CurrentMhvRecord .SystemID, EndDateHour is after CurrentFlowToLoadStatusCheck .EndDateHour and before
CurrentMhvRecord .BeginDate/BeginHour, and TestResultCode is equal to "INVALID".

If found

Set F2LStatusResult = "OOC-Check Failed - Invalid RATA Ignored" .

Else

Set F2LStatusResult = "OOC-Check Failed" .

Environmental Protection Agency

Page 149 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

Flow-to-Load Status Evaluation

Page 150 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

F2LSTAT-5

Check Name:

Locate Earliest Valid Required Test

Related Former Checks:

Applicability:

Specifications:

Set F2lStatusEarliestValidRequiredTest = null.

If F2LStatusResult is null

If F2L Status Event Requires RATA is true,

Locate earliest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to CurrentMhv Record

.SystemID, EndDateHour is after CurrentMh vRecord .BeginDate/BeginHour, and TestResultCode is not equal to

Set F2LStatusEarliestValidRequiredTest = The located record in RataTestRecordsByLocationForQaStatus .

If F2LStatusEarliestValidRequiredTest .TestResultCode is equal to "FAILED"

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhv Record .SystemID, EndDateHour is after F2LStatusQaCertEvent .QaCertEventDateHour and
before F2LStatusEarliestValidRequiredTest .EndDateHour, and TestResultCode is equal to "INVALID".

If found

Set F2LStatusResult = "OOC-Recertification RATA Failed - Invalid RATA Ignored" .

INVALID".

If found,

Else

Set F2LStatusResult = "OOC-Recertification RATA Failed" .

Else if F2L Status Event Requires Abbreviated Check is false,

Set F2LStatusResult = "OOC-Invalid Cert Event" .

Usage:
1

Emissions Data Evaluation Report

Flow-to-Load Status Evaluation

Environmental Protection Agency

Page 151 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

F2LSTAT-6

Check Name:

Determine Event Conditional Status and Final Status

Related Former Checks:

Applicability:

Specifications:

If F2LStatusResult is null

Set F2L Status Missing Op Data Info = null.

If F2L Status Event Requires RATA is true,

Set OperatingHourLimit = 720

else

Set OperatingHourLimit = 168

If (the quarter of the F2LStatusQaCertEvent .ConditionalBeginDate is equal to the quarter of the CurrentMh vRecord
.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 .ConditionalBeginDate/Hour and ON OR BEFORE CurrentMh vRecord
.Date/Hour,

If the number > OperatingHourLimit,

Set F2LStatusResult = "OOC-Conditional Period Expired".

else

Set F2LStatusResult = "IC-Conditional".

else

if (F2LStatusQaCertEvent .MinOpHoursPriorQuarter is null)

Set F2LStatusQaCertEvent .MinOpHoursPriorQuarter = 0
Set F2LStatusQaCertEvent .MaxOpHoursPriorQuarter = 0

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

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

if (Annual Reporting Requirement == false AND the quarter being checked == 2)

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

else

Locate the record in OperatingSuppDataRecordsby Location 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 F2LStatusQaCertEvent .MinOpHoursPriorQuarter = -1

Append "[YEAR] Q[QTR]" to F2L Status Missing Op Data Info (where [YEAR] is the year of the

Environmental Protection Agency

Page 152 of 907


-------
Draft Check Specifications

12/16/2015

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

If ( OperatingSuppDataRecordsbyLocation .OpValue MINUS the number of calendar hours in
the quarter being checked that are PRIOR to the F2LStatusQaCertEvent
.ConditionalBeginDate/Hour > 0)

Set F2LStatusQaCertEvent .MinOpHoursPriorQuarter =

OperatingSuppDataRecordsby Location .Op Value MINUS the number of calendar hours
in the quarter being checked that are PRIOR to the F2LStatusQaCertEvent
. ConditionalBeginDate/Hour

If ( OperatingSuppDataRecordsby Location .Op Value is less than the number of calendar
hours in the quarter begin checked that are ON OR AFTER the F2LStatusQaCertEvent
. ConditionalBeginDate/Hour)

Set F2LStatusQaCertEvent .MaxOpHoursPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

else

Set F2LStatusQaCertEvent .MaxOpHoursPriorQuarter = the number of calendar hours in
the quarter being checked that are ON OR AFTER the F2LStatusQaCertEvent
. ConditionalBeginDate/Hour.

else

Set F2LStatusQaCertEvent MinOpHoursPriorQuarter = F2LStatusQaCertEvent
.MinOpHoursPriorQuarter + OperatingSuppDataRecordsbyLocation .OpValue.

Set F2LStatusQaCertEvent MaxOpHours PriorQuarter = F2LStatusQaCertEvent
.MaxOpHoursPriorQuarter + OperatingSuppDataRecordsbyLocation .OpValue.

I f (F2LStatusQaCertEvent .MinOpHoursPriorQuarter == -1)

set F2LStatusResult to "Missing Op Data"

E lse i f (F2LStatusQaCertEvent .MinOpHoursPriorQuarter > OperatingHourLimit)

If F2L Status Event Requires RATA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhvRecord .SystemID, EndDateHour is on or after F2LStatusQaCertEvent
• ConditionalDataBeginDate/ConditionalDataBeginHour and on or before CurrentMh vRecord
.BeginDate/BeginHour, and TestResultCode is equal to "INVALID".

If found,

Set F2LStatusResult = "OOC-Conditional Period Expired -Invalid RATA Ignored ".

Else

Set F2LStatusResult = "OOC-Conditional Period Expired".

Else

Set F2LStatusResult = "OOC-Conditional Period Expired".

Environmental Protection Agency

Page 153 of 907


-------
Draft Check Specifications

12/16/2015

Else i f (Rpt Period Op Hours Accumulator Array for the location == -1)

Set F2LStatusResult = "Invalid Op Data".

E lse if ( F2LStatusQaCertEvent MinOpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array for the
Location > OperatingHourLimit)

If F2L Status Event Requires RATA is true,

Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhvRecord .SystemID, EndDateHour is on or after F2LStatusQaCertEvent
.ConditionalDataBeginDate/ConditionalDataBeginHour and on or before CurrentMh vRecord
.BeginDate/BeginHour, 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".

E lse if ( F2LStatusQaCertEvent MaxOpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array for the
Location > OperatingHourLimit)

Set F2LStatusResult = "Undetermined-Conditional Data".

E lse

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

Description

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.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [SYSID] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired. An invalid RATA was
ignored.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

You reported an invalid QA Certification Event record for QACertEventCode Critical Error Level 1

Environmental Protection Agency

Page 154 of 907


-------
Draft Check Specifications

12/16/2015

Event

OOC-Prior Check
Missing

ooc-

Recertification
RATA Failed

ooc-

Recertification
RATA Failed -
Invalid RATA
Ignored

Undetermined-
Conditional Data

Undetermined-No
Prior Check
reported for
Redundant Backup
Monitor

Usage:

1

[code] QACertEventDate [eventdate] for [SYSID],

One or more Flow-to-Load Checks is missing for prior quarters.	Critical Error Level 1

The subsequent recertification RATA for SystemID [SYSID] with	Critical Error Level 1

TestNumber [subtestnum] failed.

The subsequent recertification RATA for SystemID [SYSID] with	Critical Error Level 1

TestNumber [subtestnum] failed. An invalid RATA was ignored.

Informational Message

Informational Message

Emissions Data Evaluation Report	Flow-to-Load Status Evaluation

The software could not determine if the current hour was within the
conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [eventkey].

The software could not determine if a Flow-to-Load check is required for the
Redundant Backup Flow Monitor.

Environmental Protection Agency

Page 155 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-1

Check Name:

Initialize Accumulators for Appendix D Calculations

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HIApp D Accumulator = 0
SO 2 App D Accumulator = 0
CO2 App D Accumulator = 0
NOXR App E Accumulator = 0
Current Fuel Flow Record = null
Current Fuel Group = null
Fuels Used List = null

Usage:

1	Emissions Data Evaluation Report	Appendix D/E Unit-Level Initialization

Environmental Protection Agency

Page 156 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-3

Check Name:

Initialize Fuel Flow Record

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Current Fuel Group = Current Fuel Flow Record .FuelGroupCd
if ( Current Fuel Flow Record .UnitFuelCd in set \{OGS, PRG,OOL\})
Special Fuel Burned = true

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 157 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-4

Check Name:

Check Fuel Usage Time

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Usage Time Status = true

If ( Current Fuel Flow Record .FuelUsageTime is null OR Current Fuel Flow Record .FuelUsageTime < 0 OR Current Fuel
Flow Record .FuelUsageTime > 1)

HFF Usage Time Status = false

return result A

else if ( Current Hourly Op Record .OperatingTime > 0 AND Current Hourly Op Record .OperatingTime <= 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 Record .OperatingTime)

HFF Usage Time Status = false
return result B

else if (Hourly Fuel Flow Count For Gas + Hourly Fuel Flow Count For Oil == 1 AND (MP Pipe Config for Hourly
Checks is null OR Current Hourly Op Record . LocationName begins with "CP") AND Current Fuel Flow Record
.FuelUsageTime < > Current Hourly Op Record .OperatingTime)

HFF Usage Time Status = false

return result B

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 158 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-5

Check Name:

Check Volumetric SODC Code

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF SODC Status = true

If ( Current Fuel Flow Record. SourceOfDataVolumetricCode is null)

If ( Current Fuel Flow Record. VolumetricFlowRate is not null)

HFF SODC Status == false
return result A
else

If ( Current Fuel Flow Record .VolumetricFlowRate is null)

HFF SODC Status == false
return result B

else if ( Current Fuel Group == "GAS" and Current Fuel Flow Record .SourceOfDataVolumetricCode in set \{5, 6\})
HFF SODC Status == false
return result C

else if ( Current Fuel Flow Record .SourceOfDataVolumetricCode = "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 Record .SourceOfDataVolumetricCode == "4" AND HFF Fuel Indicator Code <> "E")
HFF SODC Status == false
return result E

else if ( Current Fuel Flow Record .SourceOfDataVolumetricCode in set \{5, 6\} AND HFF Fuel Indicator Code <>

"I")

HFF SODC Status == false

return result F

Results:

Result

Description

Severity

A

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but Critical Error Level 1
you reported a [ratefieldname].

You reported a [fieldname] in the HFF record for FuelCode [fueled], but you Critical Error Level 1

B

Environmental Protection Agency

Page 159 of 907


-------
Draft Check Specifications

12/16/2015

C
D

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 your monitoring plan, this fuel is not an emergency fuel.

You reported a [fieldname] of [sodc] in the HFF record for FuelCode [fueled],
which indicates that the fuel is an igniter fuel, but according to the Unit Fuel
record in your monitoring plan, this fuel is not an igniter fuel.

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 160 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-6

Check Name:

Check Oil Mass SODC Code

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Mass SODC Status == true

If ( Current Fuel Flow Record. SourceOfDataMassCode is null)

If ( Current Fuel Flow Record .MassFlowRate is not null)

HFF Mass SODC Status == false
return result A
else

If ( Current Fuel Flow Record .MassFlowRate is null)

HFF Mass SODC Status == false
return result B

else if ( Current Fuel Flow Record . 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 Flow Record .SourceOfDataMassCode
== "2")

HFF Mass SODC Status == false
return result D

else if ( Current Fuel Flow Record .SourceOfDataMassCode = "3" AND Current Unit Is Peaking == false)

HFF Mass SODC Status == false
return result E
else if (HFF Fuel Indicator Code is not null)

if ( Current Fuel Flow Record .SourceOfDataMassCode == "4" AND HFF Fuel Indicator Code <> "E")

HFF Mass SODC Status == false
return result F

else if ( Current Fuel Flow Record .SourceOfDataMassCode in set \{5, 6\} AND HFF Fuel Indicator Code <> "I")
HFF Mass SODC Status == false
return result G

Environmental Protection Agency

Page 161 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C

D

Usage:
1

Description

You did not report a [fieldname] in the HFF record for FuelCode [fueled], but
you reported a [ratefieldname].

You reported a [fieldname] in the HFF record for FuelCode [fueled], but you
did not report a [ratefieldname].

You reported a SourceOfDataMassCode of [sodc] in the HFF record for
FuelCode [fueled], but you also reported a VolumetricFlowRate. The
SourceOfDataMassCode must be 2 when mass oil flow is calculated from
volumetric oil flow.

You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode
[fueled], but you did not report a VolumetricFlowRate. The
SourceOfDataMassCode should be 2 only when the mass oil rate is calculated
from volumetric oil flow.

You reported a [fieldname] of 3 in the HFF record for FuelCode [fueled], but,
according to the qualification record in your monitoring plan, this is not a
peaking unit.

You reported a [fieldname] of 4 in the HFF record for FuelCode [fueled],
which indicates that the fuel is an emergency fuel, but according to the Unit
Fuel record in your monitoring plan, this fuel is not an emergency fuel.

You reported a [fieldname] of [sodc] in the HFF record for FuelCode [fueled],
which indicates that the fuel is an igniter fuel, but according to the Unit Fuel
record in your monitoring plan, this fuel is not an igniter fuel.

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

Environmental Protection Agency

Page 162 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-7

Check Name:

Check Fuel Flow Monitoring System

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF System Type = null
FuelFlowComponentRecords = null
CurrentAppendixDStatus = null

If ( Current Fuel Flow Record .MonitoringSystemID is null)

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\}))

return result A

else if (Legacy Data Evaluation == false AND ( Current Fuel Flow Record .SourceOfDataVolumetricCode in set \{ I, 3\}
OR ( Current Fuel Group == "OIL" AND Current Fuel Flow Record .SourceOfDataMassCode in set \{ 1, 3\})))

return result B

else if ( Current Fuel Group == "GAS")

HFF System Type = "GAS"

else if ( Current Fuel Flow Record. VolumetricFlowRate is not null)

HFF System Type = "OILV"

else

HFF System Type = "OILM"
else

if ( Current Fuel Flow Record .SourceOfDataVolumetricCode == "4")
return result C

else if ( Current Fuel Group == "OIL" AND ( Current Fuel Flow Record .SourceOfDataVolumetricCode in set \{5, 6\} OR
Current Oil Fuel Flow Record .SourceOfDataMassCode in set \{5, 6\}))

return result C

else

Current Mon Sys Record = find active MonitoringSystem record where

MonitoringSystemld = Current Fuel Flow Record .MonitoringSystemID

if Current Mon Sys Record is null

return result D

else if ( Current Fuel Group == "GAS" AND Current Mon Sys Record. SystemTypeCode <> "GAS")

Environmental Protection Agency

Page 163 of 907


-------
Draft Check Specifications

12/16/2015

return result E

else if ( Current Fuel Group == "OIL" AND Current Mon Sys Record.SystemTypeCode not in set \{OILV, OILM\})

else if ( Current Fuel Group == "OIL" AND Current Oil Fuel Flow Record. SourceOfDataMassCode == "2" AND

Current Mon Sys Record .SystemTypeCode <> "OILV")

return result G

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 ComponentTypeCd == "OFFM")

Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords .

If none were found,

return result I.

else if ( Current Fuel Group = "GAS")

Locate MonitorSystemComponentRecordsByHourLocation where the SystemID is equal to
CurrentFuelFlowRecord .SystemID and the ComponentTypeCd = "GFFM" or "BGFF"

For each retrieved record found:

If (MonitorSystemComponentRecordsByHourLocation ComponentTypeCd == "GFFM")

return result F

else

Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords .

If none were found,

return result I.

Results:

Result

Description

Severity

A

You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in Critical Error Level 1
the HFF record for FuelCode [fueled], indicating the use of a fuel flowmeter
system, but you did not report its MonitoringSystemlD.

Environmental Protection Agency

Page 164 of 907


-------
Draft Check Specifications

12/16/2015

B

C

D

E
F
G

H

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.

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 165 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-8

Check Name:

Check Volumetric Units of Measure

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF UOM Status = true

If ( Current Fuel Flow Record. VolumetricUnitsOfMeasureCode is null)

If ( Current Fuel Flow Record. VolumetricFlowRate is not null)

HFF UOM Status = false
return result A
else

If ( Current Fuel Flow Record .VolumetricFlowRate is null)

HFF UOM Status = false
return result B

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record. VolumetricUnitsOfMeasureCode is not in set

\{"GALHR", "BBLHR", "M3HR", "SCFH"\»

HFF UOM Status = false
return result C

else if ( Current Fuel Group == "GAS" AND Current Fuel Flow Record. VolumetricUnitsOfMeasureCode <> "HSCF")
HFF UOM Status = false
return result C

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 166 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-9

Check Name:

Check Fuel in HFF Record

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Fuel Indicator Code = null
Locate active UnitFuel record for the location

where FuelCd = Current Fuel Flow Record .UnitFuelCd
If found,

HFF Fuel Indicator Code = Current Fuel Flow Record .IndicatorCd

else

return result A

Results:

Result

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 167 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-10

Check Name:

Related Former Checks:

Check Volumetric Flow in HFF Record

Applicability:
Specifications:

Appendix D Check

\ucl

\fs20 HFF Calc Volumetric Rate = null
HFF Max Heat Input for Volume = null

If (HFF System Type is not null AND HFF SOD Status == true AND HFF Mass SODC Status == true AND HFF UOM
Status == true)

If ( Current Fuel Flow Record. VolumetricFlowRate is null)

If (HFF System Type <> "OILM")
return result A

else

If (HFF System Type == "OILM")
return result B

else if ( Current Fuel Flow Record. SourceOfDataVolumetricCode = = "4")

If ( Current Entity Type is equal to "Unit")

Locate a Unit Capacity record for the location and hour.

If exactly one record is found, and the MaximumHourlyHeatlnputCapacity in the retrieved record is greater
than 0,

HFF Max Heat Input for Volume = UnitCapacityByHourLocation
.MaximumHourlyHeatlnputCapacity

If (HFF GCV 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 (HFF Density 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

Environmental Protection Agency

Page 168 of 907


-------
Draft Check Specifications

12/16/2015

else

HFF Calc Volumetric Rate = Current Fuel Flow Record .VolumetricFlowRate
else if ( Current Fuel Flow Record. SourceOfDataVolumetricCode == "9"

I f ( 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 .FuelCode

if ( Count <> 1)

return result C
else if (Default Record .DefaultValue <= 0)
return result D

else if (Default Record .DefaultUnitsOfMeasureCode == Current Fuel Flow Record
. VolumetricUnitsOfMeasureCode)

HFF Calc Volumetric Rate = Default Record .DefaultValue

If ( Current Fuel Flow Record .VolumetricFlowRate <= 0)

return result E

else if ( Current Fuel Flow Record. VolumetricFlowRate <> HFF Calc Volumetric Rate)
return result F

else

If ( Current Fuel Flow Record .VolumetricFlowRate <= 0)
return result E

else

return result G

else if Current Fuel Flow Record .MonitoringSystemID is not null)

If ( Current Fuel Flow Record .VolumetricFlowRate <= 0)
return result E

else

If ( Current Fuel Flow Record .SourceOfDataVolumetricCode <> 3)

HFF Calc Volumetric Rate = Current Fuel Flow Record VolumetricFlowRate
Count active System Fuel Flow Record for the system.

Environmental Protection Agency	Page 169 of 907


-------
Draft Check Specifications

12/16/2015

If ( Count <> 1)
return result H

else if (System Fuel Flow Record .MaximumFuelFlowRate <= 0)
return result I

else if ( System Fuel Flow Record . SystemFuelFlowUOMCode == Current Fuel Flow Record
. VolumetricUnitsOfMeasureCode)

If ( Current Fuel Flow Record. SourceOfDataVolumetricCode ==3)

HFF Calc Volumetric Rate = System Fuel Flow Record .MaximumFuelFlowRate

If Current Fuel Flow Record. VolumetricFlowRate <> HFF Calc Volumetric Rate )

return result J

else

If (HFF Calc Volumetric Rate > System Fuel Flow Record .MaximumFuelFlowRate
return result K

else

return result L

else

If ( Current Fuel Flow Record .VolumetricFlowRate <= 0)
return result E

else

HFF Calc Volumetric Rate = Current Fuel Flow Record VolumetricFlowRate

Results:

Result
A

B

C

D

E
F

Description

You did not report a VolumetricFlowRate in the HFF record for FuelCode
[fueled], which is required when using [systype] MonitoringSystemID [ID],

You reported a VolumetricFlowRate in the HFF record for FuelCode [fueled],
which is invalid when using an OILM system.

You did not report one and only one default record for [parameter] for
FuelCode [fueled] in your monitoring plan that was active during current
hour.

The DefaultValue reported in the active [parameter] default record for the
hour is invalid.

The VolumetricFlowRate reported in the HFF record for FuelCode [fueled] is
invalid.

You reported a SourceOfDataVolumetricCode of [sodc] in the HFF record for
FuelCode [fueled], but the VolumetricFlowRate is not equal to the fuel flow
rate defined in the active [parameter] default record in your monitoring plan.

The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode
[fueled] is not the same as the DefaultUnitsOfMeasureCode in the active
[parameter] default record in your monitoring plan.

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

Environmental Protection Agency

Page 170 of 907


-------
Draft Check Specifications

12/16/2015

H

I

J

K

You did not report one and only one active SystemFuelFlow record for
MonitoringSystemID [ID] in your monitoring plan for the hour.

The MaximumFuelFlowRate reported in the active System Fuel Flow record
for MonitoringSystemID [ID] in your monitoring plan is invalid.

You reported a SourceOfDataVolumetricCode of 3 in the HFF record for
FuelCode [fueled], but the VolumetricFlowRate is not equal to the
MaximumFuelFlowRate specified in the active System Fuel Flow record for
MonitoringSystemID [ID] in your monitoring plan.

Warning: The VolumetricFlowRate reported in the HFF record for FuelCode
[fueled] exceeds the MaximumFuelFlowRate specified in the active System
Fuel Flow record for MonitoringSystemID [ID] in your monitoring plan.
Sources are required to periodically (at least once annually) evaluate the
appropriateness of these maximum values in the monitoring plan and make
proper adjustments when necessary. You should investigate the cause of
these exceedances and determine whether an adjustment to your monitoring
systems or monitoring plan is necessary.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

M

Usage:
1

The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode
[fueled] is not the same as the SystemFuelFlowUOMCode in the active
System Fuel Flow record for MonitoringSystemID [ID] in your monitoring
plan.

You did not report one and only one valid active Unit Capacity record in your
monitoring plan for the unit for the hour.

Critical Error Level 1

Critical Error Level 1

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 171 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-11

Check Name:

Related Former Checks:

Check Mass Oil Flow in HFF Record

Applicability:
Specifications:

Appendix D Check

\ucl

\fs20 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 is ARP == true)

return result C

If (HFF System Type == "GAS")

return result D
else if (HFF System Type == "OILV")

If ( Current Fuel Flow Record .SourceOfDataMassCode == "2" AND Current Fuel Flow Record .MassFlowRate

else i f ( 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 greater
than 0,

else

<= 0)

return result E

HFF Max Heat Input for Mass = UnitCapacityByHourLocation .MaximumHourlyHeatlnputCapacity

If (HFF GCV is not null)

HFF Calc Mass Oil Rate = HFF Max Heat Input for Mass / HFF GCV * 1000000, rounded to
one decimal place.

else

Environmental Protection Agency

Page 172 of 907


-------
Draft Check Specifications

12/16/2015

return result M

else

If ( Current Fuel Flow Record .MassFlowRate <= 0)
return result E

else

HFF Calc Mass Oil Rate = Current Fuel Flow Record MassFlowRate
else if ( 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 .FuelCode
if ( Count <> 1)
return result F

else if (Default Record .DefaultValue <= 0 OR Default Record .DefaultUnitsOfMeasureCode <> "LBHR")
return result G

else

HFF Calc Mass Oil Rate = Default Record .DefaultValue
If ( Current Fuel Flow Record .MassFlowRate <= 0)
return result E

else if ( Current Fuel Flow Record. MassFlowRate <> HFF Calc Mass Oil Rate)
return result H

else if ( Current Fuel Flow Record .MonitoringSystemID 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 MassFlowRate
Count active System Fuel Flow Record for the system.

If ( Count <> 1)
return result I

else if ( System Fuel Flow Record .MaximumFuelFlowRate <= 0 OR System Fuel Flow Record
.SystemFuelFlowUOMCode <> "LBHR")

return result J

Environmental Protection Agency	Page 173 of 907


-------
Draft Check Specifications

12/16/2015

else

else

If ( Current Fuel Flow Record. SourceOfDataMassCode ==3)

HFF Calc Mass Oil Rate = System Fuel Flow Record .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 Record .MaximumFuelFlowRate
return result L

If ( Current Fuel Flow Record .MassFlowRate <= 0)
return result E

else

HFF Calc Mass Oil Rate = Current Fuel Flow Record MassFlowRate

Results:

Result
A

B

C
D

E
F

G
H

I
J

K

Description

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.

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

Environmental Protection Agency

Page 174 of 907


-------
Draft Check Specifications

12/16/2015

Warning: The MassFlowRate reported in the HFF record for FuelCode	Informational Message

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

M	You did not report one and only one valid active Unit Capacity record in your Critical Error Level 1

monitoring plan for the unit for the hour.

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 175 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-12

Check Name:

Determine Density

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Density = null

Current Density Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND

HourlyParamFuelFlow.ParameterCode = "DENSOIL"

If ( Count >1)

return result A

Else If ( Count == 0)

If (HFF System Type == "OILV" and Current Fuel Flow Record. 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 == "GALHR" AND Density UOM <> "LBGAL")
return result D

else if ( Current Fuel Flow Record .VolumetricUnitsOfMeasureCode == "BBLHR" AND Density UOM <> "LBBBL")
return result D

else if ( Current Fuel Flow Record .VolumetricUnitsOfMeasureCode == "M3HR" AND Density UOM <> "LBM3")
return result D

else if ( Current Fuel Flow Record .VolumetricUnitsOfMeasureCode == "SCFH" AND Density UOM <> "LBSCF")

return result D
else if ( Current Density Record .ParamValFuel > 0)

Density Default = null

If ( Current Density Record. SampleTypeCode == 8)

Density Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

Environmental Protection Agency

Page 176 of 907


-------
Draft Check Specifications

12/16/2015

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

", Density UOM)

if (Max Allowed Density is not null AND Current Density Record .ParamValFuel > Max Allowed Density) OR (
Min Allowed Density is not null AND Current Density Record .ParamValFuel < Min Allowed Density )

return result E

else

HFF Density = Current Density Record ParamValFuel

if (Min Expected Density is not null AND HFF Density < Min Expected Density) OR (Max Expected
Density is not null AND HFF Density > Max Expected Density )

if (Density Default == Current Density Record .ParamValFuel)
HFF Density = Current Density Record ParamValFuel

else

return result G

else

return result H
else
return result I

return result F

else

Results:

Result

Description

You reported more than one HPFF record for [parameter] for FuelCode
[fueled] for the hour.

Severity

A

Critical Error Level 1

Environmental Protection Agency

Page 177 of 907


-------
Draft Check Specifications

12/16/2015

B
C
D

E
F
G

H
I

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.

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 178 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-13

Check Name:	Check Density Sample Type

Related Former Checks:

Applicability:	Appendix D Check

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

A	The SampleTypeCode reported in the HPFF record for DENSOIL for	Critical Error Level 1

FuelCode [fueled] is missing or invalid.

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 179 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-14

Check Name:

Check Extraneous Density Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current Density Record is not null)

If ( Current Density Record .Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If ( Current Density Record .MonitoringSystemID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If ( Current Density Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
If ( Current Density Record .OperatingConditionCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

You reported [fieldnames] in the HPFF record for DENSOIL for FuelCode
[fueled]. This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 180 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-15

Check Name:

Calculate Mass Oil Flow

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 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 = "OIL M " 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

Description

Severity

A

The MassFlowRate reported in the HFF record for FuelCode [fueled] is
inconsistent with the value calculated from the VolumetricFlowRate and
density.

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 181 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-16

Check Name:

Determine GCV

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF GCV = null

Current GCV Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND

HourlyParamFuelFlow.ParameterCode = "GCV"

If ( Count >1)

return result A

Else If ( Count == 0)

If ( Current H1HPFF Record is not null)
return result B

Else if ( Current H1HPFF Record is not null)

Current GCV Record = matching record
GCV UOM = Current GCV Record .ParameterUOMCode

if ( GCV UOM not in set \{BTUGAL, BTUBBL, BTUM3, BTUSCF, BTULB, BTUHSCF\}
return result C

else if ( Current Fuel Group == "GAS" AND GCV UOM <> "BTUHSCF")
return result D

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record .MassFlowRate is not null AND GCV UOM <>
"BTULB")

return result D

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record MassFlowRate is null AND Current Fuel Flow
Record .VolumetricUnitsOfMeasureCode == "GALHR" AND GCV UOM <> "BTUGAL")

return result D

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record MassFlowRate is null AND Current Fuel Flow
Record .VolumetricUnitsOIMeasureCode == "BBLHR" AND GCV UOM<> "BTUBBL")

return result D

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record MassFlowRate is null AND Current Fuel Flow
Record .VolumetricUnitsOIMeasureCode == "M3HR" AND GCV UOM<> "BTUM3")

return result D

Environmental Protection Agency

Page 182 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current Fuel Group == "OIL" AND Current Fuel Flow Record MassFlowRate is null AND Current Fuel Flow
Record .VolumetricUnitsOfMeasureCode == "SCFH" AND GCV UOM<> "BTUSCF")

return result D

else if ( Current GCV Record .ParamValFuel > 0)

GCV Default = null

If ( Current GCV Record. SampleTypeCode == 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
.FuelCode

If ( GCV Default == null)

GCV Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"

where "Parameter" column = "GCV -" + GCV UOM and FuelCode column is null.

If ( GCV Default == null)

Max Expected GCV= Lookup "Upper Value" in "Fuel Type Warning Levels for GCV Cross Check Table"

where "Fuel Code - Units Of Measure" column = concatenation of ( Current Fuel Flow Record .FuelCode, " -

", GCV UOM)

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

", GCV UOM)

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

", GCV UOM)

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

", GCV UOM)

if (Max Allowed GCV is not null AND Current GCV Record .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 .ParamValFuel is not rounded to one decimal place)
return result J

else

HFF GCV= Current GCV Record .ParamValFuel

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

else

Environmental Protection Agency

Page 183 of 907


-------
Draft Check Specifications

12/16/2015

If ( Current GCVRecord .ParamValFuel is not rounded to one decimal place)
return result J

else if (GCV Default == Current GCV Record .ParamValFuel)

HFF GCV= Current GCV Record .ParamValFuel

else

return result G

else

return result H
else
return result I

Results:

Result
A

B

C

D

E

F

G

H

I

J

Usage:

1

Description

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.

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

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

Environmental Protection Agency

Page 184 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-17

Check Name:

Check GCV Sample Type

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

If ( Current GCV Record is not null)

If ( Current Fuel Group == "OIL" AND Current GCV Record . SampleTypeCode not in \{ I, 2, 5, 6, 7, 8\})
return result A

else if ( Current Fuel Group == "GAS" AND Current GCV Record .SampleTypeCode not in \{0, 2, 3, 4, 6, 7, 8\})

return result A

Results:

Result

Description

The SampleTypeCode reported in the HPFF record for GCV for FuelCode
[fueled] is missing or invalid.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 185 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-18

Check Name:

Check Extraneous GCV Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current GCV Record is not null)

If ( Current GCV Record .Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If ( Current GCV Record .MonitoringSystemID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If ( Current GCV Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
If ( Current GCV Record .OperatingConditionCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

You reported [fieldnames] in the HPFF record for GCV for FuelCode
[fueled]. This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 186 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-19

Check Name:

Validate Heat Input Record

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Current HIHPFF Record = null
Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND

HourlyParamFuelFlow.ParameterCode = "HI"

If ( Count >1)

HIApp D Accumulator = -1

return result A

Else If ( Count == 0)

If (Heat Input App D Method Active For Hour == true)

HIApp D Accumulator = -1
return result B

Else if (Heat Input App D Method Active For Hour == true)

Current HIHPFF Record = matching record
if ( Current HIHPFF Record .MonitoringFormulald is null
return result C

else

Cur HI Mon Formula Record = Lookup active formula in MonitoringFormula Table where

MonitoringFormulalD = Current HI HPFF Record .MonitoringFormulalD
if ( Cur HI Mon Formula Record is null)
return result D

else if ( Cur HI Mon Formula Record .ParameterCode <> "HI")

return result E
else if ( Current Fuel Group == "GAS")

If ( Cur HI Mon Formula Record .EquationCode not in set \{D-6, F-20\})
return result F

else if ( Current Fuel Flow Record .MassFlowRate is not null)

If ( Cur HI Mon Formula Record .EquationCode not in set \{D-8, F-19\})

Environmental Protection Agency	Page 187 of 907


-------
Draft Check Specifications

12/16/2015

return result F

else

If ( Cur HI Mon Formula Record .EquationCode <> "F-19V")
return result F
else

return result G
Results:

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	Emissions Data Evaluation Report	Hourly Fuel Flow

Result	Description

A	You reported more than one HPFF record for [parameter] for FuelCode

[fueled] for the hour.

B	You did not report an HPFF record for [parameter] for FuelCode [fueled] for

the hour.

C	You did not report a FormulalD in the HPFF record for HI for FuelCode

[fueled].

D	You reported FormulalD [ID] in the HPFF record for HI for FuelCode

[fueled], but there is no active Formula record for this formula in your
monitoring plan.

E	You reported FormulalD [ID] in the HPFF record for HI for FuelCode

[fueled], but this is not an HI formula.

F	The FormulaCode of FormulalD [ID] reported in the HPFF record for HI for

FuelCode [fueled] is invalid.

G	You reported an HPFF record for GCV for FuelCode [fueled], but you have

not reported an HPFF record for HI for the hour.

Environmental Protection Agency

Page 188 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-20

Check Name:

Check Extraneous Heat Input Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current H1HPFF Record is not null)

If ( Current HI HPFF Record .MonitoringSystemID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If ( Current HI HPFF Record. SegmentNumber is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If ( Current HI HPFF Record .OperatingConditionCode 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

Description

You reported [fieldnames] in the HPFF record for HI for FuelCode [fueled].
This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 189 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-21

Check Name:

Calculate Heat Input Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Calc HI Rate = null

If ( Current H1HPFF 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. SourceOfData Mass Code = = "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 i f (HFF GCV is not null)

HIHPFF 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

HIApp D Accumulator = -1
return result A

else

if (HFF Calc Mass Oil Rate is not null)

Environmental Protection Agency

Page 190 of 907


-------
Draft Check Specifications

12/16/2015

HFF Calc HI Rate = HFF Calc Mass Oil Rate * HFF GCV/ 1000000, and round the result to one decimal
place.

else

HIApp 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

HI App D Accumulator = HI App D Accumulator + HFF Calc HI Rate * Current Fuel Flow Record
.FuelUsageTime

else

HI App D Accumulator = -1

If ( Current HIHPFF Record .ParamValFuel > 0 )

If ( Current Fuel Flow Record . SourceOfDataVolumetricCode = = "4" OR Current Fuel Flow Record
.SourceOfData Mass Code = = "4")

if ( HFF Calc HI Rate is equal to Current HIHPFF Record. ParamValFuel)

if ( Current Fuel Flow Record .SourceOfDat aVolumetric Code = = "4")

If ( Current Fuel Flow Record .Volumetric FlowRate is greater than 0, AND

HFF Calc Volumetric Rate is not equal to Current Fuel Flow Record .Volumetric FlowRate )

Flow Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances"
where Parameter = " FOIL "

if (ABS( HFF Calc Volumetric Rate - Current Fuel Flow Record Volumetric FlowRate ) >

Flow Tolerance )

return result C

else

If ( Current Fuel Flow Record .Mass FlowRate is greater than 0, AND

HFF Calc Mass Oil Rate is not equal to Current Fuel Flow Record .Mass FlowRate )

Flow Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances"
where Parameter = " FOIL "

if (ABS( HFF Calc Mass Oil Rate - Current Fuel Flow Record .Mass FlowRate ) > Flow
Tolerance )

return result D

else

If ( ABS( HFF Calc HI Rate - Current HI HPFF Record. ParamValFuel) > HI HPFF Tolerance )
return result B

Environmental Protection Agency

Page 191 of 907


-------
Draft Check Specifications

12/16/2015

else

HIApp D Accumulator = -1
return result A

Results:

Result
A

B

C

D

Usage:
1

Description

The ParameterValueForFuel in the HPFF record for [parameter] for
FuelCode [fueled] could not be recalculated due to errors listed above.

The ParameterValueForFuel reported in the HPFF record for HI for FuelCode
[fueled] is inconsistent with the recalculated value.

You reported a SourceOfDataVolumetricCode of 4, indicating that you
burned an emergency fuel, but the VolumetricFlowRate in the HFF record for
FuelCode [fueled] is inconsistent with the maximum fuel flow rate for the
unit. When you burn an emergency fuel, you should report the maximum
fuel flow rate, which is based on the maximum hourly heat input capacity of
the unit.

You reported a SourceOfDataMassCode of 4, indicating that you burned an
emergency fuel, but the MassFlowRate in the HFF record for FuelCode
[fueled] is inconsistent with the maximum fuel flow rate for the unit. When
you burn an emergency fuel, you should report the maximum fuel flow rate,
which is based on the maximum hourly heat input capacity of the unit.

Emissions Data Evaluation Report	Hourly Fuel Flow

Severity

Informational Message
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 192 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-22

Check Name:

Related Former Checks:

Check Reported Heat Input

Applicability:
Specifications:

Appendix D Check

If ( Current HIHPFF Record is not null)

If ( Current HIHPFF Record .ParamValFuel >= 0

If ( Current HIHPFF Record .ParamValFuel is not rounded to one decimal place)

return result D

else if ( Current Fuel Flow Record. SourceOfDataVolumetricCode = = "4" and HFF Max Heat Input for Volume is

if ( Current HIHPFF Record. ParamValFuel is not equal to HFF Max Heat Input for Volume)
return result E

else if ( Current Fuel Flow Record. SourceOfData Mass Code = = "4" and HFF Max Heat Input for Mass is not null)
if ( Current HIHPFF Record. ParamValFuel is not equal to HFF Max Heat Input for Mass)
return result F

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 Record .Max imum H ourlyHeatlnput Capacity
for all units .

else

Count active UnitCapacity record for the associated unit.
if ( Count <> 1)
return result A

else

Max Heat Input = Unit Capacity Record .Max imum H ourlyHeatlnput Capacity
if Current HIHPFF Record. ParamValFuel > Unit Capacity Record .Max imum H ourlyHeatlnput Capacity
return result B

not null)

else

else

return result C

Environmental Protection Agency

Page 193 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C
D

E

Usage:
1

Description

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.

Emissions Data Evaluation Report	Hourly Fuel Flow

Severity

Critical Error Level 1
Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 194 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-23

Check Name:	Check Heat Input Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

If ( Current H1HPFF Record is not null)

If ( Current HI HPFF Record .ParameterUOMCode <> "MMBTUHR")
return result A

Results:

Result	Description	Severity

A	The ParameterUOMCode reported in the HPFF record for HI for FuelCode Critical Error Level 1

[fueled] is missing or invalid. The value should be "MMBTUHR".

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 195 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-24

Check Name:

Validate S02 Record

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Current S02 HPFF Record = null

HFF S02 Equation Code = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID 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 ( SO2 App D Method Active For Hour == true)

Current S02 HPFF Record = matching record
if ( Current S02 HPFF Record .MonitoringFormulald is null
return result C

else

Cur S02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current S02 HPFF Record .MonitoringFormulalD

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

Environmental Protection Agency

Page 196 of 907


-------
Draft Check Specifications

12/16/2015

return result F

else

If ( Cur S02 Mon Formula Record .EquationCode == "D-2")

HFF S02 Equation Code = Cur S02 Mon Formula Record .EquationCode

else

return result F
else

return result G
Results:

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	Emissions Data Evaluation Report	Hourly Fuel Flow

Result	Description

A	You reported more than one HPFF record for [parameter] for FuelCode

[fueled] for the hour.

B	You did not report an HPFF record for [parameter] for FuelCode [fueled] for

the hour.

C	You did not report a FormulalD in the HPFF record for S02 for FuelCode

[fueled].

D	You reported FormulalD [ID] in the HPFF record for S02 for FuelCode

[fueled], but there is no active Formula record for this formula in your
monitoring plan.

E	You reported FormulalD [ID] in the HPFF record for S02 for FuelCode

[fueled], but this is not an S02 formula.

F	The FormulaCode of FormulalD [ID] reported in the HPFF record for S02

for FuelCode [fueled] is invalid.

G	You reported an HPFF record for S02 for FuelCode [fueled], but you do not

have an active Appendix D S02 method for the hour.

Environmental Protection Agency

Page 197 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-25

Check Name:

Check Extraneous S02 Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current S02 HPFF Record is not null)

If ( Current S02 HPFF Record .MonitoringSystemID 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 SO2 HPFF Record .OperatingConditionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If ( Current S02 HPFF Record. SampleTypeCode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

Severity

A

You reported [fieldnames] in the HPFF record for S02 for Fuel Code [fueled]. Non-Critical Error
This data should be blank.

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 198 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-26

Check Name:	Check S02 Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

If ( Current S02 HPFF Record is not null)

If ( Current S02 HPFF Record .ParameterUOMCode <> "LBHR")
return result A

Results:

Result	Description	Severity

A	The ParameterUOMCode reported in the HPFF record for S02 for FuelCode Critical Error Level 1

[fueled] is missing or invalid. The value should be "LBHR".

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 199 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-27

Check Name:

Calculate S02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Calc S02 = null

If ( Current S02 HPFF Record is not null)

if ( Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-4" AND HFF Sulfur is not null AND HFF
Calc Volumetric Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "S02 Gas HPFF" AND

UOM = "LBHR"

HFF Calc S02 = HFF Sulfur * HFF Calc Volumetric Rate * 2.0 / 7000, and round the result to 5 decimal places.

else if ( Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-5" AND HFFS02 Emission Rate is not
null AND HFF Calc HI Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "S02 Gas HPFF" AND

UOM = "LBHR"

HFF Calc S02 = HFF S02 Emission Rate * HFF Calc HI Rate , and round the result to 5 decimal places,
else if ( Current Fuel Group == "OIL" AND HFF Sulfur is not null AND HFF Calc Mass Oil Rate is not null

S02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Oil HPFF" AND
UOM = "LBHR"

HFF Calc S02 = HFF Sulfur * HFF Calc Mass Oil Rate * 2.0 /100, and round the result to 1 decimal place.

If (HFF Calc S02 is not null)

If Current Fuel Flow Record .FuelUsageTime > 0 AND Current Fuel Flow Record .FuelUsageTime <= 1 AND SO2
App D Accumulator >= 0)

// Note - this accumulates totals for all Fuel flow records and does not work like a normal parameter

SO2 App D Accumulator = S02 App D Accumulator + HFF Calc S02 * Current Fuel Flow Record
.FuelUsageTime

else

SO2 App D Accumulator = -1
If ( Current S02 HPFF Record .ParamValFuel >= 0)

if (ABS( HFF Calc S02 - Current S02 HPFF Record. ParamValFuel) > S02 HPFF Tolerance )

Environmental Protection Agency	Page 200 of 907


-------
Draft Check Specifications

12/16/2015

return result A

else

SO2 App D Accumulator = -1
return result B

Results:

Result
A

B

Usage:

1

Description

The ParameterValueForFuel reported in the HPFF record for S02 for
FuelCode [fueled] is inconsistent with the recalculated value.

The ParameterValueForFuel in the HPFF record for [parameter] for
FuelCode [fueled] could not be recalculated due to errors listed above.

Severity

Critical Error Level 1
Informational Message

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 201 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-28

Check Name:

Determine Sulfur Content

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Sulfur = null

Current Sulfur Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND

HourlyParamFuelFlow.ParameterCode = "SULFUR"

If ( Count >1)

return result A

Else If ( Count == 0)

If (HFF S02 Equation Code in set \{D-2, D-4\})
return result B

Else if (HFF S02 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 .ParamValFuel > 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)

Environmental Protection Agency	Page 202 of 907


-------
Draft Check Specifications

12/16/2015

Max Expected Sulfur = Lookup "Upper Value" in "Fuel Flow Warning Levels for Sulfur Content Cross Check

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

Max Allowed Sulfur = Lookup "Upper Value" in "Fuel Flow Reality Checks for Sulfur Content Cross Check Table"

where "Fuel Code" column = Current Fuel Flow Record .FuelCode

Min Allowed Sulfur = Lookup "Lower Value" in "Fuel Flow Reality Checks for Sulfur Content Cross Check Table"

where "Fuel Code" column = Current Fuel Flow Record .FuelCode

If (Max Allowed Sulfur is not null AND Current Sulfur 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 .ParamValFuel 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 .ParamValFuel 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

Table"

else

Results:

Result

Description

You reported more than one HPFF record for [parameter] for FuelCode

Severity

A

Critical Error Level 1

Environmental Protection Agency

Page 203 of 907


-------
Draft Check Specifications

12/16/2015

B

C
D

E
F

G
H
I

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

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 204 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-29

Check Name:

Check Extraneous Sulfur Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current Sulfur Record is not null)

If ( Current Sulfur Record .Formulaldentifier is not null)

append "Formulaldentifier" to Hourly Extraneous Fields
If ( Current Sulfur Record .MonitoringSystemID 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 Sulfur Record .OperatingConditionCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

You reported [fieldnames] in the HPFF record for SULFUR for FuelCode
[fueled]. This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 205 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-30

Check Name:

Check Sulfur Sample Type

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

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

Description

The SampleTypeCode reported in the HPFF record for SULFUR for
FuelCode [fueled] is missing or invalid.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 206 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-31

Check Name:

Determine S02 Emission Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF S02 Emission Rate = null

Current S02R Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "S02R"

If ( Count >1)
return result A
Else If ( Count == 0)

If (HFF S02 Equation Code == "D-5")
return result B

Else if (HFFS02 Equation Code == "D-5")

Current S02R Record = matching record

If ( Current S02R Record .ParameterUOMCode <> "LBMMBTU"\}

return result C
else if ( Current S02R Record .ParamValFuel > 0)

HFF S02 Emission Rate = Current S02R Record ParamValFuel

else

return result D
else
return result E

Results:

Result

Description

Severity

A

You reported more than one HPFF record for [parameter] for FuelCode	Critical Error Level 1

[fueled] for the hour.

You reported a formula with a FormulaCode of "D-5" in the HPFF record for Critical Error Level 1
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.

B

C

The ParameterUOMCode reported in the HPFF record for S02R for

Critical Error Level 1

Environmental Protection Agency

Page 207 of 907


-------
Draft Check Specifications

12/16/2015

FuelCode [fueled] is missing or invalid. The value should be "LBMMBTU".

D	The ParameterValueForFuel reported in the HPFF record for [parameter] for Critical Error Level 1

FuelCode [fueled] is invalid. The value should be greater than 0.

E	You reported an HPFF record for [parameter] for FuelCode [fueled], but you Critical Error Level 1

do not require this value to calculate S02.

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 208 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-32

Check Name:

Check Extraneous S02R Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current S02R Record is not null)

If ( Current S02R Record .MonitoringSystemID is not null)

append "MonitoringSystemID" to Hourly Extraneous Fields
If ( Current S02R Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
If ( Current S02R Record .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

Description

You reported [fieldnames] in the HPFF record for S02R for FuelCode
[fueled]. This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 209 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-33

Check Name:	Check S02R Formula

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

If ( Current S02R Record is not null)

If ( Current S02R Record .Formulaldentifier is null)

If ( Current Fuel Flow Record .FuelCode <> "PNG" OR Current S02R Record .ParamValFuel <> 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 .EquationCode <> "D-1H")
return result D

Results:

Result
A

B

C
D

Usage:

1

Description

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 210 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-34

Check Name:

Check Reported S02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

If ( Current S02 HPFF Record is not null)

If ( Current S02 HPFF Record .ParamValFuel is null or is less than 0
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

Description

Severity

A

The ParameterValueForFuel reported in the HPFF record for S02 for
FuelCode [fueled] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 211 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-35

Check Name:

Determine FC Factor

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 HFF Fc Factor = null

Current Fc Factor Record = null

Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND

HourlyParamFuelFlow.ParameterCode = "FC"

If ( Count >1)

return result A

Else If ( Count == 0)

If ( Current C02 HPFF Record 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 FcFactor Record .ParamValFuel > 0)

if ( Current FcFactor Record .ParamValFuel is not rounded to one decimal place)

HFF Fc Factor = Current Fc Factor Record ParamValFuel

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 .ParamValFuel < Min Allowed Fc Factor

return result G

else

)

return result D

else

Environmental Protection Agency

Page 212 of 907


-------
Draft Check Specifications

12/16/2015

return result E
else
return result F

Results:

Result	Description

A	You reported more than one HPFF record for [parameter] for FuelCode

[fueled] for the hour.

B	You reported an HPFF record for C02 for FuelCode [fueled], but you did not

report an HPFF record for FC for the hour.

C	The ParameterUOMCode reported in the HPFF record for FC for FuelCode

[fueled] is missing or invalid.

D	The ParameterValueForFuel reported in the HPFF record for [parameter] for

FuelCode [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] is invalid.

F	You reported an HPFF record for FC for FuelCode [fueled], but you have not

reported an HPFF record for C02 for the hour.

G	You reported [fieldname] in the [type] record for [param] that is not rounded

to the appropriate precision for that parameter.

Usage:

1	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

Environmental Protection Agency

Page 213 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-36

Check Name:

Check Extraneous Fc Factor Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current Fc Factor Record is not null)

If ( Current Fc Factor Record .Formulaldentifier is not null)
append "Formulaldentifier" to Hourly Extraneous Fields
If ( Current Fc Factor Record .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 Record .OperatingConditionCode 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

Description

You reported [fieldnames] in the HPFF record for FC for FuelCode [fueled].
This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 214 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-37

Check Name:

Validate C02 Record

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Current C02 HPFF Record = null
Count the HourlyParamFuelFlow record where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "C02"

If ( Count >1)

CO2 App D Accumulator = -1
return result A
Else If ( Count == 0)

If ( CO2 App D Method Active For Hour == true)

CO2 App D Accumulator = -1
If (Legacy Data Evaluation == false)

Else if ( CO2 App D Method Active For Hour == true)

Current C02 HPFF Record = matching record
if ( Current C02 HPFF Record .MonitoringFormulald is null

return result C

else

Cur C02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current CO2 HPFF Record .MonitoringFormulalD

if ( Cur C02 Mon Formula Record is null)
return result D

else if ( Cur CO2 Mon Formula Record. ParameterCode <> "C02")
return result E

else if ( Cur C02 Mon Formula Record .EquationCode <> "G-4")
return result F

Environmental Protection Agency	Page 215 of 907

return result B

else

return result H


-------
Draft Check Specifications

12/16/2015

else
return result G

Results:

Result
A

B

C
D

E
F
G
H

Description

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 216 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-38

Check Name:

Check Extraneous C02 Record Fields

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

If ( Current C02 HPFF Record is not null)

If ( Current C02 HPFF Record .MonitoringSystemID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If ( Current C02 HPFF Record. SegmentNumber is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If ( Current C02 HPFF Record .OperatingConditionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If ( Current C02 HPFF Record. SampleTypeCode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

Severity

A

You reported [fieldnames] in the HPFF record for C02 for FuelCode [fueled]. Non-Critical Error
This data should be blank.

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 217 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-39

Check Name:	Calculate C02 Mass Rate

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

\ucl

\fs20 HFF Calc C02 = null

If ( Current C02 HPFF Record 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
.FuelUsageTime

else

CO2 App D Accumulator = -1
If ( Current C02 HPFF Record .ParamValFuel >= 0)

if (ABS( HFF Calc C02 - Current C02 HPFF Record. ParamValFuel) > C02 HPFF Tolerance )
return result A

else

CO2 App D Accumulator = -1
return result B

Results:

Result
A

B

Usage:

1

Description

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.

Emissions Data Evaluation Report	Hourly Fuel Flow

Severity

Critical Error Level 1
Informational Message

Environmental Protection Agency

Page 218 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 219 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-40

Check Name:

Check Reported C02 Mass Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

If ( Current C02 HPFF Record is not null)

If ( Current C02 HPFF Record .ParamValFuel is null or is less than 0
return result A

else if ( Current C02 HPFF Record .ParamValFuel is not rounded to one decimal place)
return result B

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 220 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAD-44

Check Name:	Check C02 Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

If ( Current C02 HPFF Record is not null)

If ( Current C02 HPFF Record .ParameterUOMCode <> "TNHR")
return result A

Results:

Result	Description	Severity

A	The ParameterUOMCode reported in the HPFF record for C02 for FuelCode Critical Error Level 1

[fueled] is missing or invalid. The value should be "TNHR".

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 221 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAD-45

Check Name:

Related Former Checks:

Determine Appendix D Measure Codes

Applicability:
Specifications:

Appendix D Check

If ( Current Fuel Flow Record. SourceOfData Mass Code in set \{4, 5, 6\} OR Current Fuel Flow Record .SourceOfData
Volumetric Code in 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 .SourceOfData Mass Code in set \{ I, 3\} OR Current Fuel Flow Record .SourceOfData
Volumetric Code in 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 .SourceOfData Mass Code in set \{0, 9\} OR Current Fuel Flow Record
.SourceOfData Volumetric Code in 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")

Environmental Protection Agency

Page 222 of 907


-------
Draft Check Specifications

12/16/2015

set Monitor Measure Code Array for "GCV" to "ME AS SUB"

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 "ME AS SUB"

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 ( Current Density Record .SampleTypeCode in set \{1, 2, 5, 6, 7\})
if ( Monitor Measure Code Array for "DENSITY" contains "SUB")
set Monitor Measure Code Array for "DENSITY" to "MEASSUB"

else

set Monitor Measure Code Array for "DENSITY" to "MEASURE"

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 223 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-1

Check Name:

Initialize AE Reporting Method

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

\ucl

\fs20 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 Count for Oil
II App E Constant Fuel Mix detected when processing DHV records
if ( Total Fuel Sources > 1)

App E Reporting Method = "MULTIPLE"
else if ( Total Fuel Sources == 1)

App E Reporting Method = "SINGLE"

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 224 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-2

Check Name:

Validate NOXR Record

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

\ucl

\fs20 Current App E NOXR Record = null

App E NOXR HPFF Count for Gas = find matching HourlyParamFuelFlow records where

HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record .HourlyFuelFlowID 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. ParamValFuel
App E Calc HI = HFF Calc HI Rate
App E Fuel Code = Current Fuel Flow Record .FuelCode

if Current Appe E NOXR Record. OperatingConditionCode in set \{E, X, Y, Z, U, W, N, M\}

App E Op Code = Current App E NOXR Record. OperatingConditionCode

else

App E Op Code = null
return result C

else if (App E Reporting Method == "CONSTANT")
return result D

Environmental Protection Agency	Page 225 of 907


-------
Draft Check Specifications

12/16/2015

else

return result E

Results:

Result
A

B

C

D

Description

You did not report an HPFF record for NOXR to report the NOx emission
rate for individual fuels.

You reported more than one HPFF record for NOXR for FuelCode [fueled]
for the hour.

The OperatingConditionCode reported in the HPFF record for NOXR for
FuelCode [FUELCD] is missing or invalid.

You reported an HPFF record for NOXR, but, according to your monitoring
plan, you use an Appendix E mixed fuel curve to determine the NOx
emission rate. If this is the case, you should report the NOx emission rate in
a NOXR DHV record. The HPFF record will not be evaluated and the NOx
emissions rate will not be recalculated.

You reported an HPFF record for NOXR, but you have not defined a NOXR
AE method in your monitoring plan that is active during the current hour.
The HPFF record will not be evaluated and the NOx emissions rate will not
be recalculated.

Severity

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

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 226 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-4

Check Name:

Check for Extraneous Fields in NOXR Record

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null
if ( Current App E NOXR Record is not null)

if ( Current App E NOXR Record. SampleTypeCode is not NULL)

append "SampleTypeCode" to Hourly Extraneous Fields
if ( Current App E NOXR Record .MonitoringFormulald is not NULL)

append "MonitoringFormulalD" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A

Results:

Result

Description

You reported [fieldnames] in the HPFF record for NOXR for FuelCode
[fueled]. This data should be blank.

Severity

A

Non-Critical Error

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 227 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-5

Check Name:

Check Monitoring System Data for Appendix E NOXR

Related Former Checks:
Applicability:

Appendix E Check

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 Record. MonitoringSystemld is null)

if ( Current App E NOXR Record. OperatingConditionCode == "E")
if (HFF Fuel Indicator Code <> "E")

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

return result A

else

return result B

// report Monitoring System in all other cases

else

Results:

Result

Description

Severity

A

The OperatingConditionCode of E reported in the HPFF record for NOXR Critical Error Level 1
for FuelCode [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 Critical Error Level 1
FuelCode [fueled], but you did not report an OperatingConditionCode of E.

You must report a NOXE MonitoringSystemID for non-emergency fuels.

B

Environmental Protection Agency

Page 228 of 907


-------
Draft Check Specifications

12/16/2015

C

D

E

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

Emissions Data Evaluation Report ¦

¦ Hourly Fuel Flow

Environmental Protection Agency

Page 229 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-7

Check Name:

Retrieve Appendix E Correlation Test Results or Default Value

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

\ucl

\fs20 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 Record. QASuppDatald

QASuppAttribute.AttributeName = "SEGMENTCOUNT"

if ( QA Supp Attribute Count Record is not null)

App E Segment Total = QA Supp AttributeCount Record. AttributeValue

Dimension App E Correlation NOx Rate Array with App E Segment Total elements

Dimension App E Correlation Heat Input Array with/4/7/7 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. QASuppDatald

QASuppAttribute.AttributeName = "NOX RATE X" (where X matches the loop variable)

if ( QA Supp Attribute Segment NOx Record is not null)

if ( QA Supp Attribute Segment NOx Record .AttributeValue > 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 .AttributeValue
QA Supp Attribute Segment HI Record = matching record in QASuppAttribute where
QASuppAttribute.QASuppDatald = Prior Appendix E Record. QASuppDatald
QASuppAttribute.AttributeName = "HI RATE X" (where X matches the loop variable)
if ( QA Supp Attribute Segment HI Record is not null)

App E Correlation Heat Input Array [X] = QA Supp Attribute Segment HI Record .AttributeValue
else if (App E Op Code in set \{E, M, U\} )

Environmental Protection Agency	Page 230 of 907


-------
Draft Check Specifications

12/16/2015

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 NOx MER Default Record .DefaultValue

else

return result B

Results:

Result
A

B

Usage:

1

Description

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.

The NOx emission rate could not be determined, because the DefaultValue in
the NORX default record for FuelCode [fueled] is invalid.

Severity

Critical Error Level 1
Critical Error Level 1

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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

Condition: App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 231 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAE-8

Check Name:	Determine Appendix E Curve Segment

Related Former Checks:

Applicability:	Appendix E Check

Specifications:

\ucl

\fs20 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 E C ale HI > App E Correlation Heat Input Rate Array [ / ])

i = i + 1

if ( / <- App E Segment Total AND App E Calc HI <- App E Correlation Heat Input Array [ / ])

App E Calc Segment Num = i
if (App E Op Code == "Z")

if (App E Calc Segment Num <> 1)
return result C

Environmental Protection Agency

Page 232 of 907


-------
Draft Check Specifications

12/16/2015

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 [ / ])

if (App E Segment Number <> App E Calc Segment Num 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

Description

You reported a SegmentNumber in the HPFF or DHV record for NOXR for
FuelCode [fueled]. This field should be blank when
OperatingConditionCode is [OpCode].

You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF
record for NOXR for FuelCode [fueled], but the reported SegmentNumber
does not represent the segment on the Appendix E curve with the maximum
NOx emission rate.

You reported an OperatingConditionCode of Z in the DHV or HPFF record
for NOXR for FuelCode [fueled], but the calculated heat input rate is not
below the lowest point on the Appendix E curve.

You reported an OperatingConditionCode of Z in the DHV or HPFF record
for NOXR for FuelCode [fueled], but you did not report a SegmentNumber of
1.

The SegmentNumber reported in the HPFF or DHV record for NOXR for
FuelCode [fueled] is inconsistent with the calculated heat input.

You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF
record for NOXR for FuelCode [fueled], but the calculated heat input rate is
higher than the maximum heat input rate on the Appendix E curve. You
should report an OperatingConditionCode of W, and use the appropriate
substitute data algorithm to calculate the NOx emission rate.

You did not report a SegmentNumber in the HPFF or DHV record for NOXR
for FuelCode [fueled].

Severity

Critical Error Level 1
Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 233 of 907


-------
Draft Check Specifications

12/16/2015

Usage:

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

2	Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: App E Constant Fuel Mix Equals true

3	Emissions Data Evaluation Report	Hourly Fuel Flow

Condition: App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 234 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-9

Check Name:

Calculate Appendix E NOx Rate

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

\ucl

\fs20 App E Calculated NOx Rate for Source = null
if (App E Op Code in set \{ Y, Z\})

If (App E Calc Segment Num is not null)
if (App E Calc Segment Num ==1)

App E Calculated NOx Rate for Source = App E Correlation NOx Rate Array [1]

else

y2 = App E Correlation NOx Rate Array [ App E Calc Segment Num ]
x2 = App E Correlation Heat Input 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) + yl, 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 place s )

If (App E Reported Value >= Maximum App E Curve NOx Emission Rate * 1.25 (rounded to 3 decimal places))

App E Calculated NOx Rate for Source = App E Reported Value

else

Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code

if ( Count <> 1)
return result A

Environmental Protection Agency	Page 235 of 907


-------
Draft Check Specifications

12/16/2015

else

NOx MER Default Record = matching record
If (NOx MER Default Record .DefaultValue > 0)

If (App E Reported Value >= NOx MER Default Record .DefaultValue)

App E Calculated NOx Rate for Source = App E Reported Value

else

if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result B

else

NOXR App E Accumulator = -1
return result C

else

if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result D

else

NOXR App E Accumulator = -1
return result D

if (App E Calculated NOx Rate for Source is not null)

NOXR HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"
if (App E Reporting Method == "CONSTANT")

if (App E Reported Value >= 0 AND ABS( App E Calculated NOx Rate for Source - App E Reported Value ) >

NOXR HPFF Tolerance )

return result E

if (App E Reporting Method == "APPORTIONED")

Apportionment Calc NOXR Array at this Location = App E Calculated NOx Rate for Source

if (Rpt Period NOx Rate Calculated Accumulator Array 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

Environmental Protection Agency

Page 236 of 907


-------
Draft Check Specifications

12/16/2015

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

else

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

Description

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

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 237 of 907


-------
Draft Check Specifications

12/16/2015

D

E
F

G
H

Usage:
1

The NOx emission rate could not be determined, because the DefaultValue in
the NORX default record for FuelCode [fueled] is invalid.

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

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

Informational Message
Informational Message

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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

Condition: App E Constant Fuel Mix Equals false

Environmental Protection Agency

Page 238 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-13

Check Name:

Check Reported NOx Emission Rate

Related Former Checks:
Applicability:

Appendix D Check

Specifications:

If ( Current Appe E NOXR Record is not null)

If ( Current App E NOXR Record .ParamValFuel 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

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 239 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAE-14

Check Name:	Check NOXR Units Of Measure

Related Former Checks:

Applicability:	Appendix D Check

Specifications:

If ( Current App E NOXR Record is not null)

If ( Current App E NOXR Record .ParameterUOMCode <> "LBMMBTU")
return result A

Results:

Result	Description	Severity

A	The ParameterUOMCode reported in the HPFF record for NOXR for	Critical Error Level 1

FuelCode [fueled] is missing or invalid. The value should be "LBMMBTU".

Usage:

1	Emissions Data Evaluation Report	Hourly Fuel Flow

Environmental Protection Agency

Page 240 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAE-15

Check Name:

Determine Appendix E Measure Code

Related Former Checks:
Applicability:

Appendix E Check

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

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"

Usage:
1

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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: App E Constant Fuel Mix Equals true

Emissions Data Evaluation Report	Hourly Fuel Flow

Condition: App E Constant Fuel Mix Equals false

2

3

Environmental Protection Agency

Page 241 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-1

Check Name:	Determine Start Quarter

Related Former Checks:

Applicability:	General Check

Specifications:

Set Start Quarter to null.

Set SO 2 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 NOX Start Quarter to null.

Set Emissions Tolerance Deviators to null.

If (Quarter of the Current Reporting Period is greater than 1)

Locate the earliest Monitor Method for location where BeginDate is on or before the last day of the Current Reporting
Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.

If found,

If BeginDate is in a year prior to the current reporting period,

If (Annual Reporting Requirement == true)

Set Start Quarter to 1 .

else

Set Start Quarter to 2.

else

Set Start Quarter to the quarter of the BeginDate.

Locate the earliest Monitor Method for location where ParameterCode = " S 02" 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 (LME Annual == true)

Locate the earliest Monitor Method for location where ParameterCode = "NOX M ", 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.

Environmental Protection Agency

Page 242 of 907


-------
Draft Check Specifications

12/16/2015

else

if ( Current Monitor Plan Location Record LocationName 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 location s 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))

Environmental Protection Agency

Page 243 of 907


-------
Draft Check Specifications

12/16/2015

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.

Usage:
1

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 244 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

HOURAGG-2

Compare S02 Mass Accumulator Values

HOURCV-22

General Check

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 SO2 Summary Value Record is null OR Current SO2 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

Environmental Protection Agency

Page 245 of 907


-------
Draft Check Specifications

12/16/2015

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 .

e lse

return result E
// if no result

if (Rpt Period S02 Mass Reported Accumulator Array for this location >= 0 AND ABS( Rpt Period S02 Mass
Reported Accumulator Array for this location - S02 Mass Quarterly Reported Value) > S02 Mass Quarterly
Tolerance)

Reported Emissions Value = Rpt Period S02 Mass Reported Accumulator Array for this location
return result B

Results:

Result
A

B

C
D

E
F
G

Usage:

1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for S02M for the reporting period is inconsistent with the
recalculated value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for S02M is inconsistent with [sum], the sum of the hourly
values reported in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for S02M is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary
Value record for S02M, but there were no Hourly Operating Data records or
appropriate S02 Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Emissions Data Evaluation Report Summary Value 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

Environmental Protection Agency

Page 246 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

HOURAGG-3

Compare C02 Mass Accumulator Values

HOURCV-23

General Check

If Current Reporting Period Year is greater than or equal to 2012

C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"
else

C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M -OLD " AND
UOM = "TON"

Current C02 Summary Value Record = Summary Value record at this location where
Parameter = "C02M" AND
Reporting Period ID = Current Reporting Period

if (Rpt Period C02 Mass Calculated Accumulator Array 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 C 02 Mass Reported Accumulator Array for this location >= 0)

Rpt Period C 02 Mass Reported Accumulator Array for this location = (Rpt Period C 02 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 C 02 Summary Value
Record .Current Reporting Period Total is not equal to 0)

return result D

else

Environmental Protection Agency

Page 247 of 907


-------
Draft Check Specifications

12/16/2015

C02 Mass Quarterly Reported Value = Current C02 Summary Value Record .Current Reporting Period Total
if (C02 Mass Quarterly Reported Value < 0)
return result F

else if (C02 Mass Quarterly Reported Value is not rounded to one decimal place)
return result G

else if (Rpt Period C02 Mass Calculated Value is not null)

if (Rpt Period C02 Mass Calculated Value <> C02 Mass Quarterly Reported Value )

if ( ABS( Rpt Period C02 Mass Calculated Value - C02 Mass Quarterly Reported Value) > C02 Mass
Quarterly Tolerance)

return Result A

else

append "C02M" to Emissions Tolerance Deviators .

e lse

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
A

B

C
D

E
F
G

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for C02M for the reporting period is inconsistent with the
recalculated value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for C02M is inconsistent with [sum], the sum of the hourly
values reported in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for C02M is
missing or the record is missing.

You reported a value for the CurrentReportingPeriodTotal in the Summary
Value record for [param], but there was no emissions data in your file or an
appropriate C02 Method defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

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

Environmental Protection Agency

Page 248 of 907


-------
Draft Check Specifications	12/16/2015

Usage:

1	Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 249 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-4

Check Name:	Compare HI Accumulator Values

Related Former Checks: HOURCV-24

Applicability:	General Check

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 place s ).

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

Environmental Protection Agency

Page 250 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:

1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for HIT for the reporting period is inconsistent with the
recalculated value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for HIT is inconsistent with [sum], the sum of the hourly values
reported in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for HIT is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary
Value record for HIT, but there were no Hourly Operating Data records or
appropriate HI Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Emissions Data Evaluation Report Summary Value 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

Environmental Protection Agency

Page 251 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-5

Check Name:

Compare Op Hours Values

Related Former Checks: HOURCV-25
Applicability:	General Check

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

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 \ul not\ulnone 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

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

Environmental Protection Agency

Page 252 of 907


-------
Draft Check Specifications

12/16/2015

append "OPHOURS" to Emissions Tolerance Deviators .

else

return result C

Results:

Result
A

B
C
D

E

Usage:
1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for OPHOURS is inconsistent with [calcval], the number of
operating hours reported in the Hourly Operating Data records for the
reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for
OPHOURS is missing or the record is missing.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Emissions Data Evaluation Report Summary Value Evaluation

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 253 of 907


-------
Draft Check Specifications	12/16/2015

Check Code:	HOURAGG-6

Check Name:	Compare Op Time Values

Related Former Checks: HOURCV-26
Applicability:	General Check

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 \ul not\ulnone 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

Environmental Protection Agency

Page 254 of 907


-------
Draft Check Specifications

12/16/2015

else

append "OPTIME" to Emissions Tolerance Deviators .

else

return result D

else

return result C

Results:

Result
A

B

C
D

E
F

Usage:
1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for OPTIME is inconsistent with [calcval], the sum of the
hourly values reported in the Hourly Operating Data records for the reporting
period.

You did not report a Summary Value record for OPTIME for the reporting
period. While this information was not required for legacy EDR data, it is
required for ECMPS.

The CurrentReportingPeriodTotal reported in the Summary Value record for
OPTIME is invalid. The value must be greater than or equal to 0.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal in the Summary Value record for OPTIME
is missing or the record is missing.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Emissions Data Evaluation Report Summary Value Evaluation

Severity

Critical Error Level 1

Informational Message

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 255 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-7

Check Name:

Compare NOx Rate Accumulator Values

Related Former Checks: HOURCV-27
Applicability:	General Check

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

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

Rpt Period NOx Rate Calculated Value = 0

else

else

Environmental Protection Agency

Page 256 of 907


-------
Draft Check Specifications

12/16/2015

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

else

if (Expected Summary Value NOx Rate Array for this location == false)

if (Rpt Period NOx Rate Hours Accumulator Array for this Location is not equal to 0 OR Current NOx Rate
Summary Value Record .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 LocationName 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

Environmental Protection Agency	Page 257 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:
1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for NOXR for the reporting period is inconsistent with the
recalculated value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for NOXR is inconsistent with [average], the average of the
hourly values reported in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for NOXR is
missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary
Value record for NOXR, but this is not appropriate, either because there were
no Hourly Operating Data records in your emissions file, or because this
value is not consistent with the unit program records and monitoring
methodologies in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

Emissions Data Evaluation Report Summary Value 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

Environmental Protection Agency

Page 258 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-8

Check Name:	Compare NOx Mass Accumulator Values

Related Former Checks:

Applicability:	General Check

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

Environmental Protection Agency

Page 259 of 907


-------
Draft Check Specifications

12/16/2015

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 ABS( Rpt Period NOx Mass
Reported Accumulator Array for this location - NOx Mass Quarterly Reported Value) > NOx Mass Quarterly
Tolerance)

Reported Emissions Value = Rpt Period NOx Mass Reported Accumulator Array for this location
return Result B

Results:

Result
A

B

C
D

E
F
G

Usage:

1

Description

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for NOXM for the reporting period is inconsistent with the
recalculated value of [calcval].

The CurrentReportingPeriodTotal of [sumval] reported in the Summary
Value record for NOXM is inconsistent with [sum], the sum of the hourly
values reported in the DHV records for the reporting period.

The CurrentReportingPeriodTotal in the Summary Value record for NOXM
is missing or the record is missing.

You reported a value as the CurrentReportingPeriodTotal in the Summary
Value record for NOXM, but there were no Hourly Operating Data records or
appropriate NOX Methods defined in your monitoring plan.

The CurrentReportingPeriodTotal in the Summary Value record for [param]
could not be recalculated because of errors listed above.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Emissions Data Evaluation Report Summary Value 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

Environmental Protection Agency

Page 260 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-10

Check Name:

Related Former Checks:

Compare C02 Mass YTD Values

Applicability:
Specifications:

General Check

\ucl

\fs20 Annual C02M Calculated Value = null

if (Rpt Period C02 Mass Calculated Value is not null OR Expected Summary Value C02 Array for this location == false)
if (Expected Summary Value C02 Array for this location == true)

If (Emissions Tolerance Deviators contains "C02M")

Annual C02M Calculated Value = Current C02 Summary Value Record Current Reporting Period Total

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

else i f ( Current C02 Summary Value Record. YearToDateTotal is null or is less than 0)
return result B

Environmental Protection Agency	Page 261 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current C02 Summary Value Record. YearToDateTotal is not rounded to one decimal place)

return result D
else if (Annual C02M Calculated Value is not null)

if (Annual C02M Calculated Value <> Current C02 Summary Value Record. YearToDateTotal)
return result C
// If no result

If ( Current C02 Summary Value Record. OzoneSeasonToDateTotal is not null)
return result E

If (Expected Summary Value C02 Array for this location == false AND Annual C02M Calculated Value > 0)
return result F

Results:

Result	Description	Severity

A	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B
C
D
E
F
G

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 262 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-11

Check Name:

Related Former Checks:

Compare S02 Mass YTD Values

Applicability:
Specifications:

General Check

\ucl

\fs20 Annual S02M Calculated Value = null

if (Rpt Period S02 Mass Calculated Value is not null OR Expected Summary Value S02 Array for this location == fals e)
if (Expected Summary Value S02 Array for this location == true)

If (Emissions Tolerance Deviators contains "S02M")

Annual S 02M Calculated Value = Current SO 2 Summary Value Record Current Reporting Period Total

else

Annual S 02M Calculated Value = Rpt Period S02 Mass Calculated Value
else if (Quarter of the Current Reporting Period is greater than 1)

Annual S 02M 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 S 02M Calculated Value.

set Annual S02M Calculated Value to null
if ( Current S02 Summary Value Record is not null)

if (Annual S 02M Calculated Value is null AND Expected Summary Value S02 Array for this location == fals e )
return result H

else i f ( Current SO2 Summary Value Record. YearToDateTotal is null or is less than 0)
return result B

else if ( Current SO2 Summary Value Record. YearToDateTotal is not rounded to one decimal place)

Environmental Protection Agency	Page 263 of 907

else


-------
Draft Check Specifications

12/16/2015

return result D
else if (Annual S02M Calculated Value is not null)

if (Annual S02M Calculated Value <> Current S02 Summary Value Record. YearToDateTotal)
return result C
// if no result

if ( Current S 02 Summary Value Record. OzoneSeasonToDateTotal is not null)
return result F

else if (LME Annual is equal to true and Current S02 Summary Value Record. YearToDateTotal is greater than 25)
return result E

If (Expected Summary Value S02 Array for this location == fals e AND Annual S02M Calculated Value > 0)
return result G

Results:

Result
A

Description

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

B
C
D

E

F
G
H

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

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

Environmental Protection Agency

Page 264 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-12

Check Name:

Related Former Checks:

Compare NOx Mass YTD and OS Values

Applicability:
Specifications:

General Check

\ucl

\fs20 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)

Environmental Protection Agency

Page 265 of 907


-------
Draft Check Specifications

12/16/2015

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 (NOX Start Quarter is not null)

For each quarter in the current year from the NOX Start Quarter to the quarter \ul prior to\ulnone 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 NOX M 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 NOX M Calculated Value.

Environmental Protection Agency

Page 266 of 907


-------
Draft Check Specifications

12/16/2015

if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS NOX M 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 NOX M 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. YearToDateTotal is null and Annual Reporting Requirement
== true) OR ( Current NOX Mass Summary Value Record. YearToDateTotal is less than 0,

append "YearToDateTotal" to NOXM Summary Invalid Fields

If ( Current NOX Mass Summary Value Record. 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 NOX
Mass Summary Value Record. OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to NOXM Summary Invalid Fields

If ( Current NOX Mass Summary Value Record. YearToDateTotal is not rounded to one decimal place)

append "YearToDateTotal" to Imprecise Fields

If ( Current NOX Mass Summary Value Record. 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 <> 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. OzoneSeasonToDateTotal)

Environmental Protection Agency

Page 267 of 907


-------
Draft Check Specifications

12/16/2015

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

// 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 .YearTo DateTotal
is not null)

return result L

else if ((LME Annual is equal to true and Current NOXM Summary Value Record. YearToDateTotal is greater
than 100) OR (LME OS is equal to true and Current NOXM Summary Value Record. OzoneSeason ToDateTotal
is greater than 50))

else

If (Expected Summary Value NOx Mass Array for this location == false AND ( OS NOXM Calculated Value > 0 OR
Annual NOXM Calculated Value > 0))

else

return result I

return result F

return result J

Results:

Result

Description

Severity

A

The program could not determine ozone-season-to-date totals for [osparam], Critical Error Level 1

because the Op Supp Data record for this parameter is missing for one or

more previous reporting periods. If you have submitted emissions data for

prior quarters, you should be able to retrieve these records by logging on to

the EPA host.

The program could not determine year-to-date for [param], because the Op Critical Error Level 1
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B

C

The [fieldname] in the Summary Value record for [param] is missing or
invalid.

Critical Error Level 1

Environmental Protection Agency

Page 268 of 907


-------
Draft Check Specifications

12/16/2015

D

E
F

H

I

J

K

L

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

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

Environmental Protection Agency

Page 269 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-13

Check Name:

Related Former Checks:

Compare NOx Rate YTD Values

Applicability:
Specifications:

General Check

\ucl

\fs20 Annual NOXR Calculated Value = null
If (LME Annual == 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

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,

Otherwise,

Environmental Protection Agency

Page 270 of 907


-------
Draft Check Specifications

12/16/2015

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 NOx Mass to null.

If ( Total NOx Mass is not null AND Total HI is not null)

If ( Total NOx Mass == 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,
else

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 = "NOXR SUM ".

If found,

Add OpValue to Annual NOXR Calculated Value.

Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXR HRS ".
If found,

Add OpValue to TotalOpHours .

If not found,

set Annual NOXR Calculated Value to null
return result A
Otherwise,

Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXR".
Environmental Protection Agency	Page 271 of 907


-------
Draft Check Specifications

12/16/2015

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

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 i f (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 i f ( Current NOXR Summary Value Record. YearToDateTotal is null or is less than 0)

return result C
else if (Annual NOXR Calculated Value is not null)

if {Annual NOXR Calculated Value <> Current NOXR Summary Value Record. YearToDateTotal)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"

Environmental Protection Agency

Page 272 of 907


-------
Draft Check Specifications

12/16/2015

if (ABS( Annual NOXR Calculated Value - Current NOXR Summary Value Record. YearToDateTotal) >
Tolerance)

return result D

// if no result

if ( Current NOXR Summary Value Record. OzoneSeasonToDateTotal is not null)
return result F
else

I f (Expected Summary Value NOx Rate Array for this location == false AND Annual NOXR Calculated Value > 0)
return result G

Results:

Result	Description	Severity

A	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

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.

C
D

E

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.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

F
G
H

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.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 273 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-14

Check Name:	Compare Total Heat Input YTD and OS Values

Related Former Checks:

Applicability:	General Check

Specifications:

\ucl

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

else

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)

Environmental Protection Agency

Page 274 of 907


-------
Draft Check Specifications

12/16/2015

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 \ul prior to\ulnone the
quarter of the Current Reporting Period :

If this quarter is equal to 2 AND OS Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode = "HITOS".

If not found,

if (Expected Summary Value HI Array for this location == true)
set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result A
otherwise,

Locate an Op Supp Data record for the location and quarter where ParameterCode = "HIT".
If found,

set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result A

Otherwise,

add OpValue to OS HIT Calculated Value.

If this quarter is not equal to 2 OR Annual Reporting Requirement == true,

Locate an Op Supp Data record for the location and quarter where ParameterCode = "HIT".

If not found,

if (Expected Summary Value HI Array for this location == true)
set Annual HIT Calculated Value to null,
set OS HIT Calculated Value to null
return result B
Otherwise,

if Annual Reporting Requirement == true

add OpValue to Annual HIT Calculated Value.
if this quarter is equal to 3 AND OS Reporting Requirement == true
add OpValue to OS HIT Calculated Value.

Environmental Protection Agency

Page 275 of 907


-------
Draft Check Specifications

12/16/2015

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 Value Record. YearToDateTotal is null and Annual Reporting Requirement == true)
OR ( Current HI Summary Value Record. YearToDateTotal is less than 0,

append "YearToDateTotal" to HIT Summary Invalid Fields

If ( Current HI Summary Value Record. OzoneSeasonToDateTotal is null and OS Reporting Requirement ==
true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4 ), OR Current HI Summary Value
Record. OzoneSeasonToDateTotal is less than 0,

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

If ( Current HI Summary Value Record. YearToDateTotal is not rounded to zero decimal places)

append "YearToDateTotal" to Imprecise Fields

If ( Current HI Summary Value Record. OzoneSeasonToDateTotal is not rounded to zero decimal places)

If (Legacy Data Evaluation == false OR Current HI Summary Value Record. OzoneSeasonToDateTotal is
not rounded to one decimal place)

append "OzoneSeasonToDateTotal" to Imprecise Fields

If (HIT Summary Invalid Fields is not null)

return result C

else if (Imprecise Fields is not null)

set HIT Summary Invalid Fields to Imprecise Fields

return result E

else if (Annual HIT Calculated Value is not null OR OS HIT Calculated Value is not null)

Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"

if (Annual HIT Calculated Value is not null AND Annual HIT Calculated Value <> Current HI Summary
Value Record. YearToDateTotal)

a ppend "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)

Environmental Protection Agency

Page 276 of 907


-------
Draft Check Specifications

12/16/2015

if (ABS( OS HIT Calculated Value - Current HI Summary Value Record.
OzoneSeasonToDateTotal) > Tolerance OR the quarter of the Current Reporting Period is greater
than 2)

append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields

else

if (ABS( OS HIT Calculated Value - Current HI Summary Value Record.
OzoneSeasonToDateTota 1 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 Summ ary 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. Year ToDateTotal 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

Description

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

Severity

Critical Error Level 1

Environmental Protection Agency

Page 277 of 907


-------
Draft Check Specifications

12/16/2015

the EPA host.

B

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.

Critical Error Level 1

C
D

E
F
G

H

I

J

K

L

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

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

Environmental Protection Agency

Page 278 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-15

Check Name:

Compare Operating Time YTD and OS Values

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Annual OPTIME Calculated Value = null
OS OPTIME Calculated Value = null
OPTIME Summary Invalid Fields = null

Imprecise Fields = null

if (Rpt Period Op Time Calculated Value is not null)

If Annual Reporting Requirement == true

If (Emissions Tolerance Deviators contains "OPTIME")

Annual OPTIME Calculated Value = Current Op Time Summary Value Record Current Reporting Period Total

Annual OPTIME Calculated Value = Rpt Period Op Time Calculated Value
If OS Reporting Requirement == true )

if (the Quarter of the Current Reporting Period is equal to 2 or 3 )

If Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal to 2,

OS OPTIME Calculated Value = Rpt Period Op Time Accumulator Array for this location - April Op Time
Accumulator Array for this location.

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 \ul prior to\ulnone the quarter of the
Current Reporting Period:

If this quarter is equal to 2 AND OS Reporting Requirement == true

else

else

Environmental Protection Agency

Page 279 of 907


-------
Draft Check Specifications

12/16/2015

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

Environmental Protection Agency	Page 280 of 907


-------
Draft Check Specifications

12/16/2015

( Current Op Time Summary Value Record. YearToDateTotal is less than 0,

append "YearToDateTotal" to OPTIME Summary Invalid Fields

If ( Current Op Time Summary Value Record. OzoneSeasonToDateTotal is null and OS Reporting Requirement ==
true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4 ), OR Current Op Time Summary Value
Record. OzoneSeasonToDateTotal is less than 0,

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 Record. OzoneSeasonToDateTotal)

if (ABS( OS OPTIME Calculated Value - Current Op Time Summary Value Record.
OzoneSeasonToDateTotal) > Tolerance OR quarter of the Current Reporting Period is greater than 2 )

append "OzoneSeasonToDateTotal" to OPTIME Summary Invalid Fields

If OPTIME Summary Invalid Fields is not null,

If ( OPTIME Summary Invalid Fields contains "Year")

If ( OPTIME Summary Invalid Fields contains "Ozone")

return result D

else

return result G

else

Environmental Protection Agency

Page 281 of 907


-------
Draft Check Specifications

12/16/2015

return result H

// if no result

if ( OS Reporting Requirement == false and Current Op Time Summary Value Record. OzoneSeasonToDateTotal is
not null)

return result F

else if (Annual Reporting Requirement == false and Current Op Time Summary Value Record. Year ToDateTotal is
not null)

return result I

Results:

Result
A

B

Description

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or
more previous reporting periods. If you have submitted emissions data for
prior quarters, you should be able to retrieve these records by logging on to
the EPA host.

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

Critical Error Level 1

C
D

E
F

G
H
I

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 282 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-16

Check Name:	Compare Operating Hours YTD and OS Values

Related Former Checks:

Applicability:	General Check

Specifications:

\ucl

\fs20 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 \ul prior to\ulnone the quarter of the
Current Reporting Period:

Environmental Protection Agency

Page 283 of 907


-------
Draft Check Specifications

12/16/2015

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 Value Record. YearToDateTotal is null and Annual Reporting Requirement == true)
OR

( Current Op Hours Summary Value Record. YearToDateTotal is less than 0,

append "YearToDateTotal" to OPHOURS Summary Invalid Fields

If ( Current Op Hours Summary Value Record. 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. OzoneSeasonToDateTotal is less than 0,

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

Environmental Protection Agency	Page 284 of 907


-------
Draft Check Specifications

12/16/2015

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

append "YearToDateTotal" to OPTIME Summary Invalid Fields

if ( OS OPHOURS Calculated Value is not null AND OS OPHOURS Calculated Value <> Current Op Hours
Summary Value Record. OzoneSeasonToDateTotal)

if (ABS( OS OPHOURS Calculated Value - Current Op Hours Summary Value Record.
OzoneSeasonToDateTotal) > Tolerance OR quarter of the Current Reporting Period is greater than 2 )

append "OzoneSeasonToDateTotal" to OPHOURS Summary Invalid Fields

If OPHOURS Summary Invalid Fields is not null,

If ( OPHOURS Summary Invalid Fields contains "Year")

If ( OPHOURS Summary Invalid Fields contains "Ozone")

return result D

else

return result G

else

return result H

// if no result

if ( OS Reporting Requirement == false and Current Op Hours Summary Value Record. OzoneSeasonToDateTotal is
not null)

return result F

else if (Annual Reporting Requirement == false and Current Op Hours Summary Value Record. Year ToDateTotal
is not null)

return result I

Environmental Protection Agency

Page 285 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C
D

E
F

G
H
I

Usage:

1

Description	Severity

The program could not determine ozone-season-to-date totals for [osparam], Critical Error Level 1

because the Op Supp Data record for this parameter is missing for one or

more previous reporting periods. If you have submitted emissions data for

prior quarters, you should be able to retrieve these records by logging on to

the EPA host.

The program could not determine year-to-date for [param], because the Op Critical Error Level 1
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.

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

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 286 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURAGG-17

Check Name:	Check BC02 Summary Value

Related Former Checks:

Applicability:	General Check

Specifications:

\ucl

\fs20 Current BC02 Summary Value Record = Summary Value record at this location where
Parameter = " B C02" AND
Reporting Period ID = Current Reporting Period

Set RGGI Begin Date , RGGI Start Quarter , AND BC02 Quarterly Reported Value to null.

if ( Current BC02 Summary Value Record is not null)
if ( CurrentMonitorPlanLocationRecord .StackPipelD is not null)
return result A

else

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 B C02 Summary Value Record .Current Reporting Period Total < 0)
return result C

else if ( Current B C02 Summary Value Record .Current Reporting Period Total is not rounded to one decimal
place)

return result D

else

BC02 Quarterly Reported Value = Current B C02 Summary Value Record Current Reporting Period Total

Results:

Result	Description	Severity

Environmental Protection Agency	Page 287 of 907


-------
Draft Check Specifications

12/16/2015

A
B
C
D
E

You reported a Summary Value record for [param], but this value should
only be reported at the unit, not at a stack or pipe.

You reported a Summary Value record for BC02, but this location does not
belong to the RGGI program during this reporting period.

The CurrentReportingPeriodTotal reported in the Summary Value record for
[param] is invalid. The value must be greater than or equal to 0.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

This check result is obsolete.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 288 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAGG-18

Check Name:

Compare BC02 Mass YTD Values

Related Former Checks:
Applicability:

General Check

Specifications:

Set Annual B C02 Calculated Value to null.

I f (BC02 Quarterly Reported Value is not null)

Annual BC02M Calculated Value = BC02 Quarterly Reported Value

else

Annual BC02M Calculated Value = -1

If (RGGI Start Quarter is not null AND Quarter of the Current Reporting Period is greater than 1)

For each quarter in the current year from the RGGI Start Quarter to the quarter prior to the quarter of the Current
Reporting Period:

Locate an Op Supp Data record for the location and quarter where ParameterCode = " BC 02".

If not found,

I f (BC02 Quarterly Reported Value is not null)
set Annual B C02 Calculated Value to null
return result A
Otherwise,

If (Annual BC02M Calculated Value = = -1)

If ( Current B C02 Summary Value Record is not null)

If (Annual BC02M Calculated Value = -1)
set Annual B C02 Calculated Value to null
return result G

else i f ( Current B C02 Summary Value Record. YearToDateTotal is null or is less than 0)
return result B

else if ( Current B C02 Summary Value Record. YearToDateTotal is not rounded to one decimal place)

return result C
else if (Annual B C02 Calculated Value is not null)

if ( Annual BC 02 Calculated Value <> Current B C02 Summary Value Record. YearToDateTotal)

Set Annual BC02M Calculated Value to OpValue

else

add OpValue to Annual B C02 Calculated Value.

Environmental Protection Agency

Page 289 of 907


-------
Draft Check Specifications

12/16/2015

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

if (ABS( Annua! B C02 Calculated Value - Current B C02 Summary Value Record. YearToDateTotal) >
Tolerance)

return result D

// If no result

If ( Current B C02 Summary Value Record. OzoneSeasonToDateTotal is not null)
return result E.
else

If ( Annual B C02 Calculated Value == -1)

set Annual B C02 Calculated Value to null

If (Annual B C02 Calculated Value > 0)
return result F

Results:

Result	Description	Severity

A	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B
C
D
E
F
G

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Evaluation

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 290 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-1

Check Name:

Determine Monitoring Plan Configuration

Related Former Checks: HOUROP-28
Applicability:	CEM Check

Specifications:

\ucl

\fs20 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 NOxRateTimes OpTime 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

Environmental Protection Agency	Page 291 of 907


-------
Draft Check Specifications

12/16/2015

CurrentAppendixEStatus = null
EarliestLocationReportDate = null
Current Measure Code = null

Set Monitor Measure Code Array to null for each parameter.

For each array below, initialize each array with Current Location Count entries and the values as described
Apportionment OpTime Array - set each element in array to 0.0
Apportionment Load Array - set each element in array to 0
Apportionment Calc HI Array - set each element in array to 0.0
Apportionment Calc NOXR Array - set each element in array to 0.0
Apportionment HI Method Array - set each element in array to null
Apportionment NOX Method Array - set each element in array to null
Apportionment HI Me asure Code Array - set each element in array to null
Apportionment NOX R Me asure Code Array - set each element in array to null
Apportionment Stack Unit List - set each element in array to null
Apportionment NOX R 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

Environmental Protection Agency

Page 292 of 907


-------
Draft Check Specifications	12/16/2015

BeginDate <= Current Date AND EndDate >= Current Date AND
StackPipeld = MonitorLocation. StackPipeLd
add 1 to Stack Unit Count

append MonitorLocationID of the unit to Apportionment Stack Unit List for the stack location

if ( StackPipeUnit Count > 0)

if (MonitorLocation .StackPipeName begins with "MS")

add 1 to MS Count
else if (MonitorLocation .StackPipeName begins with "MP")

add 1 to MP Count
else if (MonitorLocation .StackPipeName begins with "CS")
add 1 to CS Count
if (CS Count == 1)

CS Unit Count = Stack Unit Count
else if (MonitorLocation .StackPipeName begins with "CP")
add 1 to CP Count
if ( CP Count ==1)

CP Unit Count = Stack Unit Count
else if Unitld is not null
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 .UnitID = 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 = "C SMS "

Environmental Protection Agency

Page 293 of 907


-------
Draft Check Specifications

12/16/2015

else if ( C S Count + MS Count > 0)

MP Stack Config for Hourly Checks = " COMPLEX "

If ( C P 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 "

Usage:

1	Emissions Data Evaluation Report — Hourly Configuration Initialization

Environmental Protection Agency

Page 294 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-2

Check Name:

Pre-Validate Heat Input Calculation

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Calculate Apportioned HI = false
Calculate NOXM From Apportioned HI = false
if Current Monitor Plan Location Record .StackPipelD 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 OpTime Array for the location > 0 AND Apportionment OpTime 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

Environmental Protection Agency

Page 295 of 907


-------
Draft Check Specifications

12/16/2015

If ( Config HeatlnputTimesOpTime Accumulator > 0)

Calculate Apportioned HI = true

if (MP Load UOM <> "INVALID" AND Stack LoadTimesOpTime 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
Stack LoadTimesOpTime 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 NOX Method Array == "NOXR")

Calculate NOXM From Apportioned HI = true

If Max Stack OpTime > Unit OpTime Accumulator + (the number of units in the monitoring plan * .005) AND
MP Pipe Config for Hourly Checks is null

return result B

Environmental Protection Agency

Page 296 of 907


-------
Draft Check Specifications

12/16/2015

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 == "C OMPLEX " 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)

Environmental Protection Agency

Page 297 of 907


-------
Draft Check Specifications

12/16/2015

if (MP Unit Load o Apportionment Load Array for the location)
return result F

Results:

Result
A

B

C

D

E

F

G

Usage:

1

Description

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.

Emissions Data Evaluation Report — Hourly Configuration 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

Environmental Protection Agency

Page 298 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-3

Check Name:

Calculate Apportioned or Summed Heat Input Rate

Related Former Checks: HOUROP-29

Applicability:

CEM Check

Specifications:

\ucl

\fs20 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 DerivedHourlyValueData records for location

WHERE ParameterCode = "HI"

If ( Count ==1)

Current HI Apportionment Record = matching record

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI" AND
UOM = "MMBTUHR"

else

Calculate Apportioned HI = false

// F-25

If {MP Stack Config for Hourly Checks == "CS" AND Current HI Entity Type = "CS")

If ( Calculate Apportioned HI = = true)

HI Calculated Apportioned Value = Config HeatlnputTimesOpTime Accumulator / Apportionment OpTime
Array for this Location, rounded to one decimal place.

if ( Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >= 0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated Accumulator for
this location + (HI Calculated Apportioned Value * Apportionment OpTime Array for this Location)

if ( Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for this location
+ (HI Calculated Apportioned Value * Apportionment OpTime Array for this Location)

if ( Current HI Apportionment Record .AdjustedHourlyValue >= 0 AND ABS( Current HI Apportionment
Record .AdjustedHourly Value - HI Calculated Apportioned Value ) > Heat Input Tolerance )

Environmental Protection Agency

Page 299 of 907


-------
Draft Check Specifications

12/16/2015

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

else if ( Current HI Entity Type <> " Unit")

If ( Calculate Apportioned HI = = true AND Current HI Apportionment Record .AdjustedHourly 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 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 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 Record .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) I Apportionment OpTime Array for this Location), rounded to one
decimal place.

else

HI Calculated Apportioned Value = Current HI Apportionment Record .AdjustedHourly Value

Environmental Protection Agency

Page 300 of 907


-------
Draft Check Specifications

12/16/2015

HI Calculated Apportioned Value = HI Calculated Apportioned Value + Apportionment Calc HI Array for
this Location

if ( Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >= 0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated Accumulator
for this location + (HI Calculated Apportioned Value * Apportionment OpTime Array for this
Location)

if ( Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for this
location + (HI Calculated Apportioned Value * Apportionment OpTime Array for this Location)

if ( Current HI Apportionment Record .AdjustedHourly Value >= 0 AND ABS( Current HI Apportionment
Record .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

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 Config for Hourly Checks begins with " CS " OR MP Stack Config for 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 - Unit HeatlnputTimesOpTime Accumulator ) <= Heat
Input Tolerance OR Apportionment HI Method Array for the location == " COMPLEX " OR (MP Stack Config
for Hourly Checks == " COMPLEX " and MP Pipe Config for Hourly Checks is null))

HI Calculated Apportioned Value = Current HI Apportionment Record .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)

Environmental Protection Agency

Page 301 of 907


-------
Draft Check Specifications

12/16/2015

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 DerivedHourlyValueData 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 Config for Hourly Checks == "MS")

If ( Calculate Apportioned HI = = true)

HI Calculated Apportioned Value = Config HeatlnputTimesOpTime Accumulator / Unit OpTime Accumulator
, rounded to one decimal place.

if ( Current Month is not April OR Annual Reporting Requirement == true)

If (Rpt Period HI Calculated Accumulator for this location >= 0)

Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated Accumulator for
this location + (HI Calculated Apportioned Value * Unit OpTime Accumulator )

if ( Current Month is April)

April HI Calculated Accumulator for this location = April HI Calculated Accumulator for this location
+ (HI Calculated Apportioned Value * Apportionment OpTime Array for this Location)

if ( Current HI Apportionment Record .AdjustedHourly Value >= 0 AND ABS( Current HI Apportionment
Record .AdjustedHourly Value - HI Calculated Apportioned Value ) > Heat Input Tolerance )

return result A

Environmental Protection Agency

Page 302 of 907


-------
Draft Check Specifications

12/16/2015

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

Results:

Result	Description

A	The AdjustedHourlyValue reported in the DHV record for HI is inconsistent

with the recalculated apportioned or summed value.

B	The AdjustedHourly Value in the DHV record for [param] could not be

recalculated due to other errors listed in this report.

C	The heat input calculated for the configuration is inconsistent with the sum of

the reported heat input at the units in this configuration.

D	You reported heat input at the unit, but there was no heat input at any of the

locations where heat input was measured.

Usage:

1	Emissions Data Evaluation Report — Hourly Configuration Evaluation

Severity

Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 303 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-4

Check Name:

Calculate NOx Mass Rate from Apportioned or Summed Heat Input Rate

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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 DerivedHourlyValueData records for location and hour

WHERE ParameterCode = "NOX"

If ( Count ==1)

Current NOX Apportionment Based Record = matching record

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

NOX Calculated Apportionment Based Value = HI Calculated Apportioned Value * Apportionment Calc NOXR
Array , rounded to one decimal place.

if ( Current Month is not April OR Annual Reporting Requirement == true

if {Apportionment OpTime Array for this 1 ocation is between 0 and 1 (inclusive))

If (Rpt Period NOX Mass Calculated Accumulator for this location) >= 0)

Rpt Period NOX Mass Calculated Accumulator for this location = Rpt Period NOX Mass
Calculated Accumulator for this location + (NOX Calculated Apportionment Based Value *
Apportionment OpTime Array for this 1 ocation)

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 1 ocation)

else

Rpt Period NOX Mass Calculated Accumulator for this location = -1

if ( Current NOX Apportionment Record .AdjustedHourly Value >= 0)

If (ABS( Current HI Apportionment Record .AdjustedHourly Value - NOX Calculated Apportionment Based
Value ) > NOX Tolerance )

If (Legacy Data Evaluation == false)

return result A

Environmental Protection Agency

Page 304 of 907


-------
Draft Check Specifications

12/16/2015

else if (Apportionment Op Time Array for this Location is greater than 0 and less than or equal to 1)

If (ABS( Current HI Apportionment Record .AdjustedHourly Value - NOX Calculated
Apportionment Based Value ) > NOX Tolerance / Apportionment OpTime Array for this Location)

return result A

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B

Results:

Result	Description

A	The AdjustedHourly Value reported in the DHV record for [param] is

inconsistent with the recalculated value.

B	The AdjustedHourly Value in the DHV record for [param] could not be

recalculated due to other errors listed in this report.

Usage:

1	Emissions Data Evaluation Report — Hourly Configuration Evaluation

Severity

Critical Error Level 1
Informational Message

Environmental Protection Agency

Page 305 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-5

Check Name:

Sum Weighted NOx Emission Rate from Multiple Stacks

Related Former Checks:
Applicability:

CEM Check

Specifications:

If { MP Stack Config for Hourly Checks == "MS" AND Current HI Entity Type == "Unit")

If ( Config NOxRateTimesHeatlnput Accumulator <> 0 OR Config NOxRateTime sOpTime 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 i f ( Config NOxRateTimes OpTime 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 NOxRateTimes OpTime 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

Usage:
1

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 306 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-6

Check Name:

Initialize Variable for Calculating Appendix E NOx Rate via Apportionment

Related Former Checks:
Applicability:

Appendix E Check

Specifications:

If (App E Checks Needed == true)

App E Op Code = null

App E Reporting Method = "APPORTIONED "

Count active DerivedHourlyValueData records for location and hour

WHERE ParameterCode = "NOX"

If ( Count ==1)

Current NOX R Apportionment Based Record = matching record

if ( Current NOX R Apportionment Based Record .MonitoringSystemID is not null)

Mon Sys Record = find active MonitoringSystemData record for location where

MonitoringSystemData.MonitoringSystemID = Current NOX R Apportionment Based Record
.MonitoringSystemID

if (found AND Mon Sys Record. SystemTypeCode == "NOXE" AND Mon Sys Record .FuelTypeCode is not null)
if ( Current NOX R Apportionment Based Record. OperatingConditionCode in set \{X, Y, Z, U, W, N, M\})
App E Op Code = Current NOX R Apportionment Based Record. OperatingConditionCode
App E Calc HI = HI Calculated Apportioned Value

App E Reported Value = Current NOX R Apportionment Based Record . AdjustedHourly Value
App E Segment Number = Current NOX R Apportionment Based Record . SegmentNumber
App E NOXE System ID = Current NOX R Apportionment Based Record MonitoringSystemID
App E NOXE System Identifier = Current NOX R Apportionment Based Record . Systemldentifier
App E Fuel Code = Mon Sys Record .Fuel Type Code

EarliestLocationReportDate = CurrentMonitorPlanLocationRecord .EarliestReportDate
else if ( Current NOX R Apportionment Based Record. OperatingConditionCode == "E")
return result A

else

return result B

else

return result C

Results:

Environmental Protection Agency

Page 307 of 907


-------
Draft Check Specifications

12/16/2015

Result
A

B
C

Description

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

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 308 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURAPP-7

Check Name:

Handle NOx Rate Summary Expected for ARP

Related Former Checks:

Applicability:

Specifications:

If CurrentHIEntityType is equal to "Unit", MPStackConfig F orHourlyChecks is equal to "MS", and the
ExpectedSummaryValueNOxRateArray value for this location is equal to false,

Locate a record in LocationProgramRecordsByHour A ndLocation 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

Usage:
1

Emissions Data Evaluation Report — Hourly Configuration Evaluation

Environmental Protection Agency

Page 309 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-1

Check Name:

Calculate Percent H20

Related Former Checks:
Applicability:

CEM Check

Specifications:

if (H20 Method Code = "MWD" AND Current DHV Record .ModcCode in set \{01, 02, 03, 04, 53, 54\})

if (H20 CEM Equation Code == "F-31")

if ( Current DHV Record Valid == true AND 02 Wet Calculated Adjusted Value is not null AND 02 Dry Calculated
Adjusted Value is not null)

H20 DHV Calculated Adjusted Value = (( 02 Dry Calculated Adjusted Value - 02 Wet Calculated Adjusted
Value) * 100.0 ) / 02 Dry Calculated Adjusted Value, ROUNDED to one decimal place.

H20 Cone Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "H20" AND
UOM = "PCT"

If (Derived Hourly Adjusted Value Status == true AND ABS( H20 DHV Calculated Adjusted Value - Current
DHV Record .AdjustedHourly Value) > H20 Cone Tolerance)

return result A

else if (H20 CEM Equation Code == "M-1K")

if (Derived Hourly Adjusted Value Status == true)

H20DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly Value

else

return result B

else if (H20 Method Code = "MD F " 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

else

return result B

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Informational Message

Usage:

Environmental Protection Agency

Page 310 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	H20 Calculation Verification

Environmental Protection Agency

Page 311 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-3

Check Name:

Determine Diluent Cap and Moisture for C02 Concentration Calculation Verification

Related Former Checks:
Applicability:

CEM Check

Specifications:

if ( C02 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 MHV
Calculated Adjusted Value is not null)

Calculated Moisture for C02C = H20 MHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for C02C = H20 DHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is
not null)

Calculated Moisture for C02C = H20 Default Value
if ( Use 02 Diluent Cap for Co2 Cone Calc == true)

02X Count = # 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 MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent for C02C = MonitoringDefault.DefaultValue
else

case ( CO2 Cone CEM Equation Code )

'F-14A":

Calculated Diluent for C02C = 02 Dry Calculated Adjusted Value

'F-14B":

Environmental Protection Agency

Page 312 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B
C

Usage:

1

Calculated Diluent for C02C = 02 Wet Calculated Adjusted Value

Description	Severity

You reported more than one diluent cap default record for 02X in your	Critical Error Level 1

monitoring plan that was active during current hour.

You did not report a default record for 02X in your monitoring plan that was Critical Error Level 1
active during the current hour. Please note that the use of a diluent cap to
calculate C02 concentration is only applicable to legacy data.

The DefaultValue reported in the active Default record for 02X in your	Critical Error Level 1

monitoring plan is invalid. The value must be greater than 0.

Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 313 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-4

Check Name:

Calculate C02 Concentration

Related Former Checks:
Applicability:

CEM Check

Specifications:

If ( Current DHVRecord .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 ( CO2 Cone CEM Equation Code )

"F-14A":

If ( Current DHV Record Valid == true AND Calculated Diluent for C02C is not null AND Valid FC Factor
Exists == true AND Valid FD Factor == true)

C02C DHV Calculated Adjusted Value = 100 * ( Current Hourly Op Record .FcFactor / Current Hourly
Op Record .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( C02C DHV Calculated Adjusted Value -
Current DHV Record .AdjustedHourly Value) > C02 Cone Tolerance)

return result A

else

return result B

"F-14B":

If ( Current DHV Record Valid == true AND Calculated Diluent for C02C is not null AND Valid FC Factor
Exists == true AND Valid FD Factor Exists == true AND Calculated Moisture for C02C is not null)

C02C DHV Calculated Adjusted Value = [100/20.9] * ( Current Hourly Op Record .FcFactor / Current
Hourly Op Record .FdFactor) * [20.9 * ((100 - Calculated Moisture for C02C )/100) - Calculated Diluent
for C02C ], and round the result to 1 decimal place.

If ( C02C DHV Calculated Adjusted Value < 0)

C02C DHV Calculated Adjusted Value = 0

If (Derived Hourly Adjusted Value Status == true AND ABS( C02C DHV Calculated Adjusted Value -
Current DHV Record .AdjustedHourly Value) > C02 Cone Tolerance)

return result A

else

return result B

Otherwise

Environmental Protection Agency

Page 314 of 907


-------
Draft Check Specifications

12/16/2015

return result B
else

C02C DHV Calculated Adjusted Value = Current DHV Calculated Adjusted Value

Results:

Result
A

B

Description

The AdjustedHourlyValue 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
Informational Message

Usage:
1

Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 315 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-6

Check Name:

Determine Diluent Cap and Moisture for Heat Input Calculation Verification

Related Former Checks:
Applicability:

General Check

Specifications:

If (Heat Input Method Code == "CEM")

if (Heat Input Equation Code in set \{F-16, F-17, F-18\}

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for HI = H20 DHV Calculated Adjusted Value

else if (H20 Method Code in set \{MMS, MTB\} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for HI = H20 MHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND 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 .DiluentCapIndicator == 1)

C02N Count = # of active MonitoringDefault records for the location where
ParameterCode = 'C02N' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if ( C02N Count >1)

return result A
else if ( C02N Count == 0)

return result B
else if MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent For HI = MonitoringDefault.DefaultValue
else if ( CO 2 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

Environmental Protection Agency	Page 316 of 907


-------
Draft Check Specifications

12/16/2015

else

Calculated Diluent for HI = C02C MHV Calculated Adjusted Value
else if (Heat Input Equation Code = = "F-17" OK Heat Input Equation Code == "F-18")
if ( Current DHVRecord .DiluentCapIndicator == 1)

02X Count = # of active MonitoringDefault records for the location where
ParameterCode = '02X' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if ( 02X Count > 1)
return result D
else if ( 02X Count == 0)

return result E
else if MonitoringDefault.DefaultValue <= 0
return result F

else

Calculated Diluent For HI = MonitoringDefault.DefaultValue
else if (Heat Input Equation Code = = "F-17" AND 02 Wet Checks Needed for Heat Input == true)
if ( Current 02 Wet Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = 02C SD Calculated Adjusted Value

else

Calculated Diluent for HI = 02 Wet Calculated Adjusted Value
else if (Heat Input Equation Code = = "F-18" AND 02 Dry Checks Needed for Heat Input == true)
if ( Current 02 Dry Missing Data Monitor Hourly Record is not null)

Calculated Diluent for HI = 02C SD Calculated Adjusted Value

else

Calculated Diluent for HI = 02 Dry Calculated Adjusted Value

Results:

Result

Description

Severity

A

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

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

D

Critical Error Level 1

Environmental Protection Agency

Page 317 of 907


-------
Draft Check Specifications

12/16/2015

monitoring plan that was active during current hour.

E	You did not report a default record for 02X in your monitoring plan that was Critical Error Level 1

active during the current hour. Please note that the use of a diluent cap to
calculate HI is only applicable to legacy data.

F	The DefaultValue reported in the active Default record for 02X in your	Critical Error Level 1

monitoring plan is invalid. The value must be greater than 0.

Usage:

1	Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 318 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-7

Check Name:

Related Former Checks:

Calculate Heat Input

Applicability:
Specifications:

General Check

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 DHVRecord . AdjustedHourly Value * Current Hourly Op Record.
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

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

HI Calculated Adjusted Value = ( FLOW Calculated Adjusted Value * Calculated Diluent for Heat Input)
/ ( Current Hourly Op Record .FcFactor * 100.0), and round the result to 1 decimal place.

else

return result A

= "F-16":

If ( Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FC Factor Exists

else

Rpt Period HI Reported Accumulator Array for this location = Heat Input Total Reported Value

Environmental Protection Agency

Page 319 of 907


-------
Draft Check Specifications

12/16/2015

== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not null)

HI Calculated Adjusted Value = [ FLOW Calculated Adjusted Value * (100 - Calculated Moisture for HI)

*	Calculated Diluent for HI ] / (10,000 * Current Hourly Op Record .FcFactor), and round the result to 1
decimal place.

else

return result A

= "F-17":

If ( Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FD Factor Exists
== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not null)

HI Calculated Adjusted Value = [ FLOW Calculated Adjusted Value * (1 / Current Hourly Op Record
.FdFactor)* [ 0.209 * (100 - Calculated Moisture for HI) - Calculated Diluent for HI ] / 20.9) ], and round
the result to 1 decimal place.

else

return result A

= "F-18":

If ( Current DHV Record Valid == true AND Calculated Diluent for HI is not null AND Valid FD Factor Exists
== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisture for HI is not null)

HI Calculated Adjusted Value = ( FLOW Calculated Adjusted Value *[100 - Calculated Moisture 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 (MP Stack Config for Hourly Checks == "MS")

Config Heatlnput Accumulator = Config Heatlnput Accumulator + HI Calculated Adjusted Value
if result A

Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period HI Calculated Accumulator Array for this location = -1
if (MP Stack Config for Hourly Checks == "MS")

Environmental Protection Agency

Page 320 of 907


-------
Draft Check Specifications

12/16/2015

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. OperatingTime 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 w here 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 Record. OperatingTime 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 for this location + Heat Input Total Calculated Value

Environmental Protection Agency

Page 321 of 907


-------
Draft Check Specifications

12/16/2015

Rpt Period HI Calculated Accumulator Array for this location = Heat Input Total Calculated Value

if ( Current Month is April)

if (April HI Calculated Accumulator Array for this location is not null)

April HI Calculated Accumulator Array for this location = April HI Calculated Accumulator Array for
this location + Heat Input Total Calculated Value

else

April HI Calculated Accumulator Array for this location = Heat Input Total Calculated Value

else

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 DHVRecord. AdjustedHourly Value is less than 1
AND Current DHV Record .MODCCode 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 DHV Record .AdjustedHourly 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 ) WW 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

Environmental Protection Agency	Page 322 of 907


-------
Draft Check Specifications

12/16/2015

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
A

B

C

Description

The AdjustedHourlyValue in the DHV record for [param] could not be
recalculated due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is
inconsistent with the recalculated value.

You reported in AdjustedHourly Value of less than 1 in the DHV record for
[param]. You must report a minimum heat input of 1 and a MODCCode of
"26".

Severity

Informational Message
Critical Error Level 1
Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 323 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-9

Check Name:

Related Former Checks:

Calculate S02 Mass Emissions

Applicability:
Specifications:

CEM Check

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Record. OperatingTime is between 0 and 1
(inclusive))

S02 Total Reported Value = Current DHVRecord . AdjustedHourly Value * Current Hourly Op Record. 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

Rpt Period S02 Mass Reported Accumulator Array for this location = -1

If ( SO 2 CEM Method Active for Hour == true)

if ( SO2 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)

SO 2 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)

SO 2 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 Reported Accumulator Array for this location = S02 Total Reported Value

else

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1

return result A

Environmental Protection Agency

Page 324 of 907


-------
Draft Check Specifications

12/16/2015

else if ( SO 2 F23 Method Active for Hour == true)

If ( Current DHVRecord 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 (SO2 App D Accumulator >= 0 AND Current Hourly Op Record. OperatingTime is between 0 and 1 (inclusive))
SO2 Calculated Adjusted Value = S02 App D Accumulator / Current Hourly Op Record .OperatingTime.
If (Hourly Fuel Flow Count For Gas is greater than 0)

Round SO2 Calculated Adjusted Value to four decimal places.

else

Round SO2 Calculated Adjusted Value to one decimal place.

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = -1

return result A

else

SO2 Calculated Adjusted Value = Current DHV Calculated Adjusted Value
If ( SO2 Calculated Adjusted Value is not null)

If ( Current Hourly Op Record. OperatingTime is between 0 and 1 inclusive)

S02 Total Calculated Value = S02 Calculated Adjusted Value * Current Hourly Op Record. OperatingTime

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

S02 Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Environmental Protection Agency

Page 325 of 907


-------
Draft Check Specifications

12/16/2015

Parameter = "S02" AND
UOM = "LBHR"

if (ABS( Current DHVRecord .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

Description

Severity

A

The AdjustedHourly Value in the DHV record for [param] could not be
recalculated due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is
inconsistent with the recalculated value.

Informational Message

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 326 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-12

Check Name:

Related Former Checks:

Determine Diluent Cap, Moisture, and NOXC for NOx Rate Calculation Verification

Applicability:
Specifications:

CEM Check

If ( Current NOx Rate Method Code == "CEM" AND Current DHVRecord .ModcCode in set \{01, 02, 03, 04, 14, 22, 53, 54\})

if (NOx Cone Monitor Hourly Count == 1 AND Current NOx Cone Monitor Hourly Record .UnadjustedHourly Value is
not null)

NOx Cone for NOx Rate Calculation = Current NOx Cone Monitor Hourly Record .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 H20
MHV 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)

Environmental Protection Agency

Page 327 of 907


-------
Draft Check Specifications

12/16/2015

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

C02 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

If (NOx Rate Equation Code in set \{F-5, 19-1, 19-4A} AND 02 Dry Checks Needed for NOx Rate Calc == true)

Calculated Diluent for NOx Rate = 02 Dry Calculated Adjusted Value
else if (NOx Rate Equation Code in set \{ 19-2, 19-3, 19-5\} AND 02 Wet Checks Needed for NOx Rate Calc ==

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 = C 02C MHV Calculated Adjusted Value

Calculated Diluent for NOx Rate = C02 Monitor Default Record .DefaultValue

else

true)

Results:

Result

Description

Severity

A

You reported more than one diluent cap default record for 02X in your	Critical Error Level 1

monitoring plan that was active during current hour.

B

You did not report a default record for 02X in your monitoring plan that was Critical Error Level 1
active during current hour.

C

The DefaultValue reported in the active Default record for 02X in your	Critical Error Level 1

monitoring plan is invalid. The value must be greater than 0.

D

You reported more than one diluent cap default record for C02N in your	Critical Error Level 1

Environmental Protection Agency

Page 328 of 907


-------
Draft Check Specifications

12/16/2015

E
F

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.

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 329 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-13

Check Name:

Related Former Checks:

Calculate Unadjusted NOx Emissions Rate

Applicability:
Specifications:

CEM Check

\ucl

\fs20 NOXR Calculated Unadjusted Value = null
Derived Hourly Unadjusted Calculation Status = false

If ( Current NOx Rate Method Code == "CEM" AND Current DHVRecord. ModcCode in set \{01, 02, 03, 14, 22 , 53 \})
If ( Current DHV Record. 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)

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

"19-2":

Moisture Fraction = null

BWA Default Record Count = count active Monitori no Default Data 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 FW Factor Exists == true AND Moisture Fraction is not null)

if ( Calculated Diluent for NOXR == 20.9)

return result A

else

return result B

Environmental Protection Agency

Page 330 of 907


-------
Draft Check Specifications

12/16/2015

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 .FwFactor * [20.9 / (20.9 *(1 - Moisture Fraction ) - Calculated Diluent for NOXR )], rounded to
3 decimal places.

else

return result B

"19-3":

If ( Current DHV Record Valid == true AND Calculated Diluent for NOXR is not null AND NOX Cone for NOx
Rate Calc is not null AND Valid FD Factor Exists == true AND Calculated Moisture for NOXR is not null)

if ( Calculated Diluent for NOXR == 20.9*(100 - Calculated Moisture for NOXR ) / 100 )

return result A

else

denom = (20.9*(100 - Calculated Moisture for NOXR )/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

Environmental Protection Agency

Page 331 of 907


-------
Draft Check Specifications

12/16/2015

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 .FdFactor * 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)

Environmental Protection Agency

Page 332 of 907


-------
Draft Check Specifications

12/16/2015

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 DHV Record .UnadjustedHourly Value - NOXR Calculated Unadjusted Value ) > Tolerance )
return result C

Environmental Protection Agency

Page 333 of 907


-------
Draft Check Specifications

12/16/2015

else

Derived Hourly Unadjusted Calculation Status = true

else if ( Current NOx Rate Method Code == "PEM" AND Current DHVRecord. ModcCode in set \{01, 02, 03\})
If ( Current DHV Record. SystemTypeCode == "NOXP")

RA TA Status Required = true
If Current DHV Record .UnadjustedHourly Value > = 0

NOXR Calculated Unadjusted Value = Current DHV Record UnadjustedHourly Value
Derived Hourly Unadjusted Calculation Status = true
else if ( Current NOx Rate Method Code == " AE")

If (App E Constant Fuel Mix == true)

NOXR Calculated Adjusted Value = App E Calculated NOx Rate for Source
else

NOXR Calculated Adjusted Value = Current DHV Calculated Adjusted Value

if ( Current NOx Rate Method Code in set \{CEM, PEM\} AND Current DHV Record. ModcCode == 21)

If ( Current DHV Record .SystemTypeCode in set \{NOX, NOXP\})

RA TA Status Required = true

Results:

Result
A

B
C
D

Usage:

1

Description

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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 334 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-15

Check Name:

Determine Moisture for NOx Mass Calculation Verification

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (NOx Mass Monitor Method Code begins with "CEM")

If (NOx Mass Equation Code == "F-26B")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for NOX = H20 DHV Calculated Adjusted Value

else if (H20 Method Code in set \{MMS, MTB\} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for NOX = H20 MHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND 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

Usage:
1

Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 335 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-16

Check Name:

Related Former Checks:

Calculate NOx Mass Emissions

Applicability:
Specifications:

CEM Check

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Record. OperatingTime is between 0 and 1
(inclusive))

NOX Mass Total Reported Value = Current DHV Record . AdjustedHourlyValue * 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 for this location >= 0)

Rpt Period NOX Mass Reported Accumulator Array for this location = Rpt Period NOX Mass Reported
Accumulator Array for this location + NOX Mass Total Reported Value

else

Rpt Period NOX Mass Reported Accumulator Array for this location = NOX Mass Total Reported Value
else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Reported Accumulator Array for this location = -1

If (NOx Mass Monitor Method Code in set \{CEM, NOXR, CEMNOXR\})

if (NOx Mass Equation Code == "F-26A")

If ( Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null)

NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * Stack Flow Calculated
Adjusted Value, ROUNDED to one decimal place.

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

else if (NOX Mass Equation Code == "F-26B")

If ( Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLOW Calculated
Adjusted Value is not null AND Calculated Moisture for NOX is not null)

NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * FLOW Calculated
Adjusted Value * (100.0 - Calculated Moisture for NOX) /100.0, ROUNDED to one decimal place.

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1

return result A

Environmental Protection Agency

Page 336 of 907


-------
Draft Check Specifications

12/16/2015

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1

return result A

else if (NOX Mass Equation Code == "F-24A")

if (Heat Input Method Code NOT in set \{CALC, ADCALC\})

If ( Current DHVRecord Valid == true AND NOXR Calculated Adjusted Value is not null

If (HI Calculated Adjusted Value is not null)

NOX Calculated Adjusted Value = NOXR Calculated Adjusted Value * HI Calculated Adjusted Value,
ROUNDED to one decimal place.

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A
else

NOX Calculated Adjusted Value = Current DHV Calculated Adjusted Value
If (NOX Calculated Adjusted Value is not null)

If ( Current Hourly Op Record. OperatingTime is between 0 and 1 inclusive)

NOx Mass Total Calculated Value = NOX Calculated Adjusted Value * Current Hourly Op Record. OperatingTime.

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 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 + NOX Mass Total Calculated Value

else

Rpt Period NOX Mass Calculated Accumulator Array for this location = NOX Mass Total Calculated Value
if ( Current Month is April)

Environmental Protection Agency

Page 337 of 907


-------
Draft Check Specifications

12/16/2015

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 + NOX Mass Total Calculated Value

else

April NOX Mass Calculated Accumulator Array for this location = NOX Mass Total Calculated Value

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
If (Derived Hourly Adjusted Value Status == true AND Current DHVMethod in set \{CEM, NOXR, CEMNOXR\})
NOX Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOX" AND
UOM = "LBHR"

if (ABS( Current DHV Record .AdjustedHourly Value - NOX Calculated Adjusted Value ) > NOX Tolerance )
If (Legacy Data Evaluation == false)
return result B

else if ( Current Hourly Op Data .OpTime is greater than 0 and less than or equal to 1)

if (ABS( Current DHV Record .AdjustedHourly Value - NOX Calculated Adjusted Value ) > NOX Tolerance
/ Current Hourly Op Record OperatingTime)

return result B

else if (NOX Mass Equation Code <> "F-24A" OR Current DHV Record Valid == false OR NOXR
Calculated Adjusted Value is null OR Heat Input Method Code NOT in set \{CALC, ADCALC\})

else

if ( Current Month is not April OR Annual Reporting Requirement == true)

Rpt Period NOX Mass Calculated Accumulator Array for this location = -1

Results:

Result

Description

Severity

Informational Message

A

The AdjustedHourly Value in the DHV record for [param] could not be
recalculated due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is
inconsistent with the recalculated value.

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 338 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-18

Check Name:

Determine Diluent Cap and Moisture for C02 Mass Calculation Verification

Related Former Checks:
Applicability:

CEM Check

Specifications:

If ( C02 Method Code == "CEM")

if ( CO 2 Mass Equation Code == "F-2")

If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)

Calculated Moisture for C02 = H20 DHV Calculated Adjusted Value

else if (H20 Method Code in set \{MMS, MTB\} AND H20 Monitor Hourly Checks Needed == true AND H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for C02 = H20 MHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND 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 ( C02N Count >1)

return result A
else if ( C02N Count == 0)

return result B
else if MonitoringDefault.DefaultValue <= 0
return result C

else

Calculated Diluent for C02 = MonitoringDefault.DefaultValue
else if ( CO2 Cone Derived Checks Needed == true)

Calculated Diluent for C02 = C02C DHV Calculated Adjusted Value
else if ( CO 2 Cone Checks Needed for C02 Mass == true)

if ( Current C02 Cone Missing Data Monitor Hourly Record is not null)

Environmental Protection Agency	Page 339 of 907


-------
Draft Check Specifications

12/16/2015

Calculated Diluent for C02 = C02C SD Calculated Adjusted Value

else

Calculated Diluent for C02 = C02C MHV Calculated Adjusted Value

Results:

Result
A

B

C

Usage:
1

Description

You reported more than one diluent cap default record for C02N in your
monitoring plan that was active during the current hour.

A DHV record indicates use of a diluent cap to calculate C02, but you did
not report an active C02N default record in your monitoring plan for the
hour. Please note that the use of the diluent cap to calculate C02 is only
applicable to legacy data.

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

Critical Error Level 1

Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 340 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-19

Check Name:

Related Former Checks:

Calculate C02 Mass Emissions

Applicability:
Specifications:

CEM Check

if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Record. OperatingTime is between 0 and 1
(inclusive))

C02 Total Reported Value = Current DHVRecord . AdjustedHourly Value * Current Hourly Op Record. 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

Rpt Period C02 Mass Reported Accumulator Array for this location = -1

If ( C02 Method Code == "CEM")

if ( CO2 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 Reported Accumulator Array for this location = C02 Total Reported Value

else

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = -1

return result A

Environmental Protection Agency

Page 341 of 907


-------
Draft Check Specifications

12/16/2015

else if ( CO 2 App D Method Active for Hour == true)

if ( CO 2 App D Accumulator >= 0 AND Current Hourly Op Record. OperatingTime 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

CO2 Calculated Adjusted Value = Current DHV Calculated Adjusted Value
If ( CO2 Calculated Adjusted Value is not null)

If ( Current Hourly Op Record. OperatingTime 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 (ABS( Current DHV Record .AdjustedHourly Value - 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

Environmental Protection Agency

Page 342 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

Usage:

1

Description	Severity

The AdjustedHourlyValue in the DHV record for [param] could not be	Informational Message

recalculated due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is	Critical Error Level 1

inconsistent with the recalculated value.

Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 343 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-25

Check Name:

Related Former Checks:

Determine BAF Value for NOx Emission Rate System

Applicability:
Specifications:

CEM Check

\ucl

\fs20 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 DHVRecord. ModcCode 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

Description

Severity

A

The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, Informational Message
because the prior RATA had critical errors or because of a RATA Status
error listed on this report.

Usage:
1

Emissions Data Evaluation Report

NOX RATA Status Evaluation

Environmental Protection Agency

Page 344 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-30

Check Name:

Initialize S02 Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "S02"

Current DHV Record Valid = SO 2 Derived Hourly Status

S02 Calculated Adjusted Value = null

Calculated Moisture for S02 = null

Current DHV Record = Current S02 Derived Hourly Record

Usage:
1

Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 345 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-31

Check Name:

Initialize NOX Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	NOx Mass Rate Calculation Verification

Environmental Protection Agency

Page 346 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-32

Check Name:

Initialize NOXR Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "NOXR"

Current DHV Record Valid = NOXR Derived Hourly Status

NOXR Calculated Adjusted Value = null

Calculated Diluent for NOXR = null

Calculated Moisture for NOXR = null

Current DHVHBHA Value = Current NOXR HBHA Value

Current DHV Record = Current NOx Rate Derived Hourly Record

Current Appendix E Status = null

RATA Status Required = false

RATA StatusBAF= 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 = Current D HVRecord. SystemDesignationCode
Set QaStatusSystemld = Current D HVRecord Systemld
Set QaStatusSystemldentifier = Current D HVRecord . Systemldentifier
Set QaStatusSystemTypeCode = Current D HVRecord .SystemTypeCode

Usage:
1

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 347 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-33

Check Name:

Initialize C02 Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "C02"

Current DHV Record 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

Usage:
1

Emissions Data Evaluation Report	C02 Mass Rate Calculation Verification

Environmental Protection Agency

Page 348 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-34

Check Name:

Initialize C02C Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "C02C"

Current DHV Record Valid = C02C Derived Hourly Status

C02C DHV Calculated Adjusted Value = null

Calculated Diluent for C02C = null

Calculated Moisture for C02C = null

Current DHVHBHA Value = Current C02C DHVHBHA Value
Current DHV Record = Current C02 Cone Derived Hourly Record

Usage:
1

Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Environmental Protection Agency

Page 349 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-35

Check Name:

Related Former Checks:

Initialize H20 Calculated Hourly Data

Applicability:
Specifications:

General Check

\ucl

\fs20 Current DHVParameter = "H20"

Current DHV Record 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 QaStatusComponentldentiJier = null

Set QaStatusComponentTypeCode = null

Set QaStatusSystemDesignationCode = Current D HVRecord. SystemDesignationCode
Set QaStatusSystemld = Current D HVRecord Systemld
Set QaStatusSystemldentifier = Current D HVRecord . Systemldentifier
Set QaStatusSystemTypeCode = Current D HVRecord .SystemTypeCode

if ( Current DHV Record .MODCCode in set \{01, 02, 03, 21 , 53 \} AND Current DHV Record .SystemTypeCode == "H20")
RA TA Status Required = true

Usage:
1

Emissions Data Evaluation Report	H20 Calculation Verification

Environmental Protection Agency

Page 350 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-36

Check Name:

Initialize HI Calculated Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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 = Current D HVRecord. SystemDesignationCode
Set QaStatusSystemldentifier = Current D HVRecord . Systemldentifier
Set QaStatusSystemTypeCode = Current D HVRecord .SystemTypeCode

Usage:
1

Emissions Data Evaluation Report	Heat Input Calculation Verification

Environmental Protection Agency

Page 351 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-37

Check Name:

Check Unadjusted Value

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Derived Hourly Unadjusted Value Status = false
If ( Current NOx Rate Method Code in set \{CEM, PEM\})

If ( Current DHVRecord. ModcCode in set \{01, 02, 03, 04, 14, 21, 22, 53, 54\})

If ( Current DHV Record .UnadjustedHourly Value is not null)

If ( Current DHV Record .UnadjustedHourly Value < 0.0 AND
Current DHV Record. ModcCode <> "21")
return result A

E lse if ( Current D HVRecord .UnadjustedHourlyValue > 0 AND
Current DHV Record. ModcCode ==21)
return result B

E lse if ( Current D HV Record .UnadjustedHourly Value is not rounded to three decimal places)
return result F

E lse

Derived Hourly Unadjusted Value Status = true

if ( Current DHV Max Min Value is not null AND (NOx Cone MODC is null OR is NOT in set \{ 19, 20\}))
if ( Current DHV Record .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
E lse if (Derived Hourly Mode Status == true)

If ( Current DHV Record .UnadjustedHourly Value is not null)
return result D

Else

Derived Hourly Unadjusted Value Status = true

E lse If ( Current DHV Record .UnadjustedHourly Value is not null)

Environmental Protection Agency

Page 352 of 907


-------
Draft Check Specifications

12/16/2015

return result E
Else

Derived Hourly Unadjusted Value Status = true

Results:

Result
A

B

C

D

E
F

Usage:
1

Description

The UnadjustedHourlyValue reported in the DHV record for [param] is
invalid. The value must be greater than or equal to 0.

You reported an MODCCode of 21 in the DHV record for [param], but the
UnadjustedHourly Value is greater than 0.

Warning: The 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 an MODCCode 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

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 353 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-38

Check Name:

Determine Maximum or Minimum Value for Parameter in DHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHV Max Mitt Value = null

If ( Current DHV Record Valid == true AND

(( Current DHV Parameter == "H20" AND H20 Method Code == "MWD") OR

( Current DHV Parameter == "NOXR" AND Current NOx Rate Method Code in set \{ CEM ,PEM\} ) OR
Current DHV Parameter == "C02C" OR
Current DHV Parameter == "HI")

If ( Current DHV Parameter == "H20")

If (H20 Fuel Specific Missing Data == true)

Current DHV Fuel Specific Hour = true
If (H20 Missing Data Approach == "MAX")

Current DHV Default Parameter = "H20X"

Else If (H20 Missing Data Approach == "MIN")

Current DHV Default Parameter = "H20N"

Else If ( Current DHV Record. ModcCode == 12)
return result A
else if ( Current DHV Parameter == "NOXR")

Current DHV Default Parameter = "NORX"

If ( Current DHV Record. ModcCode in set \{23, 24\})

If (NOx Rate Bypass Code == "BYMAXFS")

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

Environmental Protection Agency	Page 354 of 907

Current DHV Fuel Specific Hour = true

else


-------
Draft Check Specifications

12/16/2015

Current DHVDefault Parameter = "C02X"

If ( CO2 Fuel Specific Missing Data == true)

Current DHV Fuel Specific Hour = true
If ( Current DHV Parameter == "H I")

Locate all active UnitCapacity records linked to the location where MaxHourlyHeatlnputCapacity > 0.

If any are found,

Set Current DHV Max Min Value to the \ul sum\ulnone of MaxHourlyHeatlnputCapacity in all records found,
else i f ( 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 DHV Missing Data Fuel = Current Hourly Op Record .FuelCode
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 .DefaultValue > 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 .FuelCode
Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter

Environmental Protection Agency

Page 355 of 907


-------
Draft Check Specifications

12/16/2015

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 .DefaultValue > 0)

Current DHVMax Min Value = Default Record .DefaultValue

else

return result D

else

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 == "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 .DefaultValue > 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D
else if ( Current DHV Record. ModcCode <> "15"

Current DHV Missing Data Fuel = "NFS"

Environmental Protection Agency

Page 356 of 907


-------
Draft Check Specifications

12/16/2015

Count active MonitoringDefaultData record for location where
ParameterCode = Current DHVDefault Parameter
FuelCode = "NFS"

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set \{A,U\} // Not Controlled
if (count >1)

return result B

else if ( count == 0 AND Current DHV Parameter == "C02C")

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "C02" AND
MonitoringSpanData. SpanScaleCode = "H"

if (Monitor Span Record Count > 1)

return result E
else if (Monitor Span Record Count = 0)
return result F

else

Current Monitor Span Record = the single matched record

If ( Current Monitor Span Record .DefaultHighRange is null AND Current DHV Record. ModcCode not
in set \{ 13, 24\})

if ( Current Monitor Span Record .MPCValue > 0)

Current DHVMax Min Value = Current Monitor Span Record. MPCValue

else

return result G

else if ( count == 0 AND Current DHV Parameter == "NOXR")

Count active MonitoringDefaultData record for location where
ParameterCode = "MNNX"

FuelCode = "NFS"

DefaultPurposeCode = "MD" // Missing Data
OperatingCode in set \{A,U\} // Not Controlled
if ( count > 1)

Current DHV Default Parameter = " MNNX "
return result B
else if ( count = 0)

Environmental Protection Agency	Page 357 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B
C
D
E
F
G

Usage:

1

2

3

4

return result C

else

Current DHVDefault Parameter = " MNN X"

Default Record = the single matched record
if (Default Record .DefaultValue > = 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D
else if ( count == 0)

return result C

else

Default Record = the single matched record
if (Default Record .DefaultValue > 0)

Current DHV Max Min Value = Default Record .DefaultValue

else

return result D

Description

The missing data default parameter for H20 could not be determined,
because you used both Standard and Inverse Part 75 missing data approaches
during the hour.

You reported more than one applicable [param] Default record with a
FuelCode of [FuelCode] in your monitoring plan for the hour.

You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].

The values reported in the applicable [param] Default record with a FuelCode
of [FuelCode] are invalid.

You reported more than one active span record for [key] in your monitoring
plan for the hour.

You did not report a missing data maximum default for C02 in a span or
default record in your monitoring plan.

The values reported in the applicable span record for [key] are invalid.

Severity

Critical Error Level 2

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

Emissions Data Evaluation Report	C02 Concentration Calculation Verification

Emissions Data Evaluation Report	H20 Calculation Verification

Emissions Data Evaluation Report	Heat Input Calculation Verification

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Environmental Protection Agency

Page 358 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 359 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-39

Check Name:

Check Adjusted Hourly Value in DHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

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

Set Current DHV Precision to the Parameter Units of Measure .DecimalsHrly.
if ( Current DHV Record .ModcCode is not null)
case ( Current DHV Record. ModcCode )

= 21: Current DHV Calculated Adjusted Value = 0

if ( Current DHV Record .AdjustedHourly Value == 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 AdjustedHourly Value == Current DHV Max Min Value )

else

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 AdjustedHourly Value == Current DHV Max Min Value )

Derived Hourly Adjusted Value Status = true

Environmental Protection Agency

Page 360 of 907


-------
Draft Check Specifications

12/16/2015

else

return result C

= 06:

If ( Current DHVParameter in set \{C02C, H20\} AND ( Current DHVRecord .AdjustedHourlyValue is null or
Current DHV Record .AdjustedHourly Value < 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 DHV Record .AdjustedHourly Value >= 0)

if ( Current DHV Record AdjustedHourly Value == Current DHV Calculated Adjusted Value )

Derived Hourly Adjusted Value Status = true

else

return result D

else

return result E

else

If ( Current DHV Record .AdjustedHourly Value >= 0)

If ( Current DHV Record .AdjustedHourly Value is not rounded to Current DHV Precision )
return result M

else

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly 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 H20 Missing Data Approach == "MIN")
if ( Current DHV Record AdjustedHourly Value < Current DHV Max Min Value )
return result H

else

if ( Current DHV Record AdjustedHourly Value > Current DHV Max Min Value )

If ( Current DHV Parameter == "NOXR" and Current DHV Record
.AdjustedHourly Value > Current DHV Max Min Value * 2 )

return result O

Otherwise,

return result G

Environmental Protection Agency	Page 361 of 907


-------
Draft Check Specifications

12/16/2015

Else

return result E

= 08 OR 09:

If ( Current DHVParameter in set \{C02C, H20\} AND ( Current DHVRecord .AdjustedHourlyValue is null or
Current DHV Record .AdjustedHourly Value < 0 or Current DHV Record .AdjustedHourly Value > 100))

return result L

else if ( Current DHV Record .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 Record
. 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 == "M AX ") AND Current DHV HBHA Value > Current DHV Record
.AdjustedHourly Value AND ( Unit is Load Based == true or Current DHV Parameter <> "NOXR"))

Current DHV Calculated Adjusted Value = Current DHV HBHA Value

return result F

elseif ( Current DHV Record .AdjustedHourly Value is not rounded to Current DHV Precision )
return result M

else

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly 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 H20 Missing Data Approach == "MIN")
if ( Current DHV Record AdjustedHourly Value < Current DHV Max Min Value )
return result H

else

if ( Current DHV Record AdjustedHourly Value > Current DHV Max Min Value )

If ( Current DHV Parameter == "NOXR" and Current DHV Record
.AdjustedHourly Value > Current DHV Max Min Value * 2 )

return result O

Otherwise,

return result G

Else

Environmental Protection Agency

Page 362 of 907


-------
Draft Check Specifications

12/16/2015

return result E

= 04, 05, 07, 10, 11, 15, 53, 54, OR 55:

If ( Current DHVParameter in set \{C02C, H20\} AND ( Current DHVRecord .AdjustedHourlyValue is null or
Current DHV Record .AdjustedHourly Value < 0 or Current DHV Record .AdjustedHourly Value > 100))

return result L

else if ( Current DHV Record .AdjustedHourly Value >= 0)

If ( Current DHV Record .AdjustedHourly Value is not rounded to Current DHV Precision )
return result M

else

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly 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 H20 Missing Data Approach == "MIN")
if ( Current DHV Record AdjustedHourly Value < Current DHV Max Min Value )
return result H

else

if ( Current DHV Record AdjustedHourly Value > Current DHV Max Min Value )

If ( Current DHV Parameter == "NOXR" and Current DHV Record
.AdjustedHourly Value > Current DHV Max Min Value * 2 )

return result O

Otherwise,

return result G

Else

return result E

= 26: If ( Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value is null or
Current DHV Record .AdjustedHourly Value < 0 or Current DHV Record .AdjustedHourly Value > 100))

return result L

else if ( Current DHV Record .AdjustedHourly Value >= 0)

Environmental Protection Agency

Page 363 of 907


-------
Draft Check Specifications

12/16/2015

If ( Current DHVRecord. AdjustedHourly Value is not rounded to Current DHV Precision )
return result M

else

Derived Hourly Adjusted Value Status = true

If ( Current DHV Parameter in set \{C02C, H20\} AND Current DHV Max Min Value is not null)
If ( Current DHV Parameter == "H20" AND H20 Missing Data Approach == "MIN")
if ( Current DHV Record AdjustedHourly Value < Current DHV Max Min Value )
return result H

else

if ( Current DHV Record AdjustedHourly Value > Current DHV Max Min Value )
return result G

Else

return result E

else

If ( Current DHV Record .AdjustedHourly Value >= 0)

If ( Current DHV Record .AdjustedHourly 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 = Current DHV Record AdjustedHourly Value
If ( Current DHV Record .AdjustedHourly Value ==0.0)

If (Heat Input Method Code == "CEM")

If Legacy Data Evaluation = true

If ( Current Hourly Op Record .OpTime > 0.25 )
return result J

else

If ( Current Hourly Op Record .OpTime > 0)
return result K

else if ( Current DHV Max Min Value is not null and Current DHV Record .AdjustedHourly Value >
Current DHV Max Min Value )

return result G

Environmental Protection Agency

Page 364 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current DHVParameter == "NOXR")
if ( Current NOx Rate Method Code <> " AE")

Current DHV Calculated Adjusted Value = Current DHV Record .AdjustedHourlyValue
else if ( Current DHV Parameter == "S02")

if ( SO 2 App D Method Active for Hour == false)

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly Value
else if ( Current DHV Parameter == "C02")

if ( CO 2 App D Method Active for Hour == false)

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly Value

else

Current DHV Calculated Adjusted Value = Current DHV Record AdjustedHourly Value

else

return result E

Results:

Result
A

B

C

D

E
F

H

Description

You reported an MODCCode of 21 in the DHV record for [param], but the
AdjustedHourly Value does not equal 0.

You reported an MODCCode of [modcCode] in the DHV record for [param],
but the AdjustedHourly Value does not equal the maximum potential value
reported in the span or default record in your monitoring plan.

You reported an MODCCode of 13 or 24 in the DHV record for NOXR, but
the AdjustedHourly Value does not equal the maximum controlled emission
rate reported in the NORX default record in your monitoring plan.

You reported an MODCCode of 06 in the DHV record for [param], but the
AdjustedHourly Value does not equal average of measured hour before and
measured hour after.

The AdjustedHourly Value reported in the DHV record for [param] is invalid.
The value must be greater than or equal to 0.

You reported an MODCCode of [MODCCode] in the DHV record for
[param], but you reported an AdjustedHourly Value that is less than the
average of the measured hour before and measured hour after.

Warning: The AdjustedHourlyValue 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 AdjustedHourlyValue 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

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

Environmental Protection Agency

Page 365 of 907


-------
Draft Check Specifications

12/16/2015

I
J
K

L

M

N

O

Span Default values. You should investigate the cause of these low values
and determine whether adjustments to your monitoring systems or
monitoring plan are necessary.

You reported an MODCCode of 26 in the DHV record for [param], but the
AdjustedHourlyValue does not equal 1.

You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you
operated more than 0.25 hour.

You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you
had operating time during the hour. If you operated, you must report a heat
input rate of at least 1 mmBtu/hr.

The AdjustedHourly Value reported in the DHV record for [param] is invalid.
The value must be between 0 and 100.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

You reported an MODCCode of [MODCCode] in the DHV record for
[param], but you reported an AdjustedHourly Value that is greater than the
average of the measured hour before and measured hour after.

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.

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

Emissions Data Evaluation Report —

— C02 Concentration Calculation Verification

2

Emissions Data Evaluation Report —

— C02 Mass Rate Calculation Verification

3

Emissions Data Evaluation Report —

— H20 Calculation Verification

4

Emissions Data Evaluation Report —

— Heat Input Calculation Verification

5

Emissions Data Evaluation Report —

— NOx Emissions Rate Calculation Verification

6

Emissions Data Evaluation Report —

— NOx Mass Rate Calculation Verification

7

Emissions Data Evaluation Report —

— S02 Calculation Verification

Environmental Protection Agency

Page 366 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-40

Check Name:

Determine Moisture for S02 Mass Calculation Verification

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (SO2 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 H20
MHV Calculated Adjusted Value is not null)

Calculated Moisture for S02 = H20 MHV Calculated Adjusted Value

else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND 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

Usage:
1

Emissions Data Evaluation Report	S02 Calculation Verification

Environmental Protection Agency

Page 367 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURCV-41

Check Name:	Calculate Adjusted NOx Rate in DHV Record

Related Former Checks:

Applicability:	General Check

Specifications:

if (Derived Hourly Adjusted Value Status == true)

if (Rpt Period NOx Rate Reported Accumulator Array for this location is not null)

if (Rpt Period NOx Rate Reported Accumulator Array for this location >= 0)

Rpt Period NOx Rate Reported Accumulator Array for this location = Rpt Period NOx Rate Reported
Accumulator Array for this location + Current DHV Record. AdjustedHourly Value

else

Rpt Period NOx Rate Reported Accumulator Array for this 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 Count for
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 Config for 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
Environmental Protection Agency	Page 368 of 907


-------
Draft Check Specifications

12/16/2015

Calculated Adjusted Value * NOXR Calculated Adjusted Value )

else

Config NOxRateTimesHeatlnput Accumulator = -1

if ( Config NOxRateTimes OpTime Accumulator >= 0 AND Current Hourly Op Record. OperatingTime is between 0
and 1 (inclusive))

Config NOxRateTimes OpTime Accumulator = Config NOxRateTimes OpTime Accumulator + ( Current
Hourly Op Record. OperatingTime * NOXR Calculated Adjusted Value )

Config OpTime Accumulator = Config OpTime Accumulator + Current Hourly Op Record. OperatingTime

else

Config NOxRateTimes OpTime Accumulator = -1

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 + NOXR Calculated Adjusted Value

else

Rpt Period NOx Rate Calculated Accumulator Array for this location = NOXR Calculated Adjusted Value

Rpt Period NOx Rate Hours Accumulator Array for this location = Rpt Period NOx Rate Hours Accumulator Array for
this location + 1

if (Derived Hourly Adjusted Value Status == true AND Derived Hourly Unadjusted Calculation Status == true)

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

if ABS( NOXR Calculated Adjusted Value - Current DHVRecord .AdjustedHourly Value) > Tolerance
return result B

else if Current NOx Rate Method Code <> " AE" OR Hourly Fuel Flow Count for Gas + Hourly Fuel Flow
Count for Oil > 0)

>0)

Apportionment Calc NOXR Array at this Location = -1

Rpt Period NOx Rate Calculated Accumulator Array for this location = -1

if (MP Stack Config for Hourly Checks == "MS")

Config NOxRateTimesHeatlnput Accumulator = -1

if (RATA Status Required == true AND Current NOX System BAF is null AND NOXR Calculated Unadjusted Value is
not null)

return result A

Results:

Environmental Protection Agency

Page 369 of 907


-------
Draft Check Specifications

12/16/2015

Result
A

B

Usage:

1

2

Description	Severity

The AdjustedHourlyValue in the DHV record for [param] could not be	Informational Message

recalculated due to errors listed above.

The AdjustedHourly Value reported in the DHV record for [param] is	Critical Error Level 1

inconsistent with the recalculated value.

Emissions Data Evaluation Report	NOx Emissions Rate Calculation Verification

Condition: RATA Status Required Equals false

Emissions Data Evaluation Report	NOX RATA Status Evaluation

Environmental Protection Agency

Page 370 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-42

Check Name:

Check HI System in DHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 If Current DHV Parameter == "HI" AND Heat Input Method Code in set \{CEM, AMS\} )

If ( Current DHV Record .MonitoringSystemID is null

If (Heat Input Method Code == "CEM" AND

( CO 2 Cone Checks Needed for Heat Input == true AND Current C02 Cone Monitor Hourly Record is not
null AND Current C02 Cone Monitor Hourly Record. ModcCode in set \{01, 02, 03, 04, 17, 20 , 21 \}) OR

( 02 Wet Checks 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\}))

return result A

else

If (Heat Input Method Code == "CEM" AND

(( CO 2 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,

HI DHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHV Record .MonitoringSystemID

if (HI DHV Mon Sys Record is null)
return result C

else if (HI DHV Mon Sys Record. SystemTypeCode not in set \{C02, 02\})
return result D

else

54\})))

If ( Current DHV Record Valid == true)

return result B

else

Environmental Protection Agency

Page 371 of 907


-------
Draft Check Specifications

12/16/2015

if ( CO2 RATA Required == true)
RA TA Status Required = true

Results:

Result
A

B
C
D

Usage:

1

Description

You did not report MonitoringSystemID in the DHV record for HI. While
this was acceptable for legacy data, this field is required when you report
measured data.

You reported a MonitoringSystemID in the DHV record for [param]. This
field should be blank when missing data substitution is used.

You reported MonitoringSystemID [ID] in the DHV record for [param], but
according to your monitoring plan this system was not active during the hour.

You reported MonitoringSystemID [ID] in the DHV record for HI, but this
system is not a C02 or 02 monitoring system.

Emissions Data Evaluation Report	Heat Input Calculation Verification

Severity

Critical Error Level 1

Non-Critical Error

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 372 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURCV-43

Check Name:

Determine DHV Measure Code

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Set Current Measure Code to null.

If ( Current DHV Parameter in set \{C02C, H20\})

If ( Current DHV Record. ModcCode in set \{01, 02, 03, 04, 21, 53, 54\})

Set Monitor Measure Code Array for the Current DHV Parameter to "MEASURE"

if ( Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F- 14B " AND Monitor Measure
Code Array for "H20" == "SUB")

Set Monitor Measure Code Array for "C02C" to "MEASSUB".

else if ( Current DHV Record. ModcCode in set \{06, 07, 08, 09, 10, 12, 55\})

Set Monitor Measure Code Array for the Current DHV Parameter to "SUB"

if ( Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F- 14B " AND Monitor Measure
Code Array for "H20" == "MEASURE")

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 in set \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9\} AND Monitor Measure Code Array
for "H20" == "SUB")

set Current Measure Code to "MEASSUB".

else if ( Current DHV Record. ModcCode in set\{06, 07, 08, 09, 10, 11, 12, 13, 15, 23, 24, 25, 55\})

Set Current Measure Code to "SUB"

if (NOx Rate Equation Code in set \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9\} AND Monitor Measure Code Array
for "H20" == "MEASURE")

set Current Measure Code to "MEASSUB".
else if ( Current NOx Rate Method Code == " AE")

Set Current Measure Code to the Monitor Measure Code Array for "NOXR".

Set NOXR Measure Code to the Current Measure Code .
else if ( Current DHV Parameter == "HI")

If (Heat Input Method Code == "CEM")

Environmental Protection Agency	Page 373 of 907


-------
Draft Check Specifications

12/16/2015

if (Heat Input Equation Code in set \{F-15, F-16\})

If (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")

set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "SUB")

set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both not null)

set Current Measure Code to "ME AS SUB".

else if (Heat Input Equation Code in set \{F-18\})

If (Monitor Measure Code Array for "02D" and "FLOW" are both equal to "MEASURE")

set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "02D" and "FLOW" are both equal to "SUB")

set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "02D" and "FLOW" are both not null)

set Current Measure Code to "ME AS SUB".

else if (Heat Input Equation Code in set \{F-17\})

If (Monitor Measure Code Array for "02W" and "FLOW" are both equal to "MEASURE")

set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "02W" and "FLOW" are both equal to "SUB")

set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "02W" and "FLOW" are both not null)

set Current Measure Code to "ME AS SUB".

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 "ME AS SUB".

else if (Heat Input App D Method Active for Hour == true)

If (Monitor Measure Code Array for "FF" in set \{0THER, 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)

Environmental Protection Agency	Page 374 of 907


-------
Draft Check Specifications

12/16/2015

set Current Measure Code to "ME AS SUB".

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 "ME AS SUB".

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 "ME AS SUB".

if ( SO 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 "ME AS SUB".

else if ( SO 2 F23 Method Active for Hour == true)

set Current Measure Code to HI Measure Code.

else if ( SO 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 "ME AS SUB".

else if ( Current DHV Parameter == "C02")

If( C()2 Method Code == "CEM")

If (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")

Environmental Protection Agency

Page 375 of 907


-------
Draft Check Specifications

12/16/2015

set Current Measure Code to "MEASURE".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "SUB")

set Current Measure Code to "SUB".

else if (Monitor Measure Code Array for "C02C" and "FLOW" are both not null)

set Current Measure Code to "ME AS SUB".

if (C 02 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 "ME AS SUB".

else if (C 02 App D Method Active for Hour == true)

set Current Measure Code to HI Measure Code.

else if ( Current DHVParameter == "NOX")

if (NOx Mass Equation Code == "F-2 4 A")

If (HI Measure Code and NOXR Measure Code are both equal to "MEASURE")

set Current Measure Code to "MEASURE".

else if (HI Measure 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-2 6 A , 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 "ME AS SUB".

if (NOx Mass Equation Code == "F-2 6B " 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 "ME AS SUB",
else if ( Current DHV Parameter in set \{S02M, NOXM, C02M, HIT\}

Set Current Measure Code to "LME".

TT«aap*

Environmental Protection Agency

Page 376 of 907


-------
Draft Check Specifications

12/16/2015

Usage:



1

Emissions Data Evaluation Report

2

Emissions Data Evaluation Report

3

Emissions Data Evaluation Report

4

Emissions Data Evaluation Report

5

Emissions Data Evaluation Report

6

Emissions Data Evaluation Report

7

Emissions Data Evaluation Report

8

Emissions Data Evaluation Report

9

Emissions Data Evaluation Report

10

Emissions Data Evaluation Report

11

Emissions Data Evaluation Report

C02 Concentration Calculation Verification
C02 Mass Rate Calculation Verification
C02M Derived Hourly Evaluation (LME)
H20 Calculation Verification
Heat Input Calculation Verification
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Calculation Verification
NOx Mass Rate Calculation Verification
NOXM Derived Hourly Evaluation (LME)
S02 Calculation Verification
S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 377 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-1

Check Name:

Initialize S02 Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "S02"

SO 2 Derived Hourly Status = true

Current DHV Record = Current S02 Derived Hourly Record
Current DHV Method = S02 Method Code
Current DHV System Type = null

Usage:
1

Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Environmental Protection Agency

Page 378 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-2

Check Name:

Initialize NOX Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 379 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-3

Check Name:

Initialize NOXR Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "NOXR"

NOXR Derived Hourly Status = true
Current DHV System Type = null

Current DHV Record = Current NOx Rate Derived Hourly Record
Current DHV Method = Current NOx Rate Method Code

NOx Emission Rate MODC = Current NOx Rate Derived Hourly Record. ModcCode
if ( Current DHV Method == "CEM")

Current DHV System Type = "NOX"
else if ( Current DHV Method == "PEM")

Current DHV System Type = "NOXP"
if ( Current DHV Method == "AE")

Current DHV System Type = "NOXE"

Usage:

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 380 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-4

Check Name:

Initialize C02 Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 381 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-5

Check Name:

Initialize C02C Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHVParameter = "C02C"

C02C Derived Hourly Status = true

Current DHV Record = Current C02 Cone Derived Hourly Record
Current DHV System Type = 'C02'

Current DHV Method = "CEM"

Usage:
1

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Environmental Protection Agency

Page 382 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-6

Check Name:

Initialize H20 Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Environmental Protection Agency

Page 383 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-7

Check Name:

Initialize HI Derived Hourly Data

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Environmental Protection Agency

Page 384 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-8

Check Name:

Initialize S02R Derived Hourly Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHVParameter = "S02R"

S02R Derived Hourly Status = true
Current DHV System Type = null

Current DHV Record = Current S02R Derived Hourly Record
Current DHV Method = null

Usage:
1

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 385 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-9

Check Name:

Initialize S02M Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 Current DHVParameter = "S02M"

S02M Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current S02 Derived Hourly Record

Usage:
1

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 386 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-10

Check Name:

Initialize NOXM Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 Current DHVParameter = "NOXM"

NOXM Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current NOx Mass Derived Hourly Record

Usage:
1

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 387 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-11

Check Name:

Initialize C02M Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 Current DHVParameter = "C02M"

C02M Derived Hourly Status = true
Current DHV System Type = null
Current DHV Method = "LME"

Current DHV Record = Current C02 Mass Derived Hourly Record

Usage:
1

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 388 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-12

Check Name:

Initialize HIT Derived Hourly Data

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 Current DHVParameter = "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

Usage:
1

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 389 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-13

Check Name:	Check MODC in DHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 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: If ( Current DHV Method == "AMS")

If ( Current DHV Record. ModcCode is not null and is not in set \{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12,
13, 15, 21, 23, 24, 53, 54, 55\})

return result A

Else

Derived Hourly Mode Status = true

else

If ( Current DHV Record. ModcCode is not null)
return result B

Else

Derived Hourly Mode Status = true
NOXR: If ( Current DHV Method == "AMS" AND Current DHV Record. ModcCode is null)

Derived Hourly Mode Status = true
else if ( Current DHV Method == " AE")

If ( Current DHV Record. ModcCode is not null)

Environmental Protection Agency	Page 390 of 907


-------
Draft Check Specifications

12/16/2015

return result C

Else

Derived Hourly Mode Status = true

else

if ( Current DHVRecord. ModcCode not in set \{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 21, 22,
23, 24, 25, 53, 54, 55\})

return result A

Else

Derived Hourly Mode Status = true
C02C: If ( Current DHV Record. ModcCode not in set \{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55\})
return result A

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 DHV Record. ModcCode is not null)
return result B

Else

Derived Hourly Mode Status = true

HI: If ( Current DHV Method == "AMS")

If ( Current DHV Record. ModcCode is not null and is not in set \{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 26,
53, 54, 55\})

return result A

Else

Derived Hourly Mode Status = true

else

If ( Current DHV Record. ModcCode is not null and Current DHV Record. ModcCode <> "26")
return result B

Else

Environmental Protection Agency	Page 391 of 907


-------
Draft Check Specifications

12/16/2015

Derived Hourly Mode Status = true
H20: H20 DHVMODC = Current DHVRecord. ModcCode
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 ( Current DHV Record. ModcCode 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

Results:

Environmental Protection Agency

Page 392 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result

A

B

C
D

Usage:

1

2

3

4

5

6

7

8

9

10

11

12

Description

The MODCCode reported in the DHV record for [param] is invalid.

You reported an MODCCode in the DHV record for [param]. This field
should be blank.

You reported an MODCCode in the DHV record for NOXR. This field
should be blank when you use the Appendix E method to determine the NOx
emission rate.

You reported an MODCCode of 45 in the DHV record for HIT, but you have
not reported a SubstituteDataCode of MHHI in the active heat input method
record in your monitoring plan.

Severity

Critical Error Level 1
Non-Critical Error

Critical Error Level 1
Critical Error Level 1

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 393 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-14

Check Name:	Check Percent Monitor Availability in DHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Derived Hourly Pma Status = false
Derived Hourly Missing Data Status = true
If (Derived Hourly Mode Status == true)

If ( Current DHV Record .Percent Available is NULL)

if ( Current DHV Parameter not in set \{H20, C02C, NOXR\})

Derived Hourly Pma Status = true
else if ( Current DHV Parameter == "NOXR" and Current DHV Method not in set \{PEM, CEM\})

Derived Hourly Pma Status = true
else if ( Current DHV Parameter == "H20" and Current DHV Record. ModcCode == "40")

Derived Hourly Pma Status = true

else

if ( Current DHV Record. ModcCode not in set \{01, 02, 03, 04, 14, 21, 22, 53, 54\} AND Legacy Data
Evaluation == true)

Derived Hourly Pma Status = true

return result A

else

return result B

else

if ( Current DHV Parameter == "NOXR" and Current DHV Method == " AE")
return result C

else if ( Current DHV Parameter == "H20" and Current DHV Record. ModcCode == "40")
return result C

else if ( Current DHV Parameter not in set \{H20, C02C, NOXR\} AND Current DHV Method <> "AMS")
return result C

else if ( Current DHV Record. Percent Available> 100.0 OR
Current DHV Record .Percent Available < 0.0)
return result D

Environmental Protection Agency

Page 394 of 907


-------
Draft Check Specifications

12/16/2015

Else

case ( Current DHVRecord. ModcCode )

= 06: If Current DHVRecord .PercentAvailable >= 90.0
Derived Hourly Pma Status = true

Else

return result E
= 08: If Current DHV Record .Percent Available >=95.0
Derived Hourly Pma Status = true

Else

return result E

= 09: If Current DHV Record .Percent Available >= 90.0 AND Current DHV Record .Percent Available < 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
Derived Hourly Pma Status = true
Else If Current DHV Parameter == "NOXR" and Current DHV Record .Percent Available >= 9 0.0
Derived Hourly Pma Status = true
return result F

Else

return result E
= 11: If Current DHV Record .Percent Available >=90.0
Derived Hourly Pma Status = true

Else

return result E
All other MODC Codes:

Derived Hourly Pma Status = true

Results:

Result	Description

A	You reported an MODCCode of [ModcCode] in the DHV record for [param],

but you did not report a value for PercentAvailable. While this is not
required for legacy EDR data, it is required in all [param] DHV records for
ECMPS.

B	You did not report PercentAvailable in the DHV record for [param].

Severity

Informational Message
Critical Error Level 1

Environmental Protection Agency

Page 395 of 907


-------
Draft Check Specifications

12/16/2015

C
D

E
F

Usage:

1

2

3

4

5

6

7

8

9

10

11

12

You reported Percent Available 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
Percent Availability 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).)

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Informational Message

Environmental Protection Agency

Page 396 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-15

Check Name:	Check Prior QA'd Hours for MODC 07

Related Former Checks:

Applicability:	CEM Check

Specifications:

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
if ( Current DHVRecord .ModcCode == 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 DerivedHourlyValueData records where
DerivedHourlyValueData.ModcCode in set MODC Set AND

DerivedHourlyValueData.ParameterCode = Current DHV Record .ParameterCode AND
(DerivedHourlyValueData.BeginDate < Current Date OR

(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.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
A

Usage:

1

2

3

Description

You reported an MODCCode of 07 in the DHV record for [param], but too
many prior quality assured hours exist in evaluation period for use of this
missing data approach.

Severity

Critical Error Level 1

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 397 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 398 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-16

Check Name:

Check for Correct Use of Missing Data MODCs

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHVHBHA Value = null

if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
case ( Current D HV Parameter )

NOXR: MODC Set = \{01, 02, 03, 04, 14, 21, 22, 53, 54\}

C02C: MODC Set = \{01, 02, 03, 04, 21, 53, 54\}

H20: MODC Set = \{01, 02, 03, 04, 21, 53, 54\}
if ( Current DHVRecord .ModcCode in set \{06, 08, 09\})

If ( Current MHVParameter in set \{C02C, H20\})

Prior Record = latest DerivedHourlyValueData record or MonitorHourlyValueData 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 DerivedHourlyValueData record or MonitorHourlyValueData 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 Prior Record .AdjustedHourly Value >= 0 AND Next Record .AdjustedHourly Value >= 0

Current DHV HBHA Value = (Prior Record .AdjustedHourly Value + Next Record
.AdjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Derived Hourly Missing Data Status = false
return result A

else

Environmental Protection Agency

Page 399 of 907


-------
Draft Check Specifications

12/16/2015

Prior DHVRecord = latest DerivedHourlyValueData record where

DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
DerivedHourValueData.ModcCode in set MODC Set AND
[DerivedHourlyValueData.Date < Current Date OR

(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour < Current Hour)]
If Prior DHV Record is not null and is in current reporting period

Next DHV Record = earliest DerivedHourlyValueData record where

DerivedHourlyValueData.ParameterCode = Current MHVParameter AND
DerivedHourValueData.ModcCode in set MODC Set AND
[DerivedHourlyValueData.Date > Current Date OR

(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour > Current Hour)]

If Next DHV Record is not null and is in current reporting period

If Prior DHV Record. AdjustedHourly Value >= 0 AND Next DHV Record. AdjustedHourly Value >= 0

Current DHV HBHA Value = (Prior DHV Record .AdjustedHourly Value + Next DHV Record
.AdjustedHourlyValue) / 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 = DerivedHourlyValueData record at latest time for the location where
DerivedHourlyValueData.ModcCode in set MODC Set AND
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate < Current Date OR

(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour < Current Hour

))

If Prior Measured DHV Record is not null and is in the current reporting period

PriorDate = Prior Measured DHV Record .BeginDate
PriorHour = Prior Measured DHV Record .BeginHour

else

PriorDate = the day prior to the beginning of the current reporting period

PriorHour = 23

Next Measured DHV Record = DerivedHourlyValueData record at earliest time for the location where
DerivedHourlyValueData.ModcCode in set MODC Set AND

Environmental Protection Agency

Page 400 of 907


-------
Draft Check Specifications

12/16/2015

DerivedHourlyValueData.ParameterCode = Current DHVParameter AND
(DerivedHourlyValueData.BeginDate > Current Date OR

(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour > Current Hour

))

If Next Measured DHV Record is not null and is in the current reporting period

NextDate = Next Measured DHV Record .BeginDate
NextHour = Next Measured DHV Record .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
(DerivedHourlyValueData.BeginDate > PriorDate OR

(DerivedHourlyValueData.BeginDate = PriorDate AND DerivedHourlyValueData.BeginHour > PriorHour))
AND

(DerivedHourlyValueData.BeginDate < NextDate OR

(DerivedHourlyValueData.BeginDate = NextDate AND DerivedHourlyValueData.BeginHour < NextHour))
if ( Current DHV Record. PercentAvailable 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
A

B

Usage:

1

2

Description	Severity

The AdjustedHourlyValue reported in the DHV record for [param] either	Critical Error Level 1

before or after the current hour is invalid.

You reported an MODCCode of 11 in the DHV record for [param], but the Critical Error Level 1
length of the missing data period exceeds the allowable value for use of this
missing data procedure.

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Environmental Protection Agency

Page 401 of 907


-------
Draft Check Specifications 12/16/2015
3	Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 402 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-17

Check Name:	Check Extraneous Data in DHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Derived Hourly Null Status = false
Hourly Extraneous Fields = null

if ( Current DHV Record .UnadjustedHourly Value is not null)

append "UnadjustedHourlyValue" to Hourly Extraneous Fields
if ( Current DHV Record. SegmentNumber is not null)
append "SegmentNumber" to Hourly Extraneous Fields
if ( Current DHV Record .OperatingConditionCode is not null)
if ( Current DHV Parameter is not equal to "NOXM")

append "OperatingConditionCode" to Hourly Extraneous Fields
if ( Current DHV Record .FuelCode 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

Usage:

1

2

3

4

5

6

7

Description

You reported [fieldnames] in the DHV record for [param]. This data should
be blank.

Severity

Non-Critical Error

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 403 of 907


-------
Draft Check Specifications

12/16/2015

8	Emissions Data Evaluation Report

9	Emissions Data Evaluation Report

10	Emissions Data Evaluation Report

11	Emissions Data Evaluation Report

NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 404 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-18

Check Name:

Check System in DHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current DHV Mon .S'y.s Record = null
Derived Hourly System Status = false
if ( Current DHV Parameter == "NOXR")

App E Constant Fuel Mix = false

If (( Current DHV Parameter in set \{ S02, S02R, NOX, C02\} AND Current DHV Method <> " AMS") OR
( Current DHV Parameter == "HI" AND Current DHV Method in set \{CALC, AD, ADCALC\}) OR
( Current DHV Parameter == "H20" AND Current DHV Method == "MDF") OR
LME HI Method is not null)
if Current DHV Record .MonitoringSystemID is NOT null
return result A

else

Derived Hourly System Status = true
else if ( Current DHV Parameter <> "HI")
case ( Current DHV Parameter )

NOXR: MODC &/ = \{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 .MonitoringSystemID is null)

If ( Current DHV Method == "AMS")

Derived Hourly System Status = true
Else If ( Current DHV Method == "AE")

If Current DHV Record .OperatingConditionCode is null

Derived Hourly System Status = true

else

return result J

Else If ( Current DHV Record. ModcCode in set MODC Set)

return result C

Environmental Protection Agency

Page 405 of 907


-------
Draft Check Specifications

12/16/2015

else

Derived Hourly System Status = true

else

If (Derived Hourly MODC Status == true AND Current DHVMethod in set \{CEM, PEM, MWD\} AND Current
DHV Record. ModcCode not in set \{05, 53, 54\} AND Current DHV Record. ModcCode not in set MODC Set)

return result B

else

Current DHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHV Record .MonitoringSystemID
if ( Current DHV Mon Sys Record is null)
return result D

else if (Derived MHVMon Sys Record . SystemTypeCode <> Current DHV System Type )
return result E

else if ( Current DHV Method == " AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for
Oil > 0 )

If (Derived DHV Mon Sys Record .FuelCode == "MIX" OR Current DHV Record. OperatingConditionCode
is not null)

if ( Current DHV Record. OperatingConditionCode == "E")
return result F

else

App E Constant Fuel Mix = true

App E Reporting Method = "CONSTANT"

App E Reported Value = Current DHV Record. AdjustedHourly Value
App E Segment Number = Current DHV Record. SegmentNumber
App E Fuel Code = "MIX"

App E NOXE System ID = Current DHV Record MonitoringSystemID
App E NOXE System Identifier = Current DHV Record . Systemldentifier
Derived Hourly System Status = true

if ( Current DHV Record. OperatingConditionCode in set \{X, Y, Z, U, W, N, M\})

App E Op Code = Current DHV Record. OperatingConditionCode
if (Derived DHV Mon Sys Record .FuelCode <> "MIX")
return result G

else

return result H

Environmental Protection Agency	Page 406 of 907


-------
Draft Check Specifications

12/16/2015

else

return result I

else

Derived Hourly System Status = true
else

Derived Hourly System Status = true

Results:

Result
A

B

C

D

E
F

H
I

Description

You reported [fieldnames] in the DHV record for [param]. This data should
be blank.

You reported a MonitoringSystemID in the DHV record for [param]. This
field should be blank when missing data substitution is used.

You did not report a MonitoringSystemID in the DHV record for [param].
This information is required when you report measured data.

You reported MonitoringSystemID [ID] in the DHV record for [param], but
according to your monitoring plan this system was not active during the hour.

You reported MonitoringSystemID [ID] in the DHV record for [param], but
the SystemTypeCode of this system is not appropriate.

You reported an OperatingConditionCode of E in the DHV record for
NOXR. You should report the NOx emission rate for emergency fuels in an
HPFF record, not a DHV record.

You reported an OperatingConditionCode in the DHV record for NOXR,
which indicates that you are determining NOx emission rate from a mixed
fuel Appendix E curve, but the FuelCode of NOXE MonitoringSystemID [ID]
is not equal to "MIX". If a NOXE system measures an individual fuel, the
emissions from this system should be reported in an HPFF record, not a DHV
record.

The OperatingConditionCode reported in the DHV record for NOXR is
missing or invalid.

You reported NOXE MonitoringSystemID [ID] in the DHV record for
NOXR, but the FuelCode of this system is not equal to "MIX". If a NOXE
system measures an individual fuel, the emissions from this system should be
reported in an HPFF record. If this data represents unit-level emissions based
on fuel-specific emissions data that have been reported in one or more HPFF
records, then the MonitoringSystemID should be blank.

You reported an OperatingConditionCode in the DHV record for NOXR,
which indicates that you are determining NOx emission rate using Appendix
E, but you did not report a MonitoringSystemID in this record. If you
determined the NOx emission rate from a mixed fuel curve or via heat input
apportionment, you should report the MonitoringSystemID of the NOXE
system for the curve. If you determined the NOx emission rate from one or
more individual fuel curves, you should not report an
OperatingConditionCode in the NOXR DHV record.

Severity

Non-Critical Error
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

2	Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

3	Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 407 of 907


-------
Draft Check Specifications

12/16/2015

4

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

5

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

6

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

7

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

8

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

9

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

10

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

11

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

12

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 408 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-19

Check Name:	Check System Designation Code for System in DHV Record

Related Former Checks:

Applicability:	CEM Check

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\})

\tab\tab 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 <> \ldblquote RM")
return result C

22: If ( Current DHV Mon Sys Record. SystemDesignationCode <> \ldblquote CI")
return result D

Results:

Result
A

B

C

D

Usage:

1

2

3

Description

You reported an MODCCode of [modcCode] in the DHV record for [param],
but MonitoringSystemID [ID] is not a primary system.

You reported an MODCCode of [modcCode] in the DHV record for [param],
but MonitoringSystemID [ID] is not a backup system.

You reported an MODCCode of [modcCode] in the DHV record for [param],
but MonitoringSystemID [ID] is not a reference method system.

You reported an MODCCode of 22 in the DHV record for NOXR, but
MonitoringSystemID [ID] is not a certified inlet system.

Severity

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

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 409 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-24

Check Name:

Check Formula in DHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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 .FormulalDKey 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-4A"
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

Environmental Protection Agency

Page 410 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current DHVMethod = "PEM")

Derived Hourly Formula Status = true

else if ( Current DHV Parameter == "NOX" AND Current NOx Rate Method Code == " AE" AND Hourly Fuel Flow
Count for Gas + Hourly Fuel Flow Count for 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 DHV Parameter in set \{S02R, H20\} AND Current DHV Record. MODCCode == "40")

return result D
else if (LME HI Method is not null)
return result J

else

Current DHV Formula Record = Find MonitoringFormulaData record where

MonitoringFormulaData,MonitoringFormulaIDKey = Current DHV Record .FormulalDKey
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 Count for Oil > 1 AND Current DHV Formula Record ParameterCode == "HIT" AND
Current DHV Formula Record .EquationCode == "D-15" AND Legacy Data Evaluation == true)

return result I

else

return result F

else

Derived Hourly Formula Status = true

i f Current DHV Parameter == "HI" AND Current DHV Method = "AD CALC " and Current DHV Formula
Record .EquationCode not in \{F-21A,F-21B,F-21D\}

Environmental Protection Agency

Page 411 of 907


-------
Draft Check Specifications

12/16/2015

Count all active MonitoringFormulaData record for location where

EquationCode in \{F-21A,F-21B,F-21D\}
if (Count =1)

Current DHV Formula Record = Find active MonitoringFormulaData record for location where
EquationCode in \{F-21A,F-21B,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. MODCCode NOT
in set \{01, 02, 03, 04, 05, 14, 21, 22, 53, 54\} AND Legacy Data Evaluation == false)

return result G

Results:

Result
A

B

C
D

E
F
G
H

Usage:

1

2

3

Description

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

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 412 of 907


-------
Draft Check Specifications

12/16/2015

4

Emissions Data Evaluation Report —

— H20 Derived Hourly Evaluation

5

Emissions Data Evaluation Report —

— Heat Input Derived Hourly Evaluation

6

Emissions Data Evaluation Report —

— HIT Derived Hourly Evaluation (LME)

7

Emissions Data Evaluation Report —

— NOx Emissions Rate Derived Hourly Evaluation

8

Emissions Data Evaluation Report —

— NOx Mass Rate Derived Hourly Evaluation

9

Emissions Data Evaluation Report —

— NOXM Derived Hourly Evaluation (LME)

10

Emissions Data Evaluation Report —

— S02 Derived Hourly Evaluation

11

Emissions Data Evaluation Report —

— S02M Derived Hourly Evaluation (LME)

12

Emissions Data Evaluation Report —

— S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 413 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-25

Check Name:

Check Heat Input Equation Code

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 C02 Cone Checks Needed for Heat Input = false
02 Wet Checks Needed for Heat Input = false
02 Dry Checks Needed for Heat Input = false
if (Heat Input App D Method Active For Hour == true)

Hourly Fuel Flow Checks needed for Heat Input = true
else

Hourly Fuel Flow Checks needed for Heat Input = false
Heat Input Equation Code = null
if (Derived Hourly Formula Status == true)
if ( Current DHV Formula Record is not null)

Heat Input Equation Code = Current DHV Formula 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 Code <> "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")

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

Environmental Protection Agency

Page 414 of 907


-------
Draft Check Specifications

12/16/2015

else if (Heat Input Equation Code is null)
return result A

else

return result B

else if (Heat Input App D Method 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 for the location = "NOCALC"

else if (Heat Input Equation Code in set \{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 ( Current DHVMethod 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-2 ID" 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

Environmental Protection Agency

Page 415 of 907


-------
Draft Check Specifications

12/16/2015

else

Derived Hourly Equation Status = true

else

Derived Hourly Equation Status = true

Results:

Result
A

B

C

Usage:
1

Description

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.

Emissions Data Evaluation Report	Heat Input Derived Hourly Evaluation

Severity

Critical Error Level 1

Critical Error Level 1

Informational Message

Environmental Protection Agency

Page 416 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-26

Check Name:

Check NOX Equation Code

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 NOx Rate Checks Needed for NOx Mass Calc = false
Heat Input Checks Needed for NOx Mass Calc = false
NOx Mass Equation Code = null
if (Derived Hourly Formula Status == true)

if ( Current DHV Formula Record is not null)

NOx Mass Equation Code = Current DHV Formula 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 for this 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 Needed for NOx Mass Calc = true
else if (NOx Mass Equation Code is null)
return result A

else

return result C

else

Environmental Protection Agency

Page 417 of 907


-------
Draft Check Specifications

12/16/2015

Derived Hourly Equation Status = true
Derived Hourly Equation Status = true

if ( Current NOx Rate Method Code == " AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for
Oil > 1 AND Legacy Data Evaluation == true)

NOx Mass Equation Code = "F-24A"

Results:

Result
A

B
C

Usage:
1

Description

You reported FormulalD [ID] in the DHV record for [param], but you did not
report a FormulaCode for this formula in your monitoring plan.

You reported FormulalD [ID] in the DHV record for NOX, but the
FormulaCode of this formula is not appropriate for calculating NOX from a
NOXC system.

You reported FormulalD [ID] in the DHV record for NOX, but the
FormulaCode of this formula is not appropriate for calculating NOX from a
NOx-diluent system.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 418 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-27

Check Name:	Check NOXR Equation Code

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 02 Dry Checks Needed for NOx Rate Calc = false
02 Wet Checks Needed for NOx Rate Calc = false
CO 2 Diluent Checks Needed for NOx Rate Calc = false
if ( Current DHVMethod == "AE")

Hourly Fuel Flow Needed for NOx Rate Calc = true
else

Hourly Fuel Flow Needed for NOx Rate Calc = false

NOx Rate Equation Code = "" // null string

if (Derived Hourly Formula Status == true)

if ( Current DHV Formula Record is not null)

NOx Rate Equation Code = Current DHV Formula 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

If ( Current DHV Record .ModcCode in set \{01, 02, 03, 04, 05, 14, 21, 22, 53, 54\})
if (NOx Rate Equation Code in set \{ 19-1, 19-4, F-5\} )

02 Dry Checks Needed for NOx Rate Calc = true
FD Factor Needed = true
else if (NOx Rate Equation Code in set \{ 19-3, 19-5\} )

02 Wet Checks Needed for 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\} )

CO 2 Diluent Checks Needed for NOx Rate Calc = true
FC Factor Needed = true

Environmental Protection Agency

Page 419 of 907


-------
Draft Check Specifications

12/16/2015

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

Description

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

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 420 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 421 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-28

Check Name:

Check C02C Equation Code

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 C02 Cone CEM Equation Code = "" II null string
if (Derived Hourly Formula Status == true)

if ( Current DHV Formula Record is not null)

CO2 Cone CEM Equation Code = Current DHV Formula Record .FormulaCode
if ( C02 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

Description

You reported FormulalD [ID] in the DHV record for C02C, but the
FormulaCode of this formula is not appropriate for calculating C02C.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	C02 Concentration Derived Hourly Evaluation

Environmental Protection Agency

Page 422 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-29

Check Name:

Check C02 Equation Code

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 C02 Cone Checks Needed for C02 Mass Calc = false
Use C02 Diluent Cap for Co2 Mass Calc = false
Use 02 Diluent Cap for Co2 Cone Calc = false
if ( CO2 App D Method Active For Hour == true)

Hourly Fuel Flow Checks Needed for C02 = true
else

Hourly Fuel Flow Checks Needed for C02 = false
CO2 Mass Equation Code = "" // null string
if (Derived Hourly Formula Status == true)
if ( Current DHV Formula Record is not null)

CO2 Mass Equation Code = Current DHV Formula Record .FormulaCode
if (CO2 CEM Method Active For Hour == true)

Flow Monitor Hourly Checks Needed = true

CO 2 Cone Checks Needed for C02 Mass Calc = true

if ( CO2 Mass Equation Code == "F-2" OR CO2 Mass Equation Code == "F-ll")
Derived Hourly Equation Status = true
If ( CO2 Mass Equation Code == \lquote F-2\rquote )

Moisture Needed = true
append "MIN" to H20 Missing Data Approach
if ( Current DHV Record .DiluentCapIndicator == 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

Environmental Protection Agency

Page 423 of 907


-------
Draft Check Specifications

12/16/2015

else if ( CO 2 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

Usage:
1

Description

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.

Emissions Data Evaluation Report	C02 Mass Rate Derived Hourly Evaluation

Severity

Critical Error Level 1
Informational Message

Environmental Protection Agency

Page 424 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-30

Check Name:

Check S02 Equation Code

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 S02 Monitor Hourly Checks Needed = false
if ( S02 App D Method Active For Hour == true)

Hourly Fuel Flow Checks Needed for S02 = true
else

Hourly Fuel Flow Checks Needed for S02 = false
SO2 Equation Code = "" II null string
if (Derived Hourly Formula Status == true)

If ( Current DHV Formula Record is not null)

SO2 Equation Code = Current DHV Formula Record .FormulaCode
if ( SO2 CEM Method Active For Hour == true)

if ( SO2 Equation Code == "F-l" OR SO2 Equation Code == "F-2")

Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true
If ( S02 Equation Code == "F-2")

Moisture Needed = true
append "MIN" to H20 Missing Data Approach
if ( S02 Monitor Hourly Count == 0)
return result A

else

SO2 Monitor Hourly Checks Needed = true
else if ( SO2 Equation Code == "F-23" AND SO2 F23 Method Active For Hour == true)

Derived Hourly Equation Status = true

else

return result B
else if ( SO2 F23 Method Active For Hour == true)
if ( S02 Equation Code == "F-23")

Derived Hourly Equation Status = true

Environmental Protection Agency	Page 425 of 907


-------
Draft Check Specifications

12/16/2015

else

return result B

else if ( SO 2 App D Method Active For Hour == true)

if ( SO 2 Equation Code = "D-12")

Derived Hourly Equation Status = true

else if ( S02 Equation Code in \{D-2, D-4, D-5\} AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow
Count for Oil == 1))

Derived Hourly Equation Status = true

return result C

else

return result B

else

Derived Hourly Equation Status = true
Derived Hourly Equation Status = true

Results:

Result

A

B

C

Usage:
1

Description

You did not report an MHV record for [param] for the hour.

You reported FormulalD [ID] in the DHV record for S02, but the
FormulaCode of this formula is not appropriate for calculating S02.

You reported FormulalD [ID] in the DHV record for S02, but a formula with
a FormulaCode [EQCODE] is not appropriate in this record. If you are
calculating S02 from multiple fuels using Appendix D, you should report a
formula with a FormulaCode of D-12 in the DHV record; otherwise, do not
report a FormulalD.

Emissions Data Evaluation Report	S02 Derived Hourly Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Informational Message

Environmental Protection Agency

Page 426 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-31

Check Name:

Check H20 Equation Code

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 H20 CEM Equation Code = "" // null string
if (Derived Hourly Formula Status == true)

If ( Current DHV Formula Record is not null)

H20 CEM Equation Code = Current DHV Formula 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

Description

You reported FormulalD [ID] in the DHV record for H20, but the
FormulaCode of this formula is not appropriate for calculating H20.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Environmental Protection Agency

Page 427 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-32

Check Name:	Verily Correct Reporting of NOXC MHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

If ( Current DHVMethod in set \{CEM, CEMNOXR\})

If ( Current DHV Parameter == "NOXR")

Nox Cone Needed for NOx Rate Calc = false

If Current DHV Record. ModcCode in set \{01, 02, 03, 04, 14, 21, 22, 53, 54\} // only need cone for measured data
If (NOx Cone Monitor Hourly Count == 0)
return result A

else

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

A

B

Usage:

1

2

Description

You did not report an MHV record for NOXC for the hour.

Severity

Critical Error Level 1

You reported an MHV record for NOXC, but you reported a MODCCode of Non-Critical Error
[mode] in the DHV record for NOXR. You should not report an MHV record
for NOXC when you use substitute data to determine the NOx emission rate.

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Emissions Data Evaluation Report	NOx Mass Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 428 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-33

Check Name:

Determine Default Value for MODC 40

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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 .AdjustedHourly Value is null OR

Current DHV Record .AdjustedHourly Value <= 0 OR
Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value <> H20 Default Value)

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 AdjustedHourly Value < H20 Default Min Value OR

Current DHV Record AdjustedHourly Value > H20 Default Max Value)

Derived Hourly Default Status == false

return result C

Else

H20 Default Value = Current DHV Record AdjustedHourly Value
Else if ( Current DHV Parameter == "S02R")

If Current DHV Record .AdjustedHourly Value is null OR
Current DHV Record .AdjustedHourly Value <= 0
Derived Hourly Default Status == false
return result D
If F23 Default Max Value is null

Derived Hourly Default Status == false

return result B

Environmental Protection Agency

Page 429 of 907


-------
Draft Check Specifications

12/16/2015

If ( F23 Default Value > 0)

if ( Current DHVRecord . AdjustedHourly 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 AdjustedHourly Value < F23 Default Min Value OR

Current DHV Record AdjustedHourly Value > F23 Default Max Value)
Derived Hourly Default Status == false
return result C

Else

F23 Default Value = Current DHV Record AdjustedHourly Value

Results:

Result
A

B
C
D

Usage:

1

2

Description

The AdjustedHourly Value reported in the DHV record for [param] is invalid.
The value must be between 0 and 100.

You reported an MODCCode of 40 in the DHV record for [param], but the
AdjustedHourly Value is not equal to the active default value in your
monitoring plan.

You reported an MODCCode of 40 in the DHV record for [param], but the
AdjustedHourly Value is outside the range of the active default values in your
monitoring plan.

The AdjustedHourly Value reported in the DHV record for [param] is invalid.
The value must be greater than 0.

Emissions Data Evaluation Report	H20 Derived Hourly Evaluation

Emissions Data Evaluation Report	S02R Derived Hourly Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 430 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-34

Check Name:	Determine Derived Hourly Record Status

Related Former Checks:

Applicability:	General Check

Specifications:

If ( Current DHVParameter == "NOXR")

Current NOX System Status = Derived Hourly System Status

Current NOXR HBHA Value = Current DHVHBHA 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: C02M Derived Hourly Status = false
HIT: HIT Derived Hourly Status = false

Usage:

1	Emissions Data Evaluation Report

2	Emissions Data Evaluation Report

3	Emissions Data Evaluation Report

4	Emissions Data Evaluation Report

C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation

Environmental Protection Agency

Page 431 of 907


-------
Draft Check Specifications

12/16/2015

5	Emissions Data Evaluation Report

6	Emissions Data Evaluation Report

7	Emissions Data Evaluation Report

8	Emissions Data Evaluation Report

NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
S02 Derived Hourly Evaluation
S02R Derived Hourly Evaluation

Environmental Protection Agency

Page 432 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-36

Check Name:

NOx Rate DHV Extraneous Fields Check

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Hourly Extraneous Fields = null

if ( Current DHV Method <> " AE" OR (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil > 0 AND App E

Constant Fuel Mix == false )

if ( Current DHV Record. SegmentNumber is not null)

append "SegmentNumber" to Hourly Extraneous Fields
if ( Current DHV Record. OperatingConditionCode is not null)

append "OperatingConditionCode" to Hourly Extraneous Fields
if ( Current DHV Method <> "LME")
if ( Current DHV Record. FuelCode is not null)

append "FuelCode" to Hourly Extraneous Fields
if (Hourly Extraneous Fields is not null),

return result A

Results:

Result

Description

Severity

A

You reported [fieldnames] in the DHV record for [param]. This data should Non-Critical Error
be blank.

Usage:
1

Emissions Data Evaluation Report	NOx Emissions Rate Derived Hourly Evaluation

Environmental Protection Agency

Page 433 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-37

Check Name:

Calculate Heat Input for LME Unit

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 HIT Calculated Adjusted Value = null

If (Derived Hourly Mode Status == true)

if (LME HI Method is equal to "MHHI" OR Current DHVRecord .MODCCode = "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. DefaultValue is greater than 0, AND Monitor Default.
DefaultUnitsOfMeasureCode is equal to "MMBTUHR")

If ( Current Hourly Op Record .OpTime 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)

I f (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 Record .HourLoad * Current Hourly Op Record .OpTime / LME April Load) + (LME
April Heat Input Array for the location * Current Hourly Op Record .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,

Environmental Protection Agency

Page 434 of 907


-------
Draft Check Specifications

12/16/2015

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 OpTime / (LME Total Load Array for the location - LME April
Load Array for the location)), and round the result to 1 decimal place.

else if (LME Total Optime is greater than 0)

Calculate HIT Calculated Adjusted Value = ((LME CP Total Heat Input - LME CP April Heat
Input) * Current Hourly Op Record .OpTime / (LME Total Optime - LME April Optime )) + ((
LME Total Heat Input Array for the location - LME April Heat Input Array for the location) *
Current Hourly Op Record OpTime / (LME Total OpTime Array for the location - LME April
OpTime Array for the location)), and round the result to 1 decimal place.

Otherwise,

If (LME Total Load is greater than 0)

If (HourLoad is equal to 0)

Calculate HIT Calculated Adjusted Value = (LME CP Total Heat Input * Current Hourly Op
Record .HourLoad * Current Hourly Op Record .OpTime / LME Total Load) + (LME Total
Heat Input Array for the location * Current Hourly Op Record .HourLoad * Current Hourly Op
Record .OpTime / 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.

Set HIT Calculated Adjusted Value = 0

else

Results:

Result

Description

You did not report a single, active, valid default record for MHHI in your
monitoring plan.

This check result is obsolete.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 435 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-38

Check Name:

Check Reported Heat Input for LME Unit

Related Former Checks:
Applicability:

LME Check

Specifications:

If ( Current DHVRecord .AdjustedHourlyValue is null or is less than 0)

Rpt Period HI Reported Accumulator Array for this location = -1
return result A

else if ( Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value

Rpt Period HI Reported Accumulator Array for this location = Current DHV Record AdjustedHourly Value

If (HIT Calculated Adjusted Value is not null and Current DHV Record .AdjustedHourly Value is not equal to HIT
Calculated Adjusted Value)

If (HIT Calculated Adjusted Value is greater than 1 OR Current DHV Record .AdjustedHourly Value is greater than

Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"

if (ABS( Current DHV Record .AdjustedHourly Value - HIT Calculated Adjusted Value ) > Heat Input Tolerance
)

return result B .

else

1)

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

C

You reported [fieldname] in the [type] record for [param] that is not rounded Critical Error Level 1

Environmental Protection Agency

Page 436 of 907


-------
Draft Check Specifications	12/16/2015

to the appropriate precision for that parameter.

Usage:

1	Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 437 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-39

Check Name:	Calculate S02 Mass for LME Unit

Related Former Checks:

Applicability:	LME Check

Specifications:

\ucl

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

Othe r wise,

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

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

Environmental Protection Agency

Page 438 of 907


-------
Draft Check Specifications

12/16/2015

else

Rpt Period S02 Mass Calculated Accumulator Array for this location = SO2 Mass Calculated Adjusted
Value

Results:

Result
A

B

C
D

Usage:
1

Description

The AdjustedHourlyValue in the DHV record for [param] could not be
recalculated, because you did not report a FuelCode in this record.

You have not reported one and only one active Monitor Default record with a
valid ParameterCode and DefaultPurposeCode in your monitoring plan to
report the default emission rate for the fuel. The AdjustedHourlyValue 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 AdjustedHourlyValue could not be recalculated.

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

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 439 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-40

Check Name:

Related Former Checks:

Determine Fuels Burned for LME Unit

Applicability:
Specifications:

LME Check

\ucl

\fs20 LME Fuel Code List = null

If (HIT Calculated Adjusted Value is not null)

Locate all DerivedHourly Value records for the location and hour where ParameterCode in set \{S02M, C02M, NOXM\}
For each record found,

Append DerivedHourly Value 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)

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

else

if ( Current Month is not April OR LME Annual == true)

Rpt Period HI Calculated Accumulator Array for this location = -1

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

return result A

Results:

Result

Description

The AdjustedHourlyValue in the DHV record for HIT could not be
recalculated due to another error listed in this report.

Severity

Informational Message

A

Usage:
1

Emissions Data Evaluation Report	HIT Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 440 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 441 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-41

Check Name:

Check Reported S02M for LME Unit

Related Former Checks:
Applicability:

LME Check

Specifications:

If ( Current DHVRecord .AdjustedHourlyValue is null or is less than 0)

Rpt Period S02 Mass Reported Accumulator Array for this location = -1
return result A

else if ( Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value

else

Rpt Period S02 Mass Reported Accumulator Array for this location = Current DHV Record AdjustedHourly Value

If (S02M Calculated Adjusted Value is not null AND Current DHV Record .AdjustedHourly Value is not equal to S02M
Calculated Adjusted Value)

S02 Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "S02M" AND

UOM = "LB"

if (ABS( Current DHV Record .AdjustedHourly Value - S02M Calculated Adjusted Value ) > S02 Mass Tolerance )
return result B

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

C

You reported [fieldname] in the [type] record for [param] that is not rounded Critical Error Level 1
to the appropriate precision for that parameter.

Usage:
1

Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 442 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 443 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-42

Check Name:	Calculate C02 Mass for LME Unit

Related Former Checks:

Applicability:	LME Check

Specifications:

\ucl

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

Othe r wise,

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

Environmental Protection Agency

Page 444 of 907


-------
Draft Check Specifications

12/16/2015

else

Rpt Period C02 Mass Calculated Accumulator Array for this location = CO 2 Mass Calculated
Adjusted Value

Results:

Result
A

B

C
D

Usage:
1

Description

The AdjustedHourlyValue in the DHV record for [param] could not be
recalculated, because you did not report a FuelCode in this record.

You have not reported one and only one active Monitor Default record with a
valid ParameterCode and DefaultPurposeCode in your monitoring plan to
report the default emission rate for the fuel. The AdjustedHourlyValue 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 AdjustedHourlyValue could not be recalculated.

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

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 445 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-43

Check Name:

Check Reported C02M for LME Unit

Related Former Checks:
Applicability:

LME Check

Specifications:

If ( Current DHVRecord .AdjustedHourlyValue is null or is less than 0)

Rpt Period C02 Mass Reported Accumulator Array for this location = -1
return result A

else if ( Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value

else

Rpt Period C02 Mass Reported Accumulator Array for this location = Current DHV Record AdjustedHourly Value

If ( C02M Calculated Adjusted Value is not null AND Current DHV Record .AdjustedHourly Value is not equal to C02M
Calculated Adjusted Value)

C02 Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "C02M" AND

UOM = "TON"

if (ABS( Current DHV Record .AdjustedHourly Value - C02M Calculated Adjusted Value ) > C02 Mass Tolerance )
return result B

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

C

You reported [fieldname] in the [type] record for [param] that is not rounded Critical Error Level 1
to the appropriate precision for that parameter.

Usage:
1

Emissions Data Evaluation Report	C02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 446 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 447 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURDHV-44

Check Name:

Calculate NOX Mass for LME Unit

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 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
Othe r wise,

Default Condition = null

If Current DHV Record .OperatingConditionCode is null,

Default Condition = "A"
else if Current DHV Record .OperatingConditionCode in set \{C, U, P, B\}

Default Condition = Current DHV Record .OperatingConditionCode
If Default Condition is null,

if ( Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1
return result B

else

if ( Current DHV Record .OperatingConditionCode is equal to "U")

Locate MonitorDefault record for the hour and location where ParameterCd = "NO RX ", DefaultPurposeCd = "
MD ", OperatingConditionCode is equal to Default Condition , and FuelCode is equal to Current DHV 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 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".

if ( Current Month is not April OR LME Annual == true)

Environmental Protection Agency

Page 448 of 907


-------
Draft Check Specifications

12/16/2015

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 MonitorDefault .Default SourceCode == "TEST")
if (MonitorDefault .GroupID is null)

if (Default Condition == "A" or "C")

Locate the latest UnitDefaultTest RecordsByLocationForQAStatus for the location where
FuelCode = Current DHVRecord .FuelCod e and EndDate/EndHour is on or before the
CurrentOperatingDate/Hour .

else if (Default Condition == "B")

Locate the latest UnitDefaultTest RecordsByLocationForQAStatus for the location where
FuelCode = Current DHV Record .FuelCod e, OperatingConditionCode == "A" or "B", and
EndDate/EndHour is on or before the CurrentOperatingDate/Hour .

else if (Default Condition == "P")

Locate the latest UnitDefaultTest RecordsByLocationForQAStatus for the location where
FuelCode = Current DHV Record .FuelCod e, OperatingConditionCode == "A" or "P", and
EndDate/EndHour is on or before the CurrentOperatingDate/Hour .

If not found,

UDEFStatus = "MISSING"

else

UDEFStatus = "FOUND"

Set UDEFExpiration Date to 5 years after the end of the quarter of the UnitDefaultTest
RecordsByLocationForQAStatus .EndDate.

Otherwise,

UDEFStatus = "GROUP"

Set UDEFExpiration Date to 5 years after the end of the quarter of the MonitorDefault .BeginDate.

if ( Current DHV Record .OperatingConditionCode is equal to "U")

Locate MonitorDefault record for the hour and location where ParameterCd = "NOR X ", DefaultPurposeCd
= "M D ", 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".

else

Locate MonitorDefault record for the hour and location where ParameterCd = "NOXR", DefaultPurposeCd =
"LM", OperatingConditionCode is equal to Default Condition , FuelCode is in LME Fuel Code List,
FuelCode is not equal to Current DHV Record .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)

Environmental Protection Agency

Page 449 of 907


-------
Draft Check Specifications

12/16/2015

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1
return result D
Otherwise,

If HIT Calculated Adjusted Value is null,

if ( Current Month is not April OR LME Annual == true)

Rpt Period NOx Mass Calculated Accumulator Array for this location = -1
return result E

else

Calculate NOXM Calculated Adjusted Value = HIT Calculated Adjusted Value * NOXR Default Value
, and round the result to one decimal place.

if ( Current Month is not April OR LME Annual == true)

if (Rpt Period NOx Mass Calculated Accumulator Array for this location is not null)

if (Rpt Period NOx Mass Calculated Accumulator Array for this location >= 0)

Rpt Period NOx Mass Calculated Accumulator Array for this location = Rpt Period NOx
Mass Calculated Accumulator Array for this location + NOXM Calculated Adjusted
Value

else

Rpt Period NOx Mass Calculated Accumulator Array for this location = NOx Mass
Calculated Adjusted Value

if ( Current Month is April)

if (April NOx Mass Calculated Accumulator Array for this location is not null)

April NOx Mass Calculated Accumulator Array for this location = April NOx Mass
Calculated Accumulator Array for this location + NOXM Calculated Adjusted Value

else

April NOx Mass Calculated Accumulator Array for this location = NOXM Calculated
Adjusted Value

Results:

Result
A

B

C

D

Description

The AdjustedHourlyValue in the DHV record for [param] could not be
recalculated, because you did not report a FuelCode in this record.

You reported an invalid OperatingConditionCode in the DHV record for
[param]. The AdjustedHourly Value could not be recalculated.

You have not reported one and only one active Monitor Default record with a
valid ParameterCode, DefaultPurposeCode, and OperatingConditionCode in
your monitoring plan to report the default emission rate for the fuel. The
AdjustedHourly Value in the DHV for [param] could not be recalculated.

You reported [Fuel] as the FuelCode in the DHV record for [param], but,
according to the Monitor Default records in your monitoring plan, this fuel
does not have the highest default emissions rate of the fuels combusted

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 450 of 907


-------
Draft Check Specifications

12/16/2015

during the hour. The AdjustedHourlyValue could not be recalculated.

E	The AdjustedHourly Value in the DHV record for [param] could not be	Informational Message

recalculated because the heat input rate could not be determined for the hour.

Usage:

1	Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 451 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-45

Check Name:	Check Reported NOXM for LME Unit

Related Former Checks:

Applicability:	LME Check

Specifications:

If ( Current DHVRecord .AdjustedHourlyValue is null or is less than 0)

Rpt Period NOx Mass Reported Accumulator Array for this location = -1
return result A

else if ( Current DHV Record .AdjustedHourly 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 .AdjustedHourly Value

else

Rpt Period NOx Mass Reported Accumulator Array for this location = Current DHV Record
. AdjustedHourly Value

If (NOXM Calculated Adjusted Value is not null AND Current DHV Record .AdjustedHourly Value is not equal to NOXM
Calculated Adjusted Value)

NOX Mass Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where

Parameter = "NOXM" AND

UOM = "LB"

if (ABS( Current DHV Record .AdjustedHourly Value - NOXM Calculated Adjusted Value ) > NOX Mass Tolerance )
return result B

Results:

Result
A

B

C

Description

The AdjustedHourly Value reported in the DHV record for [param] is invalid.
The value must be greater than or equal to 0.

The AdjustedHourly Value reported in the DHV record for [param] is
inconsistent with the recalculated value.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Severity

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

Usage:

Environmental Protection Agency

Page 452 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 453 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-46

Check Name:	Equation Code Consistent with Moisture Basis

Related Former Checks:

Applicability:	CEM Check

Specifications:

Usage:

1	Emissions Data Evaluation Report	S02M Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 454 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURDHV-47

Check Name:	Unit Default Test Expiration Check

Related Former Checks:

Applicability:	LME Check

Specifications:

If UDEF Status is not null,

If ( UDEF Status == "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 .FuelCode to the LME Fuel Array for the location,
else if ( UDEF Status == "GROUP")

if ( Current Operating Date is after the UDEF Expiration Date )
return result C.

Results:

Result
A

B

C

Description

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

Emissions Data Evaluation Report	NOXM Derived Hourly Evaluation (LME)

Environmental Protection Agency

Page 455 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-1

Check Name:

Initialize Accumulators for Summary Value Data

Related Former Checks: HOUROP-27

Applicability:

General Check

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

Environmental Protection Agency	Page 456 of 907


-------
Draft Check Specifications

12/16/2015

LME April Load Array for the location = 0
LME Total Heat Input Array for the location = 0
LME April Heat Input Array for the location = 0
LME Total OpTime Array for the location = 0
LME April OpTime Array for the location = 0
Last Day of Operation Array for the location = null
First Day of Operation = null
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

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 457 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-2

Check Name:

Reporting Period Details

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 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 Record .Begin ReportPeriod ) OR

( Current Monitoring Plan Record .EndReportPeriod is not null AND Current Monitoring Plan Record .EndReportPeriod
< 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 a 11 Location ReportingFrequency record for any unit in the configuration where Begin Quarter is on or before the
Current Reporting Period, and the End Quarter is null or is on or afte r the Current Reporting Period.

If found, and the ReportingFrequencyCode in all records == "Q",

Annual Reporting Requirement = true

else i f found, and the ReportingFrequencyCode in all records == " OS ",

If OS Reporting Requirement == false

Environmental Protection Agency

Page 458 of 907


-------
Draft Check Specifications

12/16/2015

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 \ul on or prior\ulnone to 200 8 )

Legacy Data Evaluation = true

Else

If Current Reporting Period is prior to the First ECMPS Reporting Period)

Legacy Data Evaluation = true
Locate a Hourly Op Data record for the configuration and reporting period where OperatingTime is greater than 0,
If found,

Reporting Period Operating = true

else,

Reporting Period Operating = false
S et LME Annual to false .

S et 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 2\super nd\nosupersub or 3\super rd\nosupersub Quarter,

Environmental Protection Agency

Page 459 of 907


-------
Draft Check Specifications

12/16/2015

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

S et LME Annual to true.

If OsMonitoringMethodFound is false, AND Current Reporting Period is for the 2\super nd\nosupersub 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 l\super st\nosupersub 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 "LME S " .

2)	BeginDate is on or before the la st 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,

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

Environmental Protection Agency

Page 460 of 907


-------
Draft Check Specifications

12/16/2015

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 2\super nd\nosupersub quarter AND LME Annual is false, then May
l\super st\nosupersub 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 Ahighlightl
\highlightO

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 the
Current Reporting Period and the EndDate is null or is on or after the Current Reporting Period.

If the ProgramCode in all the retrieved Location Program records are only equal to "NBP", "OTC", "NHNOX", or
"SIPNOX",

Locate all Unit Operating Status records for all unit s 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,

r eturn result I

Otherwise,

For each Unit Program record retrieved above where the ProgramCode is not equal to "NBP", "OTC", "NHNOX", or

Environmental Protection Agency

Page 461 of 907


-------
Draft Check Specifications

12/16/2015

"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 \ul all\ulnone unit programs,

return result I

Results:

Result
A

B
C
D

G
H
I

Usage:
1

Description

The locations in the file do not represent a valid monitoring configuration
during the reporting period. The file will not be evaluated.

The active Reporting Frequency records for this configuration are missing or
invalid. The file will not be evaluated. Please contact ECMPS technical
support for assistance with this matter.

According to the Reporting Frequency records, this monitoring configuration
is an ozone-season-only reporter, however the reporting period is not within
the ozone season. The file will not be evaluated.

You have reported an LME Annual Qualification record in your monitoring
plan, but, according to the Reporting Frequency records, this configuration is
not an annual reporter. The file will not be evaluated.

You have reported an LME Ozone Season Qualification record in your
monitoring plan, but, according to the Unit Program records, this
configuration does not report ozone season totals. The file will not be
evaluated.

You have reported an LME method in your monitoring plan for one or more
units in this configuration, but you have not reported an LME qualification
record. The file will not be evaluated.

You did not report an active heat input method for one or more locations in
the file. The file will not be evaluated.

The active heat input methods reported for the locations in the file are
inconsistent. The file will not be evaluated.

This file contains at least one unit that is retired. Please contact EPA if you
believe that all units in this configuration should report emissions data during
this reporting period.

Emissions Data Evaluation Report Summary Value Initialization

Severity
Fatal

Fatal

Fatal

Fatal

Fatal

Fatal

Fatal

Fatal

Critical Error Level 2

Environmental Protection Agency

Page 462 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-3

Check Name:

Related Former Checks:

Calculate Total Load for LME Configuration for Reporting Period

Applicability:
Specifications:

LME Check

\ucl

\fs20 LME Total Load = 0

LME April Load = 0

LME CP Total Heat Input = 0

LME CP April Heat Input = 0

LME Total Optime = 0

LME April Optime = 0

If (LME HI Method is not null)

If (LME HI Method == "MHHI")

Locate an LTFF record for any location in the monitoring configuration during the reporting period.

If found,

set Abort Hourly Checks to true, and return result A.

else

For each Hourly Op Data record for every \ul unit\ulnone in the monitoring configuration.

If Hourly Op Data. OpTime is not equal to 0 or Hourly Op Data. HourLoad is not null,

If Hourly Op Data. HourLoad is greater than or equal to 0 and Hourly Op Data. OpTime is between 0 and 1
(inclusive),

Locate the DerivedHourly Value record for the unit and the hour where ParameterCode is equal to "HIT".

If found, AND DerivedHourly Value. MODCCode is null,

Add HourLoad * OpTime to LME Total Load Array for the location

Add HourLoad * OpTime to LME Total Load.

Add OpTime to LME Total OpTime Array for the location

Add OpTime to LME Total Optime .

If the month of Hourly Op Data .Date is "April" AND LME OS is equal to true ,

Add HourLoad * OpTime to LME April Load Array for the location

Add HourLoad * OpTime to LME April Load.

Add OpTime to LME April OpTime Array for the location

Add OpTime to LME April Optime .

Environmental Protection Agency

Page 463 of 907


-------
Draft Check Specifications

12/16/2015

If not found, AND Hourly Op Data. HourLoad is greater than 0,
set LME Total Load to -1.
exit for.

Otherwise,

set LME Total Load to -1.
exit for.

If LME OS is equal to true and the reporting period is the second quarter,

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 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 or LME April Optime is greater than 1),
return result F .

else

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.

else

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 .

Results:

Result	Description

Environmental Protection Agency

Severity

Page 464 of 907


-------
Draft Check Specifications

12/16/2015

A
B

C

D

E

Usage:
1

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.

Emissions Data Evaluation Report Summary Value Initialization

Fatal
Fatal

Fatal

Critical Error Level 1
Fatal

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 465 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-4

Check Name:

Emission Comment Reporting Period Valid

Related Former Checks:
Applicability:

General Check

Specifications:

For a Emission Comment record:
If ReportingPeriod is null,
return result A.

Results:

Result	Description	Severity

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

Usage:
1

Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Environmental Protection Agency

Page 466 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-5

Check Name:

Submission Comment Valid

Related Former Checks:
Applicability:

General Check

Specifications:

For the Emission Comment record:
If SubmissionComment is null,
return result A.

Results:

Result	Description	Severity

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

Usage:
1

Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Environmental Protection Agency

Page 467 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-6

Check Name:	Duplicate Emission Comment Records

Related Former Checks:

Applicability:	General Check

Specifications:

For a Emission Comment record:

Locate another EmissionComment record for the monitoring plan with a ReportingPeriod equal to the ReportingPeriod in
the current record.

If found,

return result A.

Results:

Result	Description

A	Another [recordtype] record already exists with the same [fieldnames].

Usage:

1	Emissions Data Entry Screen Evaluation Emission Comments Evaluation

Seventy
Fatal

Environmental Protection Agency

Page 468 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-7

Check Name:	Validate LME Eligibility

Related Former Checks:

Applicability:	LME Check

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 (LME Annual == true)

Locate the latest MonitorQualification record where location is the unit being evaluated, the
QualificationTypeCode is equal to "LMEA", BeginDate is on or before the fir st 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 Annual NOx to 0.

Set Annual SO2 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 ox 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 .

Environmental Protection Agency

Page 469 of 907


-------
Draft Check Specifications

12/16/2015

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 "LME S BeginDate is on or before the later of the fir st 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.

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.

Else

If ( OS NOx is greater than 50)

Results:

Result

Description

Severity

A

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.

Fatal

Environmental Protection Agency

Page 470 of 907


-------
Draft Check Specifications

12/16/2015

B

C

D

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.

Fatal

Critical Error Level 2

Informational Message

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 471 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-8

Check Name:	Monitor Plan Evaluation Check

Related Former Checks:

Applicability:	General Check

Specifications:

Set MpSuccessfullyEvaluated = false.

If the SeverityLevelCd of the monitoring plan record for this configuration is equal to "CRIT1" or "FATAL",
return result A.

Otherwise,

If the NeedsEvalFlag and MustSubmitFlag of the monitoring plan record for this configuration are equal to "Y",

return result B.

Otherwise,

Set MpSuccessfullyEvaluated = true.

Results:

Result	Description	Severity

A	The Monitoring Plan associated with this quarterly emissions file has critical Critical Error Level 1

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.

B	The Monitoring Plan associated with this quarterly emissions file has not	Critical Error Level 1

been evaluated. You must evaluate the Monitoring Plan for this monitoring
configuration in order to complete the evaluation of this emissions file.

Usage:

1	Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 472 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-9

Check Name:	QA/Cert Test Evaluation Check

Related Former Checks:

Applicability:	General Check

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
A

B

C

Description

At least one QA/certification test associated with this monitoring
configuration has critical errors. You must correct all prior or concurrent
QA/certification tests in order to submit this quarterly emissions file to be
loaded on EPA's host system.

At least one QA/certification test associated with this monitoring
configuration has not been evaluated. You must evaluate all prior or
concurrent QA/certification tests in order to complete the evaluation of this
quarterly emissions file.

The emissions quarterly reported cannot be submitted, because EPA has
required the resubmission of a QA/certification test that is not present in the
Client Tool. Please review the Submission Access report for more
information about what needs to be submitted.

Severity

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 473 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-10

Check Name:	QA/Cert Event Evaluation Check

Related Former Checks:

Applicability:	General Check

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

B

Usage:
1

Description

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.

Emissions Data Evaluation Report Summary Value Initialization

Severity

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 474 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-11

Check Name:	Test Extension/Exemption Evaluation Check

Related Former Checks:

Applicability:	General Check

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
A

B

Usage:
1

Description

At least one test extension/exemption associated with this monitoring
configuration has critical errors. You must correct all prior or concurrent test
extension/exemption records in order to submit this quarterly emissions file
to be loaded on EPA's host system.

At least one test extension/exemption associated with this monitoring
configuration has not been evaluated. You must evaluate all prior or
concurrent test extension/exemption records in order to complete the
evaluation of this quarterly emissions file.

Emissions Data Evaluation Report Summary Value Initialization

Severity

Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 475 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-12

Check Name:

Related Former Checks:

Prior Emissions File Evaluation Check

Applicability:
Specifications:

General Check

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' \ul or\ulnone (CANSUBMIT = 'Y' and
SeverityCd is equal to "CRIT1" or "FATAL").

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

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' \ul or\ulnone
(CAN SUBMIT = 'Y' and UpdatedStatusFlag = 'NODATA').

If found,

If found,

If found,

return result C.

Results:

Result

Description

Severity

A

At least one prior quarterly emissions file for at least one location in this	Critical Error Level 1

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

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

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.

B

C

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 476 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-13

Check Name:	Determine If File Can Be Submitted

Related Former Checks:

Applicability:	General Check

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

Description

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

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 477 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-14

Check Name:	Ignored Offline Daily Calibration Check

Related Former Checks:

Applicability:

Specifications:

If (Ignored Daily Calibration Tests == true)
set Ignored Daily Calibration Tests to false
return result A.

Results:

Result
A

Description

You reported one or more daily calibration tests that will not fulfill your daily
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.

Severity

Informational Message

Usage:
1

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 478 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-15

Check Name:	Expiring Test Check

Related Former Checks:

Applicability:	General Check

Specifications:

Set Expired Systems and Expiring Systems to null.

Set Expiration Text to "have expired"

If FLOW System ID Array for the location is not null,

For each SystemID in the FLOW System ID Array for the location:

Locate the latest RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
SystemID being checked and the number of operating levels the OpLevelCodeList is equal to 3,

If found,

If RATATestRecordsByLocationForQAStatus .TestReasonCode 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 TestRecordsByLocationForQAStatus .EndDate

Set ExpirationDate to five years after the end of the quarter of the QACertEventforEMEvaluation .
T estCompletionDate

Else

Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecordsByLocationForQAStatus .EndDate

Else

Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecordsByLocationForQAStatus .EndDate.

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

Environmental Protection Agency	Page 479 of 907


-------
Draft Check Specifications

12/16/2015

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 AppendixE TestRecordsByLocationForQAStatus 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 AppendixE
TestRecordsByLocationForQAStatus .EndDate.

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 UnitDefaultTest RecordsByLocationForQAStatus 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 UnitDefaultTest
RecordsByLocationForQAStatus .EndDate.

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 .

Environmental Protection Agency

Page 480 of 907


-------
Draft Check Specifications

12/16/2015

else if ExpirationDat e 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
A

B

C

D

Description

Warning: The three-level RATA conducted for each of the following
monitoring systems [TEXT]: System ID(s) [EXPIRED], Except for a 720
operating-hour grace period extension, you will need monitor stack flow with
another FLOW system or report substitute data until you perform another
three-level RATA. In addition, the three-level RATA conducted for each of
the following monitoring systems will expire at the end of the next reporting
period: System ID(s) [EXPIRING]. Three-level RAT As expire after five
years.

Warning: The three-level RATA conducted for each of the following
monitoring systems [TEXT]: System ID(s) [EXPIRED], Except for a 720
operating-hour grace period extension, you will need monitor stack flow with
another FLOW system or report substitute data until you perform another
three-level RATA. Three-level RATAs expire after five years.

Prior Notice: The three-level RATA conducted for each of the following
monitoring systems will expire at the end of the next reporting period:

System ID(s) [EXPIRING]. Three-level RATAs expire after five years.

Warning: The Appendix E test conducted to determine the NOx correlation
curve for each of the following monitoring systems [TEXT]: System ID(s)
[EXPIRED], In subsequent reporting periods, you will need report substitute
data until you perform another Appendix E test. In addition, the Appendix E
test conducted for each of the following monitoring systems will expire at the
end of the next reporting period: System ID(s) [EXPIRING]. Appendix E
tests expire after five years.

Warning: The Appendix E test conducted to determine the NOx correlation
curve for each of the following monitoring systems [TEXT]: System ID(s)
[EXPIRED], In subsequent reporting periods, you will need report substitute
data until you perform another Appendix E test. Appendix E tests expire
after five years.

Prior Notice: The Appendix E test conducted to determine the NOx
correlation curve for each of the following monitoring systems will expire at
the end of the next reporting period: System ID(s) [EXPIRING]. Appendix E
tests expire after five years.

Warning: The LME Unit Default Test conducted to determine the default
NOx emission rate for each of the following fuels [TEXT]: Fuel Code(s)
[EXPIRED], In subsequent reporting periods, you will need report substitute
data until you perform another Unit Default Test. In addition, the Unit
Default Test conducted for each of the following fuels will expire at the end
of the next reporting period: Fuel Code(s) [EXPIRING]. LME Unit Default
Tests expire after five years.

Severity

Informational Message

Informational Message

Informational Message
Informational Message

Informational Message

Informational Message

Informational Message

Environmental Protection Agency

Page 481 of 907


-------
Draft Check Specifications

12/16/2015

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.

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.

Informational Message

Informational Message

Usage:
1

Emissions Data Evaluation Report Summary Value Evaluation

Environmental Protection Agency

Page 482 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-16

Check Name:	Ignored Offline Daily Interference Check

Related Former Checks:

Applicability:	CEM Check

Specifications:

If (Ignored Daily Interference Tests == true)
return result A.

Results:

Result
A

Usage:
1

Description

You reported one or more daily interference checks that will not fulfill your
daily testing requirement for your stack flow monitors, because these tests
were performed while the unit was not operating. These tests have been
assigned a CalculatedTestResult of "IGNORED". They can be viewed on the
Other Daily Tests tab of the View Detailed Emissions Screen.

Emissions Data Evaluation Report Summary Value Evaluation

Severity

Informational Message

Environmental Protection Agency

Page 483 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-17

Check Name:

Missing Peaking or Gas Fired Qualification Percent Check

Related Former Checks:
Applicability:

General Check

Specifications:

If Mp Successfully Evaluated equals true,

Set 1/2 Qualification Percent Missing List = null.

For each QualificationRecord record in MpQualificationRecords 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 QualificationRecord
.MonitorQualificationld, and QualificationDataYear is equal to CurrentReportingPeriodYear .

If not found,

Add MpQualificationRecords .Locationld to 1/2 Qualification Percent Missing List.

If 1/2 Qualification Percent Missing List is not null,

return result A.

Results:

Result

Description

You did not report a current year peaking qualification percent record.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 484 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-18

Check Name:

Validate Unit Fuel

Related Former Checks:

Applicability:

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 HourssD. to 0

Locate all 1/2 Facility Operating Supp Data Records for the unit where :

a)	The calendar year is the year prior to the calendar year of 1/2 Current Reporting Period.

b)	Parameter Code is equal to "OPHOURS".

c)	Fuel Code is equal to NULL.

For each located \f2 record

\fi-360 Increment Sum of Op HourssD. by Facility Operating Supp Data Records .OpValue
If Sum of Op Hours\£2 > 168
V£2

Set Sum of Op Hours by FueMl to null

Locate all 1/2 Facility Operating Supp Data Records for the unit where :

a)	The calendar year is the year prior to the calendar year of 1/2 Current Reporting Period.

b)	Parameter Code is equal to "OPHOURS".

c)	Fuel Code is NOT equal to NULL.

For each located \f2 record

\fi-360 Increment Sum of Op Hours by FueMl for Facility Operating Supp Data Records .FuelCode by
Facility Operating Supp Data Records .OpValue

For each FuelCode in Sum of Op Hours by FueMl

If (Sum of Op Hours by Fuel / Sum of Op Hours\D. is greater than or equal to 0.60 )

For each located Facility Unit Fuel Records record

If Facility Unit Fuel Records .FuelCode is not equal to the FuelCode for Sum of Op Hours by
Fuel

Environmental Protection Agency

Page 485 of 907


-------
Draft Check Specifications

12/16/2015

\f2

return A

Results:

Result
A

Usage:
1

Description

The current active primary fuel type defined in the monitoring plan is
inconsistent with 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.

Emissions Data Evaluation Report Summary Value Initialization

Severity

Informational Message

Environmental Protection Agency

Page 486 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-19

Check Name:

Initialize Sorbent Trap Check Parameters

Related Former Checks:

Applicability:

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 .LocationKey in
MonitoringPlanLocationRecords .

Append SorbentTrapInformation to MatsSorbentTrapListByLocationArray element for LocationPosition.

If Count of records in MatsSorbentTrapRecords is greater than 0,

Set MatsSorbentTrapEvaluationNeeded to true.

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 487 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURGEN-20

Check Name:

Initialize Weekly System Integrity Test Dictionary

Related Former Checks:

Applicability:

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.

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 488 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-21

Check Name:	Initialize General Lists

Related Former Checks:

Applicability:

Specifications:

Append each TestResultCodeLookupTable .TestResultCode to TestResultCodeList delimited by a comma.

Usage:

1	Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 489 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURGEN-22

Check Name:	Initialize System Parameters

Related Former Checks:

Applicability:	General Check

Specifications:

Set MatsDailyCalRequiredDate to null.

Locate SystemParameterLookupTable record where Sys Param Name is equal to 'MATSRULE.
If found,

Set MatsDailyCalRequiredDate to the located SystemParameterLookupTable .Param_Value2.

Usage:

1	Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 490 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-1

Check Name:

Initialize S02C Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "S02C"
S02C Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency	Page 491 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-2

Check Name:

Initialize H20 Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "H20"
H20 MHV Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Environmental Protection Agency	Page 492 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-3

Check Name:

Initialize NOXC Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "NOXC"
NOXC Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Environmental Protection Agency	Page 493 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-4

Check Name:

Initialize Flow Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "FLOW"
FLOW Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Environmental Protection Agency	Page 494 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-5

Check Name:

Initialize C02C Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "C02C"
C02C MHV Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Environmental Protection Agency	Page 495 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-6

Check Name:

Initialize 02 Dry Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "02D"
02 Dry Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Environmental Protection Agency	Page 496 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-7

Check Name:

Initialize 02 Wet Hourly Monitor Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "02W"
02 Wet Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Environmental Protection Agency	Page 497 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-8

Check Name:

Check MODC in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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. ModcCode == "23")

Current MHV Fuel Specific Hour = false
else if ( SO2 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, 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 ( S02 Bypass Code == "BYMAXFS")

Current MHV Fuel Specific Hour = true

else

Environmental Protection Agency

Page 498 of 907


-------
Draft Check Specifications

12/16/2015

If ( Current MHVRecord. 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 MHV Record 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 CO2 Fuel Specific Missing Data == true OR NOx Mass Fuel
Specific Missing Data == true OR Heat Input Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false
If ( Current MHV Record. ModcCode not in set \{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 20, 53, 54, 55\})
return result A

Environmental Protection Agency

Page 499 of 907


-------
Draft Check Specifications

12/16/2015

Else

Monitor Hourly Mode Status = true
C02C: Current MHVRecord = Current C02 Cone Monitor Hourly Record
Current MHV Component Type = 'C02'

Current MHV System Type = 'C02'

Current MHV Default Parameter = 'C02X'

C02C MHVMODC = Current C02 Cone Monitor Hourly Record .ModcCode

If (( CO 2 Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for C02 Mass Calc == true) OR (Heat
Input Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for Heat Input == true))

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false

If (( CO 2 Cone Checks Needed for Heat Input == true ) OR ( CO 2 Cone Checks Needed for C02 Mass Calc == true
))

If ( Current MHV Record. 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 (( CO 2 Diluent Checks Needed for NOx Rate Calc == true ) OR ( CO 2 Diluent Needed for 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)

Environmental Protection Agency

Page 500 of 907


-------
Draft Check Specifications

12/16/2015

Current MHVParameter Description = "02C"

else

Current MHV Parameter Description = "02C with a MoistureBasis of" + Current MHV Record .MoistureBasis
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 Needed for NOx Rate Calc == true) OR ( 02 Dry Needed for MATS == 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 Wet MODC = 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 .MoistureBasis
If (Heat Input Fuel Specific Missing Data == true AND 02 Wet Checks Needed for Heat Input == true)

Current MHV Fuel Specific Hour = true

else

Environmental Protection Agency

Page 501 of 907


-------
Draft Check Specifications

12/16/2015

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 Needed for MATS == 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 MHV Record = Current H20 Monitor Hourly Record
Current MHV Parameter = 'H20'

H20 MHVMODC = Current H20 Monitor Hourly Record .ModcCode
If (H20 Method Code == "MMS")

Current MHV Component Type = "H20"

else

Current MHV Component Type = "DAHS"

Current MHV System Type = null
Current MHV Default Parameter = null'

If (H20 Fuel Specific Missing Data == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false
If ( Current MHV Record. ModcCode not in set \{01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55\})
return result A

else

Monitor Hourly Mode Status = true
C02CSD:

Environmental Protection Agency

Page 502 of 907


-------
Draft Check Specifications

12/16/2015

Current MHVRecord = 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 (( CO 2 Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for C02 Mass Calc == true) OR (Heat
Input Fuel Specific Missing Data == true AND CO 2 Cone Checks Needed for Heat Input == true))

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false
If ( Current MHV Record. ModcCode not in set \{06, 07, 08, 09, 10, 12, 55\})
return result A

Else

Monitor Hourly Mode Status = true

02CSD:

if ( Current 02 Dry Missing Data Monitor Hourly Record is not null)

Current MHV Record = Current 02 Dry Missing Data Monitor Hourly Record

else

Current MHV Record = Current 02 Wet Missing Data Monitor Hourly Record
Current MHV Component Type = '02'

Current MHV System Type = null
Current MHV Default Parameter = '02N'

Current MHV Parameter Description = "02C (Substitute Data)"

If (Heat Input Fuel Specific Missing Data == true AND 02 Dry Checks Needed for Heat Input == true)

Current MHV Fuel Specific Hour = true

else

Current MHV Fuel Specific Hour = false
If ( Current MHV Record. ModcCode not in set \{06, 07, 08, 09, 10, 12, 55\})
return result A

Else

Monitor Hourly Mode Status = true

Results:

"Rpcnlt	"T^pcm-irvHrvn

Environmental Protection Agency

Page 503 of 907


-------
Draft Check Specifications

12/16/2015

Result

A

B

C

D

Description

The MODCCode reported in the MHV record for [param] is invalid.

You reported a MODCCode of [MODC] in the MHV record for NOXC, but
this MODC is not appropriate when NOX concentration is used in a NOx-
diluent system to calculate the NOx emission rate.

You reported a MODCCode of [MODC] in the MHV record for C02C, but
this MODC is not appropriate when C02 concentration is only used to
calculate a heat input based emission rate.

You reported a MODCCode of [MODC] in the MHV record for [param], but
this MODC is not appropriate when 02 concentration is not used to calculate
the heat input rate.

You reported a MODCCode of [MODC] in the MHV record for [param], but
this MODC is not appropriate when this value is used in a diluent system to
calculate the heat input based emission rate.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1	Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

3	Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

4	Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

5	Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

6	Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

7	Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

8	Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

9	Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 504 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-9

Check Name:

Check Percent Monitor Availability in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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)

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

if ( Complete MHV Record Needed == false)
return result C

else if ( Current MHV Record. Percent Available> 100.0 OR
Current MHV Record .Percent Available < 0.0)
return result D

case ( Current MHV Record. ModcCode )

= 06:

If Current MHVRecord .PercentAvailable >= 90.0
Monitor Hourly Pma Status = true

Else

return result E
= 08:

Monitor Hourly Pma Status = true

else

else

Else

Environmental Protection Agency

Page 505 of 907


-------
Draft Check Specifications

12/16/2015

If Current MHVRecord .PercentAvailable >=95.0

Monitor Hourly Pma Status = true

Else

return result E

= 09:

If Current MHV Record .Percent Available >= 90.0 AND Current MHV Record .Percent Available < 95.0
Monitor Hourly Pma Status = true

Else

return result E

If Current MHV Record .Percent Available >=80.0 AND Current MHV Record .Percent Available < 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

If Current MHV Record .Percent Available >=90.0
Monitor Hourly Pma Status = true

Else

return result E
All other MODC Codes:

Monitor Hourly Pma Status = true

= 10:

= 11:

Results:

Result

Description

Severity

Informational Message

A

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

B

Critical Error Level 1

C

You reported PercentAvailable in the MHV record for [param], but this value Non-Critical Error

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

D

Environmental Protection Agency

Page 506 of 907


-------
Draft Check Specifications

12/16/2015

E
F

Usage:

1

2

3

4

5

6

7

Critical Error Level 1

Informational Message

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
Percent Availability 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).)

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 507 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-10

Check Name:

Check Prior QA'd Hours for MODC 07

Related Former Checks:
Applicability:

CEM Check

Specifications:

if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if ( Current MHVRecord .ModcCode == 07)

if ( Current MHV Parameter in set \{02D, 02 W, 02CSD\})

Prior QA Hours = count MonitorHourlyValueData records where

MonitorHourlyValueData.ModcCode in set \{01, 02, 04, 17, 20 , 53 \} AND
MonitorHourlyValueData.ParameterCode = "02C" AND

(MonitorHourlyValueData.MoistureBasis = Current MHV Record .MoistureBasis OR
MonitorHourlyValueData.MoistureBasis is null) AND
(MonitorHourlyValueData.BeginDate < Current Date OR

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour < Current
Hour))

else if ( Current MHV Parameter == "C02CSD")

Prior QA Hours = count MonitorHourlyValueData records where

MonitorHourlyValueData.ModcCode in set \{01, 02, 04, 17, 20 , 21, 53 \} AND
MonitorHourlyValueData.ParameterCode = "C02C" AND
(MonitorHourlyValueData.BeginDate < Current Date OR

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour < Current
Hour))

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 MonitorHourlyValueData records where
MonitorHourlyValueData.ModcCode in set MODC Set AND

MonitorHourlyValueData.ParameterCode = Current MHV Record .ParameterCode AND
(MonitorHourlyValueData.BeginDate < Current Date OR

else

Environmental Protection Agency

Page 508 of 907


-------
Draft Check Specifications

12/16/2015

(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour < Current
Hour))

if ( Current MHVParameter 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

Usage:

1

2

3

4

5

6

7

Description

You reported an MODCCode of 07 in the MHV record for [param], but too
many prior quality assured hours exist in evaluation period for use of this
missing data approach.

Severity

Critical Error Level 1

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 509 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURMHV-11

Check Name:	Check Extraneous Data in MHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Monitor Hourly Null Status = false
Hourly Extraneous Fields = null

if ( Current MHV Record .AdjustedHourly Value is not null AND Current MHV Parameter not in set \{S02C, NOXC, FLOW
\»

append "AdjustedHourlyValue" to Hourly Extraneous Fields

if ( Current MHV Record .MoistureBasis 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
A

Usage:

1

2

3

4

5

6

7

Description

You reported [fieldnames] in the MHV record for [param]. This data should
be blank.

Severity

Non-Critical Error

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 510 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -12

Check Name:

Check For Correct Use of MODCs

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVHBHA Value = null

if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if ( Current MHVRecord .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

(MonitorHourlyValueData.MoistureBasis = Current MHV Record.MoistureBasis OR
MonitorHourlyValueData.MoistureBasis is null) AND
[MonitorHourlyValueData.Date < Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour < Current Hour)]
If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourlyValueData record where

MonitorHourlyValueData.ModcCode in set \{01, 02, 03, 04, 17, 20, 53, 54\} AND
MonitorHourlyValueData.ParameterCode = "02C" AND

(MonitorHourlyValueData.MoistureBasis = Current MHV Record.MoistureBasis OR
MonitorHourlyValueData.MoistureBasis is null) 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 MHV Record .UnadjustedHourly Value >= 0 AND Next MHV Record .UnadjustedHourly Value

Current MHV HBHA Value = (Prior MHV Record .UnadjustedHourly Value + Next MHV Record
.UnadjustedHourlyValue) / 2, ROUNDED to a single decimal.

>=0

else

Monitor Hourly Missing Data Status = false

return result A

else

Environmental Protection Agency

Page 511 of 907


-------
Draft Check Specifications

12/16/2015

case ( Current MHV Parameter )

S02C: MODC Set = \{01, 02, 03, 04, 16, 17, 19, 20, 21, 22, 53, 54\}

NOXC: MODC Set = \{01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54\}

FLOW: MODC Set = \{01, 02, 03, 04, 20, 53, 54\}

C02C OR C02CSD: MODC Set = \{01, 02, 03, 04, 17, 20, 21, 53, 54\}

H20: MODC Set = \{01, 02, 03, 04, 21, 53, 54\}
if ( Current MHV Parameter in set \{H20, C02C\})

Prior Record = latest MonitorHourlyValueData record or DerivedHourlyValueData 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 MonitorHourlyValueData record or DerivedHourlyValueData 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 Prior Record .UnadjustedHourly Value >= 0 AND Next Record .UnadjustedHourly Value >= 0

Current MHVHBHA Value = (Prior Record .UnadjustedHourly Value + Next Record
.UnadjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A
else if ( Current MHV Parameter == "C02CSD")

Prior MHV Record = latest MonitorHourlyValueData record where
MonitorHourlyValueData.ParameterCode = "C02C" AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date < Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour < Current Hour)]
If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourlyValueData record where
Environmental Protection Agency	Page 512 of 907


-------
Draft Check Specifications

12/16/2015

MonitorHourlyValueData.ParameterCode = "C02C" AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date > Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour > Current Hour)]

If Next MHVRecord is not null and is in current reporting period

If Prior MHV Record .UnadjustedHourlyValue >= 0 AND AND Next MHV Record
.UnadjustedHourlyValue >= 0

Current MHV HBHA Value = (Prior MHV Record .UnadjustedHourlyValue + Next MHV
Record .UnadjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Monitor Hourly Missing Data Status = false
return result A

else

Prior MHV Record = latest MonitorHourlyValueData record where

MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date < Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour < Current Hour)]
If Prior MHV Record is not null and is in current reporting period

Next MHV Record = earliest MonitorHourlyValueData record where

MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODC Set AND
[MonitorHourlyValueData.Date > Current Date OR

(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour > Current
Hour)]

If Next MHV Record is not null and is in current reporting period

If Prior MHV Record .AdjustedHourly Value >= 0 AND Next MHV Record .AdjustedHourly Value

>=0

if ( Current MHV Parameter == "FLOW")

Current MHV HBHA Value = (Prior MHV Record .AdjustedHourly Value + Next MHV
Record .AdjustedHourlyValue) / 2, ROUNDED to the nearest 1000.

else

Current MHV HBHA Value = (Prior MHV Record .AdjustedHourly Value + Next MHV
Record .AdjustedHourlyValue) / 2, ROUNDED to a single decimal.

else

Environmental Protection Agency

Page 513 of 907


-------
Draft Check Specifications

12/16/2015

Monitor Hourly Missing Data Status = false
return result B
else if ( Current MHVRecord .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 MHV Record .BeginHour

else

Prio r Date = 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 MHV Record .BeginDate
NextHour = Next Measured MHV Record .BeginHour

else

NextDate = the day after the end of the current reporting period

NextHour = 0

Missing Data Period Length = Count of MonitorHourlyValueData records for the location where
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourlyValueData.BeginDate > PriorDate OR

Environmental Protection Agency

Page 514 of 907


-------
Draft Check Specifications

12/16/2015

(MonitorHourlyValueData.BeginDate = PriorDate AND MonitorHourlyValueData.BeginHour > PriorHour)
) AND

(MonitorHourlyValueData.BeginDate < NextDate OR

(MonitorHourlyValueData.BeginDate = NextDate AND MonitorHourlyValueData.BeginHour < NextHour))
if ( Current MHVRecord. PercentAvailable is null OR Current MHVRecord. PercentAvailable >= 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 MonitorHourlyValueData record s 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 Record .MonitoringSystemID is not null,

Mine

Locate a RATATestRecordsByLocationForQAStatus for the location

where the MonitoringSystemID is equal to Current MHV Record .MonitoringSystemID, 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,

Environmental Protection Agency

Page 515 of 907


-------
Draft Check Specifications

12/16/2015

return result D

else

Locate all Monitor System Component Records for Hour and Location

where the ComponentID is equal to Current MHVRecord .ComponentlD.

Locate a RATATestRecordsByLocationForQAStatus 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 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

Results:

Result
A

B

C

D

Usage:

1

2

3

4

5

6

7

Severity

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

Critical Error Level 1

Description

The UnadjustedHourlyValue reported in the MHV record for [param] either
before or after the current hour is invalid.

The AdjustedHourlyValue reported in the MHV record for [param] either
before or after the current hour is invalid.

You reported an MODCCode of 11 in the MHV record for [param], but the
length of the 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.

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 516 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -13

Check Name:

Check System in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHV Mon Sys Record = null
Monitor Hourly System Status = false

If ( Current MHV Parameter == "NOXC" AND NOx Cone Checks Needed for Nox Mass == false)

if ( Current MHV Record .MonitoringSystemID 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 Needed for Heat Input == false AND CO 2
Cone Checks Needed for C02 Mass Calc == false)

if ( Current MHV Record .MonitoringSystemID 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 Needed for Heat Input == false AND 02 Wet
Checks Needed to Support C02 Calculation == false) OR ( Current MHV Parameter == "02D" AND 02 Dry Checks
Needed for Heat Input == false AND 02 Dry Checks Needed to Support C02 Calculation == false)

if ( Current MHV Record .MonitoringSystemID 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 .MonitoringSystemID is NOT null
return result F

else

Monitor Hourly System Status = true
else

case ( Current MHV Parameter )

S02C: MODC Set = \{01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22\}

Environmental Protection Agency

Page 517 of 907


-------
Draft Check Specifications

12/16/2015

NOXC: MODC Set = \{01, 02, 03, 04, 17, 18, 19, 20, 21, 22\}

C02C, 02D, or 02W: MODC Set = \{01, 02, 03, 04, 17, 18, 20 , 21 \}

FLOW: MODC Set = \{01, 02, 03, 04, 20\}

H20: MODC Set = \{01, 02, 03, 04, 21\}

If ( Current MHVRecord. ModcCode in set MODC Set)
if Current MHV Record .MonitoringSystemID is null
return result C

else

Current MHVMon Sys Record = find active MonitoringSystemData record for location where

MonitoringSystemData.MonitoringSystemID = Current MHV Record .MonitoringSystemID
if Current MHV Mon Sys Record is null
return result D

else

if ( Current MHV Parameter in set \{02D, 02 W\})
if (Legacy Data Evaluation == true

if ( Current MHV Mon Sys Record. SystemTypeCode not in set \{H20,02,C02,N0XC,N0X\})
return result E

else

Monitor Hourly System Status = true
else if ( Current MHV Mon Sys Record .SystemTypeCode 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 .SystemTypeCode not in \{H20T, H20M\})
return result E

else

Monitor Hourly System Status = true

else

if ( Current MHV Mon Sys Record . SystemTypeCode <> Current MHV System Type )

If ( Current MHV Parameter == "C02C" AND Legacy Data Evaluation == true AND
Current MHV Mon Sys Record .SystemTypeCode == "NOX")

Environmental Protection Agency

Page 518 of 907


-------
Draft Check Specifications

12/16/2015

Monitor Hourly System Status = true

else

return result E

else

Monitor Hourly System Status = true

else if ( Current MHVRecord .MonitoringSystemID is NOT null AND Monitor Hourly MODC Status == true AND
Current MHVRecord. ModcCode not in set \{05, 16, 53, 54\} )

return result F

else

Monitor Hourly System Status = true

Results:

Result	Description

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	Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

3	Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

4	Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

5	Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

6	Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

7	Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

8	Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

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

Environmental Protection Agency

Page 519 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 520 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURMHV-14

Check Name:	Check System Designation Code for System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

If (Monitor Hourly Mode Status == true AND Monitor Hourly System Status == true AND Current MHVMon Sys Record is
not null)

case ( Current MHV Record. ModcCode)

01 OR 17: If ( Current MHV Mon Sys Record. SystemDesignationCode NOT in set \{P, PB\})

\tab\tab\tab 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 <> \ldblquote RM")
return result C

22: If ( Current MHV Mon Sys Record. SystemDesignationCode <> \ldblquote CI")
return result D

Results:

Result
A

B

C

D

Usage:

1

2

3

4

5

6

7

Description

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

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 521 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -15

Check Name:

Check Component in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Monitor Hourly Component Status = false
if ( Current MHV Parameter NOT in set \{C02CSD, 02CSD\})
case ( Current MHV Parameter )

S02C: MODC Set = \{01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22 , 53 \}

NOXC: MODC Set = \{01, 02, 03, 04, 17, 18, 19, 20, 21, 22 , 53 \}

C02C, 02D, 02W: MODC Set = \{01, 02, 03, 04, 17, 18, 20 , 21, 53 \}

FLOW: MODC Set = \{01, 02, 03, 04, 20 , 53 \}

H20: MODC Set = \{01, 02, 03, 04, 21 , 53 \}

If ( Current MHV Record .ModcCode in set MODC Set)
if Current MHV Record. ComponentID is null

If ( Current MHV Parameter == "FLOW" and Current MHV Record .MonitoringSystemID is not null)

Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location where
MonitoringSystemComponentData .ComponentTypeCode = "FLOW" AND

MonitoringSystemComponentData.MonitoringSystemID = Current MHV Record. MonitoringSystemID

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 ModcStatus == true AND Current MHV Record. ModcCode == 17 AND Current MHV
Component Record. Componentldentifier does not begin with \ldblquote LKArdblquote

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

Environmental Protection Agency

Page 522 of 907


-------
Draft Check Specifications

12/16/2015

MonitoringSystemComponentData .ComponentID = Current MHVRecord .ComponentID AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHV Record. MonitoringSystemID

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 MHV Record. 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:

1

2

3

4

Description

You did not report a ComponentID in the MHV record for [param].

You reported ComponentID [ID] in the MHV record for [param], but this is
not an [comptype] component.

You reported an MODCCode of 17 in the MHV record for [param], which
indicates that 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.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Non-Critical Error

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Environmental Protection Agency

Page 523 of 907


-------
Draft Check Specifications

12/16/2015

5

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 524 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -16

Check Name:

Check Pre-Bias-Adjusted Value

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Monitor Hourly Preadjusted Value Status = false

S02C: MODC Set = \{01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54\}

NOXC: MODC Set = \{01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54\}

FLOW: MODC Set = \{01, 02, 03, 04, 20, 53, 54\}

If ( Current MHVRecord. ModcCode in set MODC Set)

If ( Current MHV Record .UnadjustedHourly Value is null AND

Current MHV Record. ModcCode not in set \{04, 19, 20, 53, 54\})
return result A

else if ( Current MHV Record .UnadjustedHourly Value < 0.0 AND
Current MHV Record. ModcCode not in set \{ 16, 21\} )
return result A

else if ( Current MHV Record .UnadjustedHourly Value > 2 AND
Current MHV Record. ModcCode == 16 )
return result B

else if ( Current MHV Record .UnadjustedHourly Value > 0 AND
Current MHV Record. ModcCode ==21)
return result C

else if ( Current MHV Parameter in set \{S02C, NOXC\} and Current MHV Record .UnadjustedHourly Value is not
rounded to 1 decimal place)

return result F

else if ( Current MHV Parameter == "FLOW" and Current MHV Record .UnadjustedHourly Value is not rounded to the
nearest 1000)

return result F

else

Monitor Hourly Preadjusted Value Status = true
if ( Current MHV Max Min Value is not null)

if ( Current MHV Record .UnadjustedHourly Value > Current MHV Max Min Value)

return result D

Environmental Protection Agency

Page 525 of 907


-------
Draft Check Specifications

12/16/2015

else if (Monitor Hourly Mode Status == true)
If ( Current MHVRecord .UnadjustedHourlyValue is not null)
return result E

Else

Monitor Hourly Preadjusted Value Status = true

Results:

Result
A

B

C

D

E
F

Description

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 UnadjustedHourlyValue reported in the MHV record for
[param] is in excess of the maximum value listed in the monitoring plan.
Sources are required to periodically (at least once annually) evaluate the
appropriateness of these maximum values in the monitoring plan and make
proper adjustments when necessary. Adjustments may include the need to
update Span and/or Default values. You should investigate the cause of these
exceedances and determine whether adjustments to your monitoring systems
or monitoring plan are necessary.

You reported an MODCCode of [modcCode] in the MHV record for [param],
so you should not have reported a value for the UnadjustedHourlyValue.

You reported [fieldname] in the [type] record for [param] that is not rounded
to the appropriate precision for that parameter.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message

Critical Error Level 1

Critical Error Level 1

Usage:

1	Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 526 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -17

Check Name:

Verily Consistency Between NOx Emission Rate and NOx Concentration

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (NOx Cone Needed for NOx Rate Calc == true AND Monitor Hourly Mode Status == true)

if ( Current MHVRecord .MODCCode not in set \{01, 02, 03, 04, 17, 18, 19, 20, 21, 22 , 53 \} )
return result A

else if ( Current MHV Record .MODCCode ==21 AND NOx Emission Rate MODC not in set \{ 14, 21\})
return result A

else if ( Current MHV Record .MODCCode == 22 AND NOx Emission Rate MODC not in set\{ 14, 22\})
return result A

Results:

Result

Description

Severity

A

You reported an MODCCode of [MODC] in the MHV record for NOXC that Critical Error Level 1
is inconsistent with MODCCode of [NOX ER MODC] reported in the DHV
record for NOXR.

Usage:
1

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 527 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -18

Check Name:

Determine Maximum or Minimum Value for Parameter in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHV Max Mitt 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 (Default Record .DefaultValue > 0)

Current MHV Max Min Value = Default Record .DefaultValue

else

return result D

Environmental Protection Agency

Page 528 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current MHVRecord. ModcCode in set \{ 13, 24\} AND Current MHVFuel 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 .DefaultValue > 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 \{02W, 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"

Environmental Protection Agency

Page 529 of 907


-------
Draft Check Specifications

12/16/2015

DefaultPurposeCode = "MD" // missing data
if (count >1)

return result B

else if (( Current MHV Parameter == "02D" AND 02 Dry Checks Needed for 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 (Default Record .DefaultValue > 0)

Current MHV Max Min Value = Default Record .DefaultValue

else

return result D

e lse

If ( Current MHV Component Type == "FLOW")

Current MHV Span Description = "FLOW"

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "FLOW"

else

Current MHV Span Description = Current MHV Component Type + " with a SpanScale of H"

Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = Current MHV Component Type AND
MonitoringSpanData. SpanScaleCode = "H"

if (Monitor Span Record Count > 1)

return result E
else if (Monitor Span Record Count = 0)
return result F

else

Current Monitor Span Record = the single matched record
If ( Current MHV Record. ModcCode == 19)

if Current Monitor Span Record .DefaultHighRange > 0)

Current MHV Max Min Value = Current Monitor Span Record. DefaultHighRange

Environmental Protection Agency	Page 530 of 907


-------
Draft Check Specifications	12/16/2015

else

return result G

else if (( Current Monitor Span Record .DefaultHighRange is null AND Current MHVRecord. ModcCode
not in set \{ 13, 24\}) or Current MHV Record. ModcCode == 12)

if ( Current MHV Record. ModcCode == 20)

if ( Current MHV Parameter == "FLOW")

if Current Monitor Span Record .FlowFullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span Record. FlowFullScaleRange *

2

else

return result G

else

if Current Monitor Span Record .FullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span Record. FullScaleRange * 2

else

return result G

else

if ( Current MHV Parameter == "FLOW")

if Current Monitor Span Record .MPFValue > 0)

Current MHV Max Min Value = Current Monitor Span Record. MPFValue

else

return result G

else

if Current Monitor Span Record .MPCValue > 0)

Current MHV Max Min Value = Current Monitor Span Record. MPCValue

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)

Environmental Protection Agency

Page 531 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B
C
D
E
F
G

Usage:

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 == 20)

if Current Monitor Span Record .FullScaleRange > 0)

Current MHV Max Min Value = Current Monitor Span Record. FullScaleRange * 2

else

return result G

else if ( Current MHV Record. ModcCode in set \{ 13, 24\})
if Current Monitor Span Record .MECValue > 0)

Current MHV Max Min Value = Current Monitor Span Record. MECValue

else

return result G

else

if Current Monitor Span Record .SpanValue > 0)

Current MHV Max Min Value = Current Monitor Span Record. SpanValue

else

return result G

Description

The missing data default parameter for H20 could not be determined,
because you used both Standard and Inverse Part 75 missing data approaches
during the hour.

You reported more than one applicable [param] Default record with a
FuelCode of [FuelCode] in your monitoring plan for the hour.

You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].

The values reported in the applicable [param] Default record with a FuelCode
of [FuelCode] are invalid.

You reported more than one active span record for [key] in your monitoring
plan for the hour.

You did not report an active span record for [key] in your monitoring plan for
the hour.

The values reported in the applicable span record for [key] are invalid.

Severity

Critical Error Level 2

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

Environmental Protection Agency

Page 532 of 907


-------
Draft Check Specifications

12/16/2015

1	Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

3	Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

4	Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

5	Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

6	Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

7	Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

8	Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

9	Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 533 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V -19

Check Name:

Check Adjusted Hourly Value in MHV Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 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 Needed for Nox Mass Calc == true )

If (Current MHV Parameter == "FLOW")

set Current MHV Precision to 1.
case ( Current MHV Record. ModcCode )

= 21: Current MHV Calculated Adjusted Value = 0

if ( Current MHV Record .AdjustedHourly Value == 0)

Monitor Hourly Adjusted Value Status = true

else

return result A
= 16: Current MHV Calculated Adjusted Value = 2

if ( Current MHV Record .AdjustedHourly Value == 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 .AdjustedHourly Value == Current MHV Max Min Value )

set Current MHV Precision to -3.

else

Monitor Hourly Adjusted Value Status = true

else

return result C

= 13 OR 24:

Environmental Protection Agency

Page 534 of 907


-------
Draft Check Specifications

12/16/2015

If ( Current MHVMax Min Value is not null)

Current MHV Calculated Adjusted Value = Current MHV Max Min Value
if ( Current MHV Record .AdjustedHourly Value == 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 MHV HBHA Value
If ( Current MHV Record .AdjustedHourly Value >= 0)

if ( Current MHV Record AdjustedHourly Value == Current MHV Calculated Adjusted Value )

Monitor Hourly Adjusted Value Status = true

else

return result G

else

return result H

else

If ( Current MHV Record .AdjustedHourly Value >= 0)

If ( Current MHV Record .AdjustedHourly Value is not rounded to Current MHV Precision )
return result L

else

Current MHV Calculated Adjusted Value = Current MHV Record AdjustedHourly 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
.AdjustedHourly 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 .AdjustedHourly Value >= 0)

Environmental Protection Agency	Page 535 of 907


-------
Draft Check Specifications

12/16/2015

If ( Current MHVHBHA Value is not null AND Current MHVHBHA Value > Current MHVRecord
. AdjustedHourlyValue 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 .AdjustedHourly Value is not rounded to Current MHV Precision )
return result L

else

Current MHV Calculated Adjusted Value = Current MHV Record AdjustedHourly 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
.AdjustedHourly 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 .AdjustedHourly Value >= 0)

If ( Current MHV Record .AdjustedHourly Value is not rounded to Current MHV Precision )
return result L

else

Current MHV Calculated Adjusted Value = Current MHV Record AdjustedHourly 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 .AdjustedHourly Value >
Current MHV Max Min Value * 2)

If the Current MHV Record.ModcCode == 10

return result P

Otherwise,

return result O

Environmental Protection Agency	Page 536 of 907


-------
Draft Check Specifications

12/16/2015

else

Otherwise,

return result K

Else

return result H

= All Other Codes:

If ( Current MHVRecord .AdjustedHourlyValue >= 0)

Iff Current MHV Record. ModcCode in set \{ 19, 20\} AND Current MHV Record . Una
djustedHourlyValue is null)

If ( Current MHV Max Min Value is not null)

if ( Current MHV Record .AdjustedHourly Value == Current MHV Max Min Value )

Current MHV Calculated Adjusted Value = Current MHV Record AdjustedHourly Value

Monitor Hourly Adjusted Value Status = true

else

if ( Current MHV Record. ModcCode == "19")
return result M

else

return result N

else i f ( Current MHV Record .AdjustedHourly Value is not rounded to Current MHV Precision )
return result L

else

Monitor Hourly Adjusted Value Status = true

Else

return result H

If ( Current MHV Record .AdjustedHourly Value is not null)
return result J

Results:

Result
A

B

C

Description

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

Severity

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

Environmental Protection Agency

Page 537 of 907


-------
Draft Check Specifications

12/16/2015

D

H
I

K

L
M

N

O

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 AdjustedHourlyValue in the MHV record for NOXC. This
field should be blank when the NOX concentration is used to calculate the
NOX emission rate as part of a NOX system.

Warning: The AdjustedHourlyValue 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
AdjustedHourlyValue 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
AdjustedHourlyValue does not equal 200 percent of the FullScaleRange
reported in the [comptype] span record in your monitoring plan.

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

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

Usage:

1

2

3

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 538 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURMHV-20

Check Name:	Check Unadjusted Hourly Value in MHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Monitor Hourly Unadjusted Value Status = false

if (Monitor Hourly Mode Status == true AND Monitor Hourly Missing Data Status == true AND

(Monitor Hourly Pma Status == true OR Current MHV Record .ModcCode NOT in set \{06, 07, 08, 09, 10,11\}))
Calculated Unadjusted Value = null
case ( Current MHV Record. ModcCode )

= 21: Calculated Unadjusted Value = 0

if ( Current MHV Record .UnadjustedHourlyValue == 0)

If ( Current MHV Parameter == "C02C" and Current Hourly Op Record .LoadRange is greater than 1,
return result L

else

Monitor Hourly Unadjusted Value Status = true

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 .UnadjustedHourly Value == Current MHV Max Min Value)

Monitor Hourly Unadjusted Value Status = true

else

return result B

= 20: If ( Current MHV Record .UnadjustedHourly Value >= 0)

If ( Current MHV Max Min Value is not null)

If ( Current MHV Parameter begins with "02" AND Current MHV Record .UnadjustedHourlyValue > 20.9)

Calculated Unadjusted Value = Current MHV Max Min Value
return result K

else i f Current MHV Parameter == " C 02 C " AND Current MHV Record .UnadjustedHourlyValue >
Current MHV Max Min Value )

Environmental Protection Agency

Page 539 of 907


-------
Draft Check Specifications

12/16/2015

Calculated Unadjusted Value = Current MHVMax Min Value
return result C

elseif ( Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current MHV Record .UnadjustedHourly Value
Monitor Hourly Unadjusted Value Status = true

else

return result E
= 06: If ( Current MHVHBHA Value is not null)

Calculated Unadjusted Value = Current MHV HBHA Value
If ( Current MHV Record .UnadjustedHourly Value >= 0)

if ( Current MHV Record .UnadjustedHourly Value == Calculated Unadjusted Value )

Monitor Hourly Unadjusted Value Status = true

else

return result D

else

return result E

else

If ( Current MHV Record .UnadjustedHourly Value >= 0)

If ( Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current MHV Record .UnadjustedHourly Value

Monitor Hourly Unadjusted Value Status = true

if ( Current MHV Max Min Value is not null)

If (( Current MHV Parameter == "H20" AND H20 Missing Data Approach == "MIN") OR
Current MHV Parameter begins with "02")

if ( Current MHV Record .UnadjustedHourly Value < Current MHV Max Min Value)

return result H

else

if ( Current MHV Record .UnadjustedHourly Value > Current MHV Max Min Value)
return result F

Environmental Protection Agency	Page 540 of 907


-------
Draft Check Specifications

12/16/2015

Else

return result E

= 08 OR =09:

If ( Current MHVRecord .UnadjustedHourlyValue >= 0)

If ( Current MHV HBHA Value is not null AND (( Current MHV Parameter == "H20" AND H20 Missing
Data Approach == "MIN") OR Current MHV Parameter begins with "02") AND Current MHV HBHA Value <
Current MHV Record .UnadjustedHourly Value)

Calculated Unadjusted Value = Current MHV HBHA Value

return result J

else if ( Current MHV HBHA Value is not null AND (( Current MHV Parameter == "H20" AND H20 Missing
Data Approach == "M AX ") OR Current MHV Parameter does not begin with "02" or "H20") AND Current
MHV HBHA Value > Current MHV Record .UnadjustedHourly Value)

Calculated Unadjusted Value = Current MHV HBHA Value

return result G

else

if ( Current MHV Record .UnadjustedHourly Value is not rounded to one decimal place)
return result I

else

Calculated Unadjusted Value = Current MHV Record .UnadjustedHourly Value

Monitor Hourly Unadjusted Value Status = true

if ( Current MHV Max Min Value is not null)

If (( Current MHV Parameter == "H20" AND H20 Missing Data Approach == "MIN") OR
Current MHV Parameter begins with "02")

if ( Current MHV Record .UnadjustedHourly Value < Current MHV Max Min Value)

return result H

else

if ( Current MHV Record .UnadjustedHourly Value > Current MHV Max Min Value)
return result F

Else

return result E

= All Other Codes:

If ( Current MHV Record .UnadjustedHourly Value >= 0)

If ( Current MHV Parameter in set \{"H20", "C02C", "02D", "02 W", "C02CSD", "02CSD"\} AND Current
MHV Record .UnadjustedHourlyValue > 100)

return result E

Environmental Protection Agency

Page 541 of 907


-------
Draft Check Specifications

12/16/2015

else if ( Current MHVRecord .UnadjustedHourlyValue is not rounded to one decimal place)
return result I

else if ( Current MHV Record .UnadjustedHourly Value == 0 AND Current MHV Parameter == "C02C" and
Current Hourly Op Record .LoadRange is greater than 1,

return result L

else

Calculated Unadjusted Value = Current MHV Record .UnadjustedHourly Value

Monitor Hourly Unadjusted Value Status = true

if ( Current MHV Max Min Value is not null)

If (( Current MHV Parameter == "H20" AND H20 Missing Data Approach == "MIN") OR Current
MHV Parameter begins with "02")

if ( Current MHV Record .UnadjustedHourly Value < Current MHV Max Min Value)

return result H

else

if ( Current MHV Record .UnadjustedHourly 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

Description

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
UnadjiistcdHourlv Value does not equal 200 percent of the FullScaleRange

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 542 of 907


-------
Draft Check Specifications

12/16/2015

D

E
F

H

I
J

K

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

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

Usage:

1

2

3

4

5

6

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency

Page 543 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURMHV-21

Check Name:	Determine BAF Value for Monitoring System in MHV Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 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. UnadjustedHourlyValue is not null AND Current MHV Max
Min Value is not null)))

If (RATA Status BAF is not null)

case ( Current MHV Parameter )

S02C: Current S02 System BAF = RA TA Status BAF

NOXC: Current NOXC System BAF = RATA Status BAF

FLOW: Current FLOW System BAF = RA TA Status BAF

return result A

Results:

Result	Description	Severity

A	The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, Critical Error Level 1

because the prior RATA had critical errors or because of a RATA Status
error listed on this report.

Usage:

1	Emissions Data Evaluation Report	NOXC RATA Status Evaluation

2	Emissions Data Evaluation Report	S02 RATA Status Evaluation

3	Emissions Data Evaluation Report	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 544 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-22

Check Name:

Calculate Bias Adjusted Value in MHV Record

Related Former Checks:
Applicability:

CEM Check

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 .UnadjustedHourlyValue * Current BAF, and the result to the

Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = Current MHV Parameter AND
UOM = "PPM"

Calculated Adjusted Value = Current MHV Record .UnadjustedHourly Value * 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 .AdjustedHourly Value <> Current MHV Max Min Value )

nearest 1000.

else

If ( Current MHV Record .ModcCode == 20)

return result A

else

return result C

else

Environmental Protection Agency

Page 545 of 907


-------
Draft Check Specifications

12/16/2015

case ( Current MHV Parameter )

S02C: S02C Calculated Adjusted Value = Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Calculated Adjusted Value
if (Monitor Hourly Adjusted Value Status == true)

if ABS( Calculated Adjusted Value - Current MHV Record .AdjustedHourly Value) > Tolerance
return result B
else

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

Results:

Result
A

B

C

Usage:

1

2

3

Description

You reported an MODCCode of 20 in the MHV record for [param], but the
AdjustedHourlyValue does not equal 200 percent of the FullScaleRange
reported in the [comptype] span record in your monitoring plan.

The AdjustedHourlyValue reported in the MHV record for [param] is not
equal to the UnadjustedHourlyValue times the BAF for the [systype]
MonitoringSystemID [ID],

You reported an MODCCode of 19 in the MHV record for [param], but the
AdjustedHourlyValue 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

Emissions Data Evaluation Report	NOXC RATA Status Evaluation

Emissions Data Evaluation Report	S02 RATA Status Evaluation

Emissions Data Evaluation Report	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 546 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMH V-23

Check Name:

Initialize C02C Hourly Monitor for Substitute Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "C02CSD"
C02C SD Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	C02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency	Page 547 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-24

Check Name:

Initialize 02C Hourly Monitor for Substitute Data

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current MHVParameter = "02CSD"
02C SD Calculated Adjusted Value = null

Usage:

1	Emissions Data Evaluation Report	02C Monitor Hourly Evaluation for Substitute Data

Environmental Protection Agency	Page 548 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOURMHV-26

Check Name:

Determine if MHV Record Needs QA Status Evaluation

Related Former Checks:
Applicability:

CEM Check

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 Componentld

Set QaStatusComponentldentifier = CurrentMHVRecord Componentldentifier

Set QaStatusComponentTypeCode = CurrentMHVRecord ComponentTypeCode

Set QaStatusSystemDesignationCode = CurrentMHVRecord. SystemDesignationCode

Set QaStatusSystemld = CurrentMHVRecord Systemld

Set QaStatusSystemldentifier = CurrentMHVRecord . Systemldentifier

Set QaStatusSystemTypeCode = CurrentMHVRecord .SystemTypeCode

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. UnadjustedHourly Value is not null
AND

Current MHV Max Min Value is not null)))

if (MonitorHourlyComponentStatus = true AND CurrentMHVRecord .ComponentID is not null AND
CurrentMHVParameter in set \{S02C, NOXC, C02C, 02D, 02W\} )

Set LinearityStatusRequired = true.

Set DailyCalStatusRequired = true.

if (MonitorHourlyComponentStatus = true AND CurrentMHVRecord ComponentID is not null AND
CurrentMHVParameter in set \{ FLOW \} )

Set DailyCalStatusRequired = true.

Environmental Protection Agency

Page 549 of 907


-------
Draft Check Specifications

12/16/2015

Set Daily Int Status Required = true.

If CurrentMHVRecord. SampleAcquistionMethodCd = "DP"ne

Set Leak Status Required = true.

if (MonitorHourlySystemStatus = true AND CurrentMHVRecord . MonitoringSystem ID 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 (( CO 2 Cone Checks Needed for Heat Input == true AND CurrentMHVParamete r == "C02C") OR ( 02 Wet
Checks Needed for Heat Input == true AND CurrentMHVParamete r == "02 W") OR ( 02 Dry Checks Needed for Heat
Input == true AND CurrentMHVParamete r == "02D"))

Set C02R ATARequired = true.

if (RA TA Status Required == false AND Current MHV Parameter in \{ S02 C , 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
i f (LinearityStatusRequired == true OR DailyCalStatusRequired == true )

Set DualRangeStatus = false.

Set CurrentAnalyzerRangeUsed = null.

S et ApplicableSystemlDs = null.

Set HighRangeComponentID = null.

Set LowRangeComponentID = null,
if ( CurrentMHI Parameter == "FLOW")

Set ApplicableComponentlD = Current MHV Record .ComponentID

else

Set ApplicableComponentlD = null.

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the ComponentID is equal
to the CurrentMHVRecord .ComponentID.

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

set Linearity Status Required == false

set DailyCalStatusRequired = false

return result A

Environmental Protection Agency	Page 550 of 907


-------
Draft Check Specifications

12/16/2015

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 .ComponentTypeCode and the SpanScaleCode
is equal to "L".

if (MonitorSpanRecordsByHourLocation is not found OR if more than one
MonitorSpanRecordsByHourLocation is found OR if the MonitorSpanRecordsByHourLocation
.ScaleTransitionPoint is null or <= 0)

set Linearity Status Required == false

set DailyCalStatusRequired = false

return result B

else if (MonitorSpanRecordsByHourLocation is found AND CurrentMHVRecord
.UnadjustedHourlyValue > MonitorSpanRecordsByHourLocation .ScaleTransitionPoint AND
CurrentMHVRecord .ModcCode <> "18")

Set CurrentAnalyzerRangeUsed = "H".

Set HighRangeComponentID = CurrentMHVRecord. Component ID.

Set LowRangeComponentID = CurrentMHVRecord. Component ID.

else

Set CurrentAnalyzerRangeUsed = "L".

Set HighRangeComponentID = CurrentMHVRecord. Component ID.

Set LowRangeComponentID = CurrentMHVRecord. Component ID.

else

Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation .AnalyzerRangeCode.

if (AnalyzerRangeRecordsByHourLocation .AnalyzerRangeCode = "H")

Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the
ComponentTypeCode is equal to the CurrentMHVRecord .ComponentTypeCode and the
AnalyzerRangeCode is equal to "L" AND the ComponentSerialNumber is equal to the
CurrentMHVRecord .ComponentSerialNumber (removing the phrases "HIGH", "HI", "LOW", and
"LO").

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

set Linearity Status Required == false

set DailyCalStatusRequired = false

return result C

else If (AnalyzerRangeRecordsByHourLocation is found)

Environmental Protection Agency

Page 551 of 907


-------
Draft Check Specifications

12/16/2015

Set HighRangeComponentID = CurrentMHVRecord. Component ID.

Set LowRangeComponentID = AnalyzerRangeRecordsByHourLocation. Component ID.

else if ( CurrentMHVRecord .AnalyzerRangeCode = "L")

Locate a record in AnalyzerRangeRecordsByHourLocation for the CurrentMHVRecord. Hour
where the ComponentTypeCode is equal to the CurrentMHVRecord .ComponentTypeCode and the
AnalyzerRangeCode is equal to "H" AND the ComponentSerialNumber is equal to the
CurrentMHVRecord .ComponentSerialNumber (removing the phrases "HIGH", "HI", "LOW", and

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

Set HighRangeComponentID = AnalyzerRangeRecordsByHourLocation. Component ID.

else

Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation .AnalyzerRangeCode.
if ( CurrentAnalyzerRangeUsed = "H")

Set HighRangeComponentID = CurrentMHVRecord. Component ID.

else

Set LowRangeComponentID = CurrentMHVRecord. Component 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 . SystemID to ApplicableSystemlDs .

if (MonitorSystemComponentRecordsByHourLocation is not found)

set Linearity Status Required == false

set DailyCalStatusRequired = false

return result D

'LO").

Results:

Result

Description

Severity

Environmental Protection Agency

Page 552 of 907


-------
Draft Check Specifications

12/16/2015

B

C

D

You did not report one (and only one) valid Analyzer Range record in your
monitoring plan for ComponentID [COMPID] for this hour. The QA Status
of the linearity and/or daily calibration tests for this component will not be
evaluated.

You reported that ComponentID [COMPID] is a dual-range analyzer, but you
did not report one (and only one) active low-scale [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.

You reported that ComponentID [COMPID] is a dual-range analyzer, but the
program could not identify the alternate range component in your monitoring
plan. The QA Status of the linearity and/or daily calibration tests for this
component will not be evaluated.

You did not report any System Component records for ComponentID
[compid] in your monitoring plan for the hour. The QA Status of the
linearity and/or daily calibration tests for this component will not be
evaluated.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:

1

2

3

4

5

6

7

Emissions Data Evaluation Report	C02 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	FLOW Monitor Hourly Evaluation

Emissions Data Evaluation Report	H20 Monitor Hourly Evaluation

Emissions Data Evaluation Report	NOx Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Dry Monitor Hourly Evaluation

Emissions Data Evaluation Report	02 Wet Monitor Hourly Evaluation

Emissions Data Evaluation Report	S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 553 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOURMHV-27

Check Name:	Determine MHV Measure Code

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 If ( Current MHV Parameter == "C02CSD")

Set Monitor Measure Code Array for "C02C" to "SUB"

else If ( Current MHV Parameter == "02CSD")

Set Monitor Measure Code Array for "02D" to "SUB"

Set Monitor Measure Code Array for "02W" to "SUB"

else if ( Current MHV Parameter in set \{S02C, NOXC, C02C, 02D, 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 "ME AS SUB"

Usage:

1

Emissions Data Evaluation Report —

— C02 Concentration Monitor Hourly Evaluation

2

Emissions Data Evaluation Report —

— C02C Monitor Hourly Evaluation for Substitute Data

3

Emissions Data Evaluation Report —

— FLOW Monitor Hourly Evaluation

4

Emissions Data Evaluation Report —

— H20 Monitor Hourly Evaluation

5

Emissions Data Evaluation Report —

— NOx Concentration Monitor Hourly Evaluation

6

Emissions Data Evaluation Report —

— 02 Dry Monitor Hourly Evaluation

7

Emissions Data Evaluation Report —

— 02 Wet Monitor Hourly Evaluation

8

Emissions Data Evaluation Report —

— 02C Monitor Hourly Evaluation for Substitute Data

9

Emissions Data Evaluation Report —

— S02 Monitor Hourly Evaluation

Environmental Protection Agency

Page 554 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-1

Check Name:

Validate Single Operating Data record for hour

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

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

Environmental Protection Agency	Page 555 of 907


-------
Draft Check Specifications

12/16/2015

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
return result C

else

Derived Hourly Checks Needed = true
if Current Operating Time >0.0

Unit Hourly Operational Status = true

Environmental Protection Agency

Page 556 of 907


-------
Draft Check Specifications	12/16/2015

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

April Op Time Accumulator Array for this location = April Op Time Accumulator + Current
Hourly Op Record .OperatingTime

else

April Op Time Accumulator Array for this location = Current Hourly Op Record OperatingTime

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 Op Record OperatingTime
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)

Environmental Protection Agency

Page 557 of 907


-------
Draft Check Specifications

12/16/2015

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

if Current Hourly Op Record OperatingTime > Max Unit OpTime

Max Unit OpTime = Current Hourly Op Record .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
.OperatingTime

if Current Hourly Op Record OperatingTime > Max Stack OpTime
Max Stack OpTime = Current Hourly Op Record OperatingTime

Results:

Result

A

B

C
D

Usage:
1

Description

You did not report an Hourly Operating record for the hour.

You reported more than one Hourly Operating records for the hour. There
will be no further evaluation of the reported emissions data for this hour.

The OperatingTime reported in the Hourly Operating record is invalid. This
value must be between 0 and 1. There will be no further evaluation of the
reported emissions data for this hour.

You reported an invalid Hourly Operating record. Only the units in an LME
monitoring configuration should report this record. There will be no further
evaluation of the reported emissions data for this hour.

You did not report an Hourly Operating record for the hour. Although this
was acceptable for legacy data during a non-operating quarter, it is not
allowed in ECMPS.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1
Fatal

Environmental Protection Agency

Page 558 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 559 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOUROP-2

Check Name:	Count Flow, 02, and Heat Input records

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Flow Monitor Hourly Count = count of MonitorHourlyValueData records with parameter FLOW where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

02 Wet Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND
MoistureBasis = "W" where

Current Date = MonitorHourly ValueData.Date and

Current Hour = MonitorHourly ValueData.Hour

02 Dry Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND
MoistureBasis = "D" where

Current Date = MonitorHourly ValueData.Date and

Current Hour = MonitorHourly ValueData.Hour

02 Null Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode = "02C" AND
MoistureBasis is NULL where

Current Date = MonitorHourly ValueData.Date and

Current Hour = MonitorHourly ValueData.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

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 560 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-3

Check Name:

Initialize Location Variables for the Hour

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Current Unit Is Peaking = false

Current Unit Is ARP = false

Special Fuel Burned = false

FC Factor Needed = false

FI) 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 DHV Parameter = null

Current DHV Record Valid = false

Current DHV Record = null

Current DHV Method = null

Current DHV System Type = null

Current DHVHBHA Value = null

CO 2 Cone Checks Needed for C02 Mass Calc = false

CO 2 Cone Checks Needed for Heat Input = false

CO 2 Diluent Checks Needed for NOx Rate Calc = false

02 Dry Checks Needed for Heat Input = false

02 Dry Checks Needed for NOx Rate Calc = false

02 Wet Checks Needed for Heat Input = false

02 Wet Checks Needed for NOx Rate Calc = false

CO 2 Diluent Needed for MA TS = false

02 Dry Needed for MA TS = false

02 Wet Needed for MA TS = false

Linearity Status Required = false

Environmental Protection Agency	Page 561 of 907


-------
Draft Check Specifications

12/16/2015

AppendixEStatusRequired = false

RATAStatusRequired = false

Current RA TA Status = null

CurrentHourlyRecordforRATAStatus = null

RATAStatusBAF = null

Daily Cal Status Required = false

CO 2 RATA 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

H20 DHVMODC = null

H20 MHVMODC = null

02 Dry MODC = null

02 Wet MODC = 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 Record .QualTypecode == "PK" OR Mon Qual Record .QualTypecode == "SK"
if Mon Qual Record Count > 0

Environmental Protection Agency

Page 562 of 907


-------
Draft Check Specifications

12/16/2015

Current Unit Is Peaking = true
else if Current Entity Type = "CP"
find all entries in UnitStackConfiguration table where

UnitStackConfiguration.StackPipeld = the StackPipeld for this pipe
for each matching record

set Assoc Unit = UnitStackConfiguration.Unitld

Mon Qual Record Count = Find MonitorQualification Records by Hour where
MonitoringLocationld = Assoc Unit

Mon Qual Record .QualTypecode == "PK" OR Mon Qual Record .QualTypecode == "SK"

if Mon Qual Record Count is not null

Current Unit Is Peaking = true

locate records in the UnitProgram Table where

either (a) for a unit there is a record with the location identifier for that unit, OR

(b) for a non-unit there is a record with the location identifier for a unit associated with that entity

if any records from UnitProgram table meeting these conditions exist and within those records:

PRG CD = "ARP", CLASS <> "NA", EndDate is on or after the Current Operating Date

and either a) the EmissionsRecordingDate is not null and is on or prior to the Current Operating Date or b) the
EmissionsRecordingDate is null and the UnitMonitorCertBeginDate is not null and is on or prior to the Current Operating
Date .

Current Unit Is ARP = true

Set EarliestLocationReportDate = CurrentMonitorPlanLocationRecord .EarliestReportDate

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 563 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-4

Check Name:

Verily S02 Monitor Method Active During Current Hour

Related Former Checks:
Applicability:

General Check

Specifications:

If (Derived Hourly Checks Needed)

S02 Monitor Method Record = null

SO 2 CEM Method Active For Hour = false

SO2 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

S02 Method Count = Active records in MonitoringMethodData for the location where

ParameterCode = \ldblquote S02\rdblquote 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 (SO2 Monitor Method Record. SubDataCode begins with "FSP75")

S02 Fuel Specific Missing Data = true
SO2 Bypass Code = S02 Monitor Method Record. BypassApproachCode
Expected Summary Value S02 Array for this location = true
if (SO2 Monitor Method Record. MethodCode == "CEM")

SO2 CEM Method Active For Hour = true
else if SO2 Monitor Method Record. MethodCode == "F23")

SO2 F23 Method Active For Hour = true
else if (SO2 Monitor Method Record. MethodCode == "AD")

SO2 App D Method Active For Hour = true

Environmental Protection Agency

Page 564 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result	Description	Severity

A	You have reported more than one active S02 Method record in your	Critical Error Level 1

monitoring plan for this hour.

B	You reported an invalid [param] method for a location that is part of a	Critical Error Level 1

configuration of LME units.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 565 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-5

Check Name:

Determine H20 Method

Related Former Checks:

Applicability:

Specifications:

if Derived Hourly Checks Needed
H20 Method Code = null
H20 Default Value = null
H20 Default Max Value = null
H20 Default Mitt Value = null
Current Hourly H20 Table Reference = null
H20 Fuel Specific Missing Data = false
H20 Reported Value = null

H20 Method Count = Active records in MonitoringMethodData for the location where

ParameterCode = \ldblquote H20\rdblquote
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 . AdjustedHourly Value

H20 Method Code = "MWD"

else if (H20 Derived Hourly Count == 0 AND H20 Monitor Hourly Count == 1 AND the MethodCode in one
(but not both) of the matched records is equal to "MTB" or "MMS")

Current Hourly H20 Table Reference = MonitorHourly ValueData where ParameterCode = "H20"

H20 Reported Value = Current Hourly H20 Table Reference .UnadjustedHourlyValue

if the MethodCode in the matched record == "MMS"

H20 Method Code = "MMS"

else

H20 Method Code = "MTB"

Environmental Protection Agency

Page 566 of 907


-------
Draft Check Specifications

12/16/2015

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

else

H20 Default Value = DefaultValue field from active MonitoringDefaultData record for location where

ParameterCd = 'H20'

If (H20 Default Value <= 0 OR H20 Default Value >= 100)
return result C
else if (H20 Method Code == "MWD")
if (H20 Derived Hourly Count ==1)

Current Hourly H20 Table Reference = DerivedHourlyValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Table Reference . AdjustedHourly Value
else if (H20 Method Code == "MMS" OR H20 Method Code == "MTB")
if (H20 Monitor Hourly Count ==1)

Current Hourly H20 Table Reference = MonitorHourlyValueData where ParameterCode = "H20"

Environmental Protection Agency

Page 567 of 907


-------
Draft Check Specifications

12/16/2015

H20 Reported Value = Current Hourly H20 Table Reference .UnadjustedHourlyValue

Results:

Result
A

B

C

Usage:

1

Description

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.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

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

Environmental Protection Agency

Page 568 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-6

Check Name:

Verily NOx Rate Monitor Method

Related Former Checks:
Applicability:

General Check

Specifications:

If (Derived Hourly Checks Needed)

NOx Rate Bypass Code = null
NOx Rate Fuel Specific Missing Data = false
Current NOx Rate Monitor Method Record = null
Current NOx Rate Method Code = null

NOx Rate Method Count = Active records in MonitoringMethodData for the location where

ParameterCode = \ldblquote NOXR\rdblquote
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 Record. MethodCode
NOx Rate Bypass Code = Current NOx Rate Monitor Method Record BypassApproachCode
if ( Current NOx Rate Monitor Method Record .SubDataCode begins with "FSP75")

NOx Rate Fuel Specific Missing Data = true

If ( Current Unit is ARP == true)

Expected Summary Value NOx Rate Array for this location = true

Results:

Result

Description

Severity

A

You reported more than one active NOXR Method record in your monitoring Critical Error Level 1
plan for this hour.

You reported a [param] method, which is not valid for a location that is part Critical Error Level 1
of a configuration of LME units.

B

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 569 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 570 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-7

Check Name:

Verily NOx Mass Monitor Method Record

Related Former Checks:
Applicability:

CEM Check

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 = \ldblquote NOX\rdblquote 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. MethodCode
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 BypassApproachCode
if ( Current NOx Mass Monitor Method Record .SubDataCode begins with "FSP75")

NOx Mass Fuel Specific Missing Data = true
if (NOx Mass Monitor Method Record. MethodCode == "CEM" OR

NOx Mass Monitor Method Record. MethodCode == "NOXR" OR
NOx Mass Monitor Method Record. 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

Environmental Protection Agency	Page 571 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result	Description	Severity

A	You reported more than one active NOX Method record in your monitoring Critical Error Level 1

plan for this hour.

B	You reported an invalid [param] method for a location that is part of a	Critical Error Level 1

configuration of LME units.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 572 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-8

Check Name:

Verily C02 Method Active During Current Hour

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (Derived Hourly Checks Needed)

C02 Monitor Method Record = null

CO 2 CEM Method Active For Hour = false

CO2 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 = \ldblquote C02\rdblquote or "C02M"
if ( CO2 Method Count > 1)

return result A
else if CO2 Method Count == 1

CO2 Monitor Method Record = the single matched record
CO2 Method Code = C02 Monitor Method Record .MethodCode
if (LME HI Method is not null and CO2 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 ( CO2 Monitor Method Record. MethodCode == "AD")

CO2 App D Method Active For Hour = true
Expected Summary Value C02 Array for this location = true

Results:

Result

Description

You have reported more than one active C02 Method record in your
monitoring plan for this hour.

Severity

A

Critical Error Level 1

Environmental Protection Agency

Page 573 of 907


-------
Draft Check Specifications	12/16/2015

B	You reported an invalid [param] method for a location that is part of a	Critical Error Level 1

configuration of LME units.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 574 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-9

Check Name:

Verily Heat Input Method Active During Current hour

Related Former Checks:
Applicability:

General Check

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 \ldblquote HI\rdblquote
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. MethodCode <> "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

Environmental Protection Agency

Page 575 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

Description

You have reported more than one active HI Method record in your
monitoring plan for this hour.

You did not report an HIT Method record for this location in your monitoring
plan, which is required for all locations that are part of a configuration of
LME units.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 576 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-17

Check Name:

Verily Single S02 Derived Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (Derived Hourly Checks Needed == true)

SO 2 Derived Checks Needed = false
S02M Derived Checks Needed = false
Current S02 Derived Hourly Record = null
F23 Default Max Value = null
F23 Default Min Value = null
F23 Default Value = null

SO2 Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "S02" or "S02M" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op Record .OperatingTime > 0

If ( SO2 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 if ( SO2 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 ( SO2 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 ( SO 2 Derived Hourly Count > 0 AND SO 2 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

else

return result A

Environmental Protection Agency

Page 577 of 907


-------
Draft Check Specifications

12/16/2015

Rpt Period S02 Mass Calculated Accumulator Array for the location = -1

return result G

Else if ( SO2 Derived Hourly Count ==1)

Current S02 Derived Hourly Record = DerivedHourlyValueData rec matching with param S02 or S02M where
Current Date = DerivedHourlyValueData.Date and Current Hou r = DerivedHourlyValueData.Hour

If (LME HI Method is not null)

If ( S02 Method Code == "LME")

If ( Current S02 Derived Hourly Record .ParameterCode == "S02M")

S02M Derived Checks Needed = true

else

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
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 .ParameterCode == "S02M")

Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result H

else

SO2 Derived Checks Needed = true

If (S02 Method Code in set \{CEMF23,AMS\})

if ( S02 Method Code == "CEMF23")

SO2 CEM Method Active For Hour = true

if ( Current S02 Derived Hourly Record .Formulaldentifier is not null)

S02 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current S02 Derived Hourly Record.
F ormulaldentifier

If (S02 Formula Record is not null)

If (S02 Formula Record.ParameterCode == "S02")

if ( S02 Method Code == "CEMF23")

Environmental Protection Agency

Page 578 of 907


-------
Draft Check Specifications

12/16/2015

If (S02 Formula Record.EquationCode == "F-23")

SO 2 F23 Method Active For Hour = true

SO2 CEM Method Active For Hour = false

if ( S02 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	Description	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	Critical Error Level 1

active S02 method record in your monitoring plan for the hour.

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

use in F23 calculation for the hour.

E	The DefaultValue reported in the active S02R F23 default record in your	Critical Error Level 1

Environmental Protection Agency

Page 579 of 907


-------
Draft Check Specifications

12/16/2015

F
G
H

monitoring plan is invalid.

You reported a DHV record for S02 (or S02M), but this is not appropriate
for a non-operating hour.

You reported a DHV record for [param], but you did not report any Hourly
Fuel Flow records at the location.

The ParameterCode reported in the DHV record does not match the
ParameterCode in the Method record in your monitoring plan used to
determine [eparam].

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 580 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-18

Check Name:

Verily Single S02 Concentration record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current S02 Monitor Hourly Record = null

SO 2 Monitor Hourly Count = count of MonitorHourly ValueDate records with param "S02C" where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

If Unit Hourly Operational Status = true

If ( S02 Monitor Hourly Count >0 AND S02 CEM Method Active For Hour == false AND MATS S02C Needed == false
)

\tab Return result A
Else if ( SO2 Monitor Hourly Count >1)

\tab Return result B
Else if ( S02 Monitor Hourly Count == 1 )

\tab Current S02 Monitor Hourly Record = MonitorHourlyValueData rec with param S02C where
\tab CurrentDate = MonitorHourlyValueData.Date and
CurrentHour = MonitorHourlyValueData.Hour
Else

if ( SO2 Monitor Hourly Count > 0)
return result C

Results:

Result

Description

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.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

You reported an MHV record for S02C, but this is not appropriate for a non- Critical Error Level 1
operating hour.

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 581 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOUROP-19

Check Name:	Verily Single NOx Concentration Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 Current NOx Cone Monitor Hourly Record = null

NOx Cone Monitor Hourly Count = count of MonitorHourly ValueDate records with param "NOXC" where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

if Unit Hourly Operational Status = true

if (NOx Cone Monitor Hourly Count >1)

\tab 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
\tab CurrentDate = MonitorHourlyValueData.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

Usage:

1

Description

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.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 582 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 583 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-20

Check Name:

Related Former Checks:

Verily Single NOx Rate Derived Hourly Record

Applicability:
Specifications:

CEM Check

If (Derived Hourly Checks Needed == true)

\tab NOx Rate Derived Checks Needed = false

NOx Rate Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "NOXR" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
\tab If Current Hourly Op Record OperatingTime > 0
If (NOx Rate Derived Hourly Count == 0 AND Current NOx Rate Method Code is not null)
\tab 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
\tab 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
\tab Return result C

Else if (NOx Rate Derived Hourly Count ==1)

Current NOx Rate Derived Hourly Record = DerivedHourly ValueData rec matching param NOXR
NOx Rate Derived Checks Needed = true

Apportionment NOX R Method Array at this location = Current NOx Rate Method Code
If ( Current NOx Rate Method Code == "AMS")

if ( Current NOx Rate Derived Hourly Record .Formulaldentifier is null)

NOXR Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current NOx Rate Derived Hourly Record. Formulaldentifier
If (NOXR Formula Record is not null)

if Current NOx Rate Derived Hourly Record MODCCode is not null)

Current NOx Rate Method Code = "CEM"

else

Environmental Protection Agency

Page 584 of 907


-------
Draft Check Specifications

12/16/2015

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,19-4,19-5,19-5D,19-6,19-7,19-8,19-

9\})

1 tab Current NOx Rate Method Code = "CEM"

else

If NOx Rate Derived Hourly Count > 0
\tab Return result D

Results:

Result

A

B

C
D

Description

You did not report a DHV record for NOXR for the hour.

You reported a DHV record for NOXR, but you did not report an active
NOXR method record in your monitoring plan for the hour.

You reported more than one DHV record for NOXR for the hour.

You reported a DHV record for NOXR, but this is not appropriate for a non-
operating hour.

This check result is obsolete.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

No Errors

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 585 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-21

Check Name:

Verily Single NOx Mass Derived Hourly Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (Derived Hourly Checks Needed == true)

NOx Mass Derived Checks Needed = false
NOXM Derived Checks Needed = false
Current NOx Mass Derived Hourly Record = null

NOx Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "NOX" or "NOXM"

If Current Hourly Op Record .OperatingTime > 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 == "A E " AND Hourly Fuel
Flow Count for Gas + Hourly Fuel Flow Count for Oil == 0)

Rpt Period NOx Mass Reported Accumulator Array for the location = -1

Rpt Period NOx Mass Calculated Accumulator Array for the location = -1

Return result E

Else if (NOx Mass Derived Hourly Count ==1)

Current NOX Mass Derived Hourly Record = DerivedHourly ValueData rec matching with param NOX or
NOXM where Current Date = DerivedHourly ValueData.Date and Current Hour = DerivedHourly ValueData.Hour

If (LME HI Method is not null)

where

Current Date = DerivedHourly ValueData.Date and

Current Hour = DerivedHourly ValueData.Hour

Environmental Protection Agency

Page 586 of 907


-------
Draft Check Specifications

12/16/2015

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
retunr result F

else

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1

else

if ( Current NOX Mass Derived Hourly Record ParameterCode == "NOXM")

Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
retunr result F

else

NO x M ass 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 .Formulaldentifier 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)

If (NOX Formula Record.ParameterCode == "NOX" AND NOX Formula
Record.EquationCode in set \{F-26A,F-26B\})

NOx Mass Monitor Method Code = "CEM"

Apportionment NOX Method Array at this location = NOx Mass Monitor Method Code

else

If NOx Mass Derived Hourly Count > 0

Environmental Protection Agency

Page 587 of 907


-------
Draft Check Specifications

12/16/2015

Return result D

Results:

Result

A

B

C
D

Usage:
1

Description

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

Emissions Data Evaluation Report	Operating Hour 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

Environmental Protection Agency

Page 588 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOUROP-22

Check Name:	Verily Single C02 Mass Derived Hourly Value Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

If (Derived Hourly Checks Needed == true)

CO 2 Mass Derived Checks Needed = false
Current C02 Mass Derived Hourly Record = null
C02M Derived Checks Needed = false

C02 Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode beginning with "C02"
where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op Record .OperatingTime > 0

If ( CO2 Mass Derived Hourly Count == 0 AND CO2 Method Code is not null AND CO2 Method Code <> "FSA")
If ( C02 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 ( 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 ( CO 2 Mass Derived Hourly Count > 0 AND CO 2 Method Code == "A D " 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)

Environmental Protection Agency	Page 589 of 907


-------
Draft Check Specifications

12/16/2015

Else

Current C02 Mass Derived Hourly Record = DerivedHourlyValueData rec matching with param C02 or C02M
where Current Date = DerivedHourlyValueData.Date and Cur rent Hou r = DerivedHourlyValueData.Hour

If (LME HI Method is not null)

If ( C02 Method Code == "LME")

if ( Current C02 Mass Derived Hourly Record .ParameterCode == "C02M")

C02M Derived Checks Needed = true

else

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

CO2 M ass Derived Checks Needed = true

If ( C02 Method Code == "AMS")

if ( Current C02 Mass Derived Hourly Record .Formulaldentifier 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"

CO2 CEM Method Active For Hour = true

If CO2 Mass Derived Hourly Count > 0
Return result D

Environmental Protection Agency

Page 590 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result

A

B

C
D

E

F

Usage:
1

Description

You did not report a DHV record for C02 (or C02M) for the hour.

You reported a DHV record for C02 (or C02M), but you did not report an
active C02 (or C02M) method record in your monitoring plan for the hour.

You reported more than one DHV records for C02 (or C02M) for the hour.

You reported a DHV record for C02 (or C02M), 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].

Emissions Data Evaluation Report	Operating Hour 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

Environmental Protection Agency

Page 591 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-23

Check Name:

Verily C02 Cone Derived and Monitor Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

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

C02 Cone Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "C02C" where

Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourlyValueData.Hour

CO2 Cone Monitor Hourly Count = count of MonitorHourly ValueData records with ParameterCode =
"C02C" where

Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour

Total C02 Cone Records = C02 Cone Derived Hourly Count + CO2 Cone Monitor Hourly Count
If ( Current Hourly Op Record .OperatingTime > 0)

If (( CO 2 Cone Checks Needed for Heat Input == true ) OR ( CO 2 Diluent Checks Needed for NOx Rate Calc == true )
OR ( CO 2 Diluent Needed for MATS == true) OR ( CO 2 Cone Checks Needed for C02 Mass Calc = = true ))

If (( CO 2 Cone Monitor Hourly Count == 0 ) AND (( CO 2 Cone Checks Needed for Heat Input == true ) OR ( CO 2
Diluent Checks Needed for NOx Rate Calc == true ) OR ( CO 2 Diluent Needed for MATS == true)))

return result B

else if ( Total C02 Cone Records == 0)

return result A

else if (( CO2 Cone Monitor Hourly Count == 2 ) AND ( CO2 Cone Derived Hourly Count == 0 ) AND (( CO2
Diluent Checks Needed for NOx Rate Calc == true ) OR ( CO 2 Diluent Needed for MATS == true)) AND (( CO 2
Cone Checks Needed for Heat Input == true ) OR ( CO 2 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

Environmental Protection Agency

Page 592 of 907


-------
Draft Check Specifications

12/16/2015

Current C02 Cone Missing Data Monitor Hourly Record = Find MonitorHourlyValueData records with
ParameterCode = "C02C" and MODCCode not in set \{01, 02, 03, 04, 54\} where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.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 ( CO2 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 .Formula Id Key is not null)

C02C Formula record = Find MonitoringFormulaData record where

MonitoringFormulalDKey = Current C02 Cone Derived Hourly Record .Formula Id Key
If ( C02C Formula record is not null)

If ( C02C Formula record .ParameterCode == "C02C")

If (C02C Formula record.EquationCode == "F-14A")

02 Dry Needed to Support C02 Calculation = true
else if (C02C Formula record.EquationCode == "F-14B")

02 Wet Needed to Support C02 Calculation = true
Moisture Needed = true
else if ( CO2 Cone Monitor Hourly Count ==1)

CO2 Cone Monitor Checks Needed = true

Current C02 Cone Monitor Hourly Record = matching MonitorHourlyValueData rec

else

If ( Total C02 Cone Records > 0)

Return result D

Environmental Protection Agency

Page 593 of 907


-------
Draft Check Specifications

12/16/2015

else

If ( Total C02 Cone Records > 0)
Return result E

Results:

Result	Description

A	You did not report a MHV or DHV record for C02C for the hour.

B	You did not report an MHV record for C02C for the hour.

C	You reported more than one MHV and/or DHV records for C02C for the

hour.

D	You reported a MHV or DHV record for C02C, but this record is not

required to calculate emissions.

E	You reported a MHV or DHV record for C02C, but this is not appropriate

for a non-operating hour.

Usage:

1	Emissions Data Evaluation Report	Unit-Level Evaluation

Severity

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

Non-Critical Error

Critical Error Level 1

Environmental Protection Agency

Page 594 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-24

Check Name:

Count Hourly Fuel Flow Records

Related Former Checks:
Applicability:

General Check

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

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 .LocationName begins with "CP")

CP Fuel Count = CP Fuel Count + Hourly Fuel Flow Count
If ( Current Hourly Op Record .OperatingTime== 0)

If (Hourly Fuel Flow Count > 0)

\tab Return result A

else

if (Appendix D Method Active = true AND Hourly Fuel Flow Count == 0 AND MP Pipe Config for Hourly Checks
Environmental Protection Agency	Page 595 of 907

Current Date = DerivedHourlyValueData.Date and

Current Hour = DerivedHourlyValueData.Hou r


-------
Draft Check Specifications

12/16/2015

is null)

Return result B

else if (Appendix D Method Active = false AND Hourly Fuel Flow Count > 0)
return result C

Results:

Result
A

B
C

D

Usage:

1

Description

You reported an HFF record, but this is not appropriate for a non-operating
hour.

You did not report an HFF record for the hour.

You reported a HFF record, but you did not report an active AD or AE
method record in your monitoring plan for the hour.

The FuelCode reported in the HFF record is missing or invalid.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 596 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-30

Check Name:

Determine Load Based Status of unit

Related Former Checks:
Applicability:

General Check

Specifications:

\ucl

\fs20 Unit is Load Based = false

Location Name = Current Monitor Plan Location Record LOCATION NAME

if the Location Name begins with "CS" or "CP" or "MS" or "MP"

Locate all Unit Stack Configuration records where the stack/pipe location is the monitoring location, the BeginDate is on or
before the Current Date, and the EndDate is null or is on or after the Current Date.

If the NonLoadBasedlndicator in all of the retrieved records is equal to 1,

Unit is Load Based = false

else

Unit is Load Based = true
else // current location is a unit
if the NonLoadBasedlndicator field for the unit = 1
Unit is Load Based = false

else

Unit is Load Based = true

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 597 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-32

Check Name:

Perform Load Checks for Operating Hour

Related Former Checks:
Applicability:

General Check

Specifications:

if ( Current Hourly Op Record is not null)

Apportionment OpTime Array for this location = Current Hourly Op Record .OperatingTime
Apportionment Load Array for this Location = Current Hourly Op Record .HourlyLoad
if ( Unit is Load Based == true and Current Hourly Op Record .OperatingTime >0.0)

if ( Current Hourly Op Record .HourLoad is null OR Current Hourly Op 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 (MP Stack 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 OperatingTime)
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 OperatingTime)

else

if ( Stack LoadTimesOpTime Accumulator >= 0)

Stack LoadTimesOpTime Accumulator = Stack LoadTimesOpTime Accumulator +

( Current Hourly Op Record HourLoad * Current Hourly Op Record OperatingTime)
if Current Hourly Op Record. LoadUnitsOfMeasureCode not in \{"MW","KLBHR", "MMBTUHR"\}

else

Environmental Protection Agency

Page 598 of 907


-------
Draft Check Specifications

12/16/2015

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

MP Load UOM= "INVALID"

return result C

else

if (MP Load UOM is null)

MP Load UOM= Current Hourly Op Record. LoadUnitsOfMeasureCode

Locate the MonitorLoadRecordsByHourandLocation record for the hour and location.

If (only one record is found AND MonitorLoadRecordByHourandLocation. MaximumLoadValue is greater
than 0),

If ( Current Hourly Op Record. LoadUnitsOfMeasureCode ==
MonitorLoadRecordByHourandLocation. MaximumLoadUnitsOfMeasureCode)

If ( Current Hourly Op Record .HourLoad is greater than
MonitorLoadRecordByHourandLocation .MaximumLoadValue)

return result H

else if ( Current Hourly Op Record .HourLoad == 0)

If ( Current Hourly Op Record. LoadRange is greater than or equal to 2 OR Current Hourly
Op Record. CommonStackLoadRange is greater than or equal to 2)

If ( Current Entity Type <> "Unit" OR (MP Stack Config for 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. LoadUnitsOfMeasureCode 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

Environmental Protection Agency

Page 599 of 907


-------
Draft Check Specifications

12/16/2015

if Current Hourly Op Record. LoadUnitsOfMeasureCode is not null
return result G

Results:

Result
A

B

C

D

E

F

G

H

Description

The HourLoad reported in the Hourly Operating record is invalid. The value
must be greater than or equal to 0.

The LoadUnitsOfMeasureCode reported in the Hourly Operating record is
invalid.

You did not report the same LoadUnitsOfMeasureCode for all locations in
the configuration.

You reported HourLoad in the Hourly Operating record. This field should be
blank for a non-operating hour.

You reported a LoadUnitsOfMeasureCode in the Hourly Operating record.
This field should be blank for a non-operating hour.

You reported HourLoad in the Hourly Operating record. This field should be
blank for a non-load-based unit.

You reported a LoadUnitsOfMeasureCode in the Hourly Operating record.
This field should be blank for a non-load-based unit.

Warning: The HourLoad reported in the Hourly Operating Data record is
higher than the MaximumLoadValue in the Monitoring Load record reported
in your monitoring plan. Sources are required to periodically (at least once
annually) evaluate the appropriateness of these maximum values in the
monitoring plan and make proper adjustments when necessary. You should
investigate the cause of these exceedances and determine whether an
adjustment to the MaximumLoadValue in your monitoring plan is necessary.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Informational Message

I
J
K

The [fieldname] does not correspond to the MaximumLoadUnitsOfMeasure
reported in the monitoring plan.

You did not have one and only one valid Monitor Load record that was active
during the hour.

The LoadRange or CommonStackLoadRange reported in the Hourly
Operating record is inconsistent with the HourLoad. When no load is
generated, the load range should be less than 2.

You reported an HourLoad in the Hourly Operating Data record that is 125%
or greater than the MaximumLoadValue in the Monitoring Load record
reported in your monitoring plan.

Critical Error Level 2

Critical Error Level 1

Informational Message

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 600 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-33

Check Name:

Related Former Checks:

Check reported Fuel Code for Operating Hour

Applicability:
Specifications:

General Check

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 SO2 Fuel
Specific Missing Data == true OR CO2 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

if ( Current S02 Monitor Hourly Record is not null AND SO2 Bypass Code == "BYMAXFS")
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 == "BYMAXFS")
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 == "BYMAXFS")
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 .OperatingTime is greater than 0)
return result A

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 <> "BYMAXFS" AND NOx Rate Bypass Code <> "BYMAXFS" AND NOx Mass Bypass Code
<> "BYMAXFS")

else

else

Environmental Protection Agency

Page 601 of 907


-------
Draft Check Specifications

12/16/2015

return result C

Results:

Result
A
B
C

Usage:
1

Description

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.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

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

Environmental Protection Agency

Page 602 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-34

Check Name:

Validate Reported FC Factor

Related Former Checks:
Applicability:

General Check

Specifications:

if FC Factor Needed = true

Valid FC Factor Exists = false

if ( Current Hourly Op Record .FcFactor is null)

return result A
else if ( Current Hourly Op Record .FcFactor <= 0)

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 A

else

return result B

Results:

Result

Description

Severity

A

The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1

The [FNAME] reported in the Hourly Operating record is outside of the	Critical Error Level 2

expected range from [MIN] to [MAX],

B

Usage:
1

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 603 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-35

Check Name:

Validate Reported FD Factor

Related Former Checks:

Applicability:

Specifications:

if FD Factor Needed = true

Valid FD Factor Exists = false

if ( Current Hourly Op Record .FdFactor is null)

return result A
else if ( Current Hourly Op Record .FdFactor <= 0)
return result A

V alid 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 .FdFactor > FD Factor Maximum OR Current Hourly Op Record .FdFactor < FD
Factor Minimum)

else

return result B

Results:

Result

Description

Severity

A

The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1

The [FNAME] reported in the Hourly Operating record is outside of the	Critical Error Level 2

expected range from [MIN] to [MAX],

B

Usage:
1

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 604 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-36

Check Name:

Validate Reported FW Factor

Related Former Checks:
Applicability:

General Check

Specifications:

if FW Factor Needed = true

Valid FW Factor Exists = false

if ( Current Hourly Op Record .FwFactor is null)

return result A
else if ( Current Hourly Op Record .FwFactor <= 0)

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 .FwFactor <
FW Factor Minimum)

return result A

else

return result B

Results:

Result

Description

Severity

A

The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1

The [FNAME] reported in the Hourly Operating record is outside of the	Critical Error Level 2

expected range from [MIN] to [MAX],

B

Usage:
1

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 605 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-37

Check Name:

Verily Single Heat Input Derived Hourly Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current Heat Input Derived Hourly Record = null
Heat Input Derived Checks Needed = false
HIT Derived Checks Needed = false

Heat Input Derived Hourly Count = # of DerivedHourlyValueData record with parameter beginning with "HI" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op Record .OperatingTime > 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 = DerivedHourlyValueData record with parameter "HI" or "HIT" where

Current Date = DerivedHourlyValueData.Date and

Environmental Protection Agency

Page 606 of 907


-------
Draft Check Specifications

12/16/2015

Current Hour = DerivedHourlyValueData.Hour
If (LME HI Method is not null)

if ( Current Heat Input Derived Hourly Record .ParameterCode == "HIT")

HIT Derived Checks Needed = true

else

Rpt Period HI Reported Accumulator Array for the location = -1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result E

else

if ( Current Heat Input Derived Hourly Record ParameterCode == "HIT")

Rpt Period HI Reported Accumulator Array for the location = -1
Rpt Period HI Calculated Accumulator Array for the location = -1
return result E

else

Heat Input Derived Checks Needed = true

If (Heat Input Method Code == "AMS")

if ( Current Heat Input Derived Hourly Record .Formulaldentifier is not null)

HI Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current Heat Input Derived Hourly Record.
F ormulaldentifier

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

Description

You did not report a DHV record for HI (or HIT) for the hour. If you have
entered LME data via the LME Emissions Data Utility, this error indicates
that you have not yet generated your quarterly emissions data. You must do
this by clicking on the Generate Emissions Data link on the LME Emissions
Data Utility submenu.

Severity

Critical Error Level 1

Environmental Protection Agency

Page 607 of 907


-------
Draft Check Specifications

12/16/2015

B

C
D

You reported a DHV record for HI (or HIT), but, according to the monitoring
methods in your monitoring plan, you should not report hourly heat input at
this location.

You reported more than one DHV record for HI (or HIT) for the hour.

You reported a DHV record for HI (or HIT), but this is not appropriate for a
non-operating hour.

The ParameterCode reported in the DHV record does not match the
ParameterCode in the Method record in your monitoring plan used to
determine [eparam].

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 608 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-38

Check Name:

Related Former Checks:

Determine Fuel Type

Applicability:
Specifications:

General Check

If (Derived Hourly Checks Needed == true)

If Current Hourly Op Record FcFactor is not null OR Current Hourly Op Record FdFactor is not null OR Current Hourly
Op Record .FwFactor is not null

If (Hourly Fuel Flow Count For Oil + Hourly Fuel Flow Count For Gas == 0)

If (Current Hourly Op Record .FuelCd is null OR Current Hourly Op Record .FuelCd == "MIX")
Count all active UnitFuel records for the location where

FuelCd in set \{OOL, PRG, PRS, OGS\}

If count > 0

Special Fuel Burned = true
else if Current Hourly Op Record .UnitFuelCd in set \{OOL, PRG, PRS, OGS\}

Special Fuel Burned = true

Usage:
1

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 609 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-39

Check Name:

Verily Single H20 Cone Derived or Monitor Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 H20 Monitor Hourly Checks Needed = false
H20 Derived Hourly Checks Needed = false
Current H20 Monitor Hourly Record = null
Current H20 Derived Hourly Record = null
02 Wet Checks Needed for H20 = false
02 Dry Checks Needed for H20 = false
If Current Hourly Op Record .OperatingTime >0.00
If ( Moisture Needed == true)

If H20 Monitor Hourly Count + H20 Derived Hourly Count == 0
If (H20 Method Code == "MWD")

return result A
Else if (H20 Method Code <> "MDF")

return result B
Else if H20 Default Max Value is not null
return result C
Else if (H20 Derived Hourly Count > 1)

return result D
Else if (H20 Monitor Hourly Count > 1)
return result E

Else if (H20 Derived Hourly Count == 1 AND H20 Method Code in set \{MTB, MMS\})
return result F

Else if (H20 Monitor Hourly Count == 1 AND H20 Method Code in set \{MWD, MDF\})

return result G
Else if (H20 Monitor Hourly Count == 1)

Current H20 Monitor Hourly Record = MonitorHourlyValueData record matching with ParameterCode = "H20"

where

Current Date = MonitorHourlyValueData.Date and

Environmental Protection Agency

Page 610 of 907


-------
Draft Check Specifications

12/16/2015

Current Hour = MonitorHourlyValueData.Hour
H20 Monitor Hourly Checks Needed = true
Else if (H20 Derived Hourly Count ==1)

Current H20 Derived Hourly Record = DerivedHourlyValueData rec matching where
DerivedHourlyValueData.ParameterCode = "H20" AND
DerivedHourlyValueData.Date = Current Date AND
DerivedHourlyValueData.Hour = Current Hour
H20 Derived Hourly Checks Needed = true

if ( Current H20 Derived Hourly Record .ModcCode in set \{01, 02, 03, 04, 05, 21, 53, 54\} AND Current H20
Derived Hourly Record. Formulaldentifier is not null)

H20 Formula Record = MonitorFormulaData record where

MonitorFormulaData.FormulalD = Current H20 Derived Hourly Record. Formulaldentifier

If (H20 Formula Record is not null)

If (H20 Formula Record .ParameterCode == "H20" AND H20 Formula Record.EquationCode in set
\{F-31, M-1KA})

02 Wet Checks Needed for H20 = true

02 Dry Checks Needed for 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	Description	Severity

A	You did not report a DHV record for H20 for the hour.	Critical Error Level 1

B	You did not report an MHV record for H20 for the hour.	Critical Error Level 1

C	You did not report a DHV record for H20 for the hour. You must report this Critical Error Level 1

record if you have multiple H20 default values for different fuels.

D	You reported more than one DHV record for H20 for the hour.	Critical Error Level 1

E	You reported more than one MHV record for H20 for the hour.	Critical Error Level 1

F	You reported a DHV record for H20, but the H20 MethodCode is not	Critical Error Level 1

"MWD" or "MDF".

G	You reported a MHV record for H20, but the H20 MethodCode is not	Critical Error Level 1

"MTB" or "MMS".

H	You reported a DHV and/or MHV record for H20, but this record is not	Informational Message

Environmental Protection Agency

Page 611 of 907


-------
Draft Check Specifications

12/16/2015

required to calculate emissions.

I	You reported a DHV and/or MHV record for H20, but this is not appropriate Critical Error Level 1

for a non-operating hour.

Usage:

1	Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 612 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-40

Check Name:

Related Former Checks:

Verily Single 02 Dry Monitor Hourly Value Record

Applicability:
Specifications:

CEM Check

\ucl

\fs20 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 .OperatingTime >0.00

If (( 02 Dry Checks Needed for Heat Input == true ) OR ( 02 Dry Checks Needed for NOx Rate Calc == true ) OR ( 02
Dry Checks Needed To Support C02 Calculation == true ) OR ( 02 Dry Checks Needed for H20 == true ) OR ( 02 Dry
Needed for MATS == true))

If (( 02 Dry Monitor Hourly Count == 0 ) AND (( 02 Wet Checks Needed for Heat Input == true ) OR ( 02 Wet
Checks Needed for NOx Rate Calc == true ) OR ( 02 Wet Checks Needed To Support C02 Calculation == true ) OR
( 02 Wet Checks Needed for H20 == true ) OR ( 02 Wet Needed for MATS == true)))

return result A

Else if ( 02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count == 0)

Return result B

Else if (( 02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count > 2) OR ( 02 Dry Monitor Hourly Count
+ 02 Null Monitor Hourly Count == 2 AND 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 2))

Return result C

Else if ( 02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count == 2)

If ( 02 Dry Checks Needed for Heat Input == true AND ( 02 Dry Checks Needed for NOx Rate Calc == true OR
02 Dry Checks Needed for H20 == true) OR ( 02 Dry Needed for MATS == true))

Current 02 Dry Monitor Hourly Record = Find MonitorHourlyValueData records with ParameterCode =
"02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and MODCCode in set \{01, 02, 03, 04, 53,
54\} where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

Current 02 Dry Missing Data Monitor Hourly Record = Find MonitorHourlyValueData records with
ParameterCode = "02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and MODCCode not in set
\{01, 02, 03, 04, 54\} where

Current Date = MonitorHourlyValueData.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

Environmental Protection Agency

Page 613 of 907


-------
Draft Check Specifications

12/16/2015

else

02 Dry Monitor Hourly Checks Needed = true

else

return result C
Else if ( 02 Dry Monitor Hourly Count ==1)

02 Dry Monitor Hourly Checks Needed = true

Current 02 Dry Monitor Hourly Record = MonitorHourlyValueData record with ParameterCode = "02C" AND
MoistureBasis = "D" where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

Else if ( 02 Null Monitor Hourly Count ==1)

02 Dry Monitor Hourly Checks Needed = true

Current 02 Dry Monitor Hourly Record = Current 02 Null Monitor Hourly Record

else

If ( 02 Dry Monitor Hourly Count > 0)

Return result D

If (( 02 Null Monitor Hourly Count > 0 ) AND ( 02 Wet Checks Needed for Heat Input == false ) AND ( 02 Wet
Checks Needed for NOx Rate Calc == false ) AND ( 02 Wet Checks Needed To Support C02 Calculation == false )
AND ( 02 Wet Checks Needed for H20 == false ) AND ( 02 Wet Needed for MATS == 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

C

D

E
F

Description

You did not report a MHV record for 02C with a MoistureBasis of D for the
hour.

You did not report a MHV record for 02C with a MoistureBasis of D (or
blank) for the hour.

You reported too many MHV records for 02C with a MoistureBasis of D (or
blank) for the hour.

You reported an MHV record for 02C with a MoistureBasis of [basis], but
this record is not required to calculate emissions.

You reported an MHV record for 02C with a blank MoistureBasis, but this
record is not required to calculate emissions.

You reported a MHV record for 02C, but this is not appropriate for a non-
operating hour.

Severity

Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Non-Critical Error
Critical Error Level 1

Usage:

Environmental Protection Agency

Page 614 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 615 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-41

Check Name:

Verily Single 02 Wet Monitor Hourly Value Record

Related Former Checks:
Applicability:

CEM Check

Specifications:

\ucl

\fs20 Current 02 Wet Monitor Hourly Record = null

Current 02 Wet Missing Data Monitor Hourly Record = null

02 Wet Monitor Hourly Checks Needed = false

If Current Hourly Op Record .OperatingTime >0.00

If (( 02 Wet Checks Needed for Heat Input == true ) OR ( 02 Wet Checks Needed for NOx Rate Calc == true ) OR ( 02
Wet Checks Needed To Support C02 Calculation == true ) OR ( 02 Wet Checks Needed for H20 == true ) OR ( 02 Wet
Needed for MATS == true))

If (( 02 Wet Monitor Hourly Count == 0 ) AND (( 02 Dry Checks Needed for Heat Input == true ) OR ( 02 Dry
Checks Needed for NOx Rate Calc == true ) OR ( 02 Dry Checks Needed To Support C02 Calculation == true ) OR
( 02 Dry Checks Needed for H20 == true) OR ( 02 Dry Needed for MATS == true)))

return result A

Else if ( 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 0)

Return result B

Else if ( 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count > 2)

Return result C

Else if ( 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 2

If (( 02 Wet Checks Needed for Heat Input == true ) AND ( 02 Dry Monitor Hourly Count + 02 Null
Monitor Hourly Count <> 2 ) AND (( 02 Wet Checks Needed for NOx Rate Calc == true ) OR ( 02 Wet
Checks Needed for H20 == true) OR ( 02 Wet Needed for MATS == true)))

Current 02 Wet Monitor Hourly Record = Find MonitorHourlyValueData records with ParameterCode
= "02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and MODCCode in set \{01, 02, 03, 04,
53, 54\} where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

Current 02 Wet Missing Data Monitor Hourly Record = Find MonitorHourlyValueData records with
ParameterCode = "02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and MODCCode not in
set \{01, 02, 03, 04, 54\} where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

If ( Current 02 Wet Monitor Hourly Record is null OR Current 02 Wet Missing Data Monitor Hourly
Record is null)

return result C

Environmental Protection Agency

Page 616 of 907


-------
Draft Check Specifications

12/16/2015

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 = MonitorHourlyValueData record with ParameterCode = "02C"
AND MoistureBasis = "W" where

Current Date = MonitorHourlyValueData.Date and

Current Hour = MonitorHourlyValueData.Hour

Else if ( 02 Null Monitor Hourly Count ==1)

02 Wet Monitor Hourly Checks Needed = true

Current 02 Wet Monitor Hourly Record = Current 02 Null Monitor Hourly Record

else

If ( 02 Wet Monitor Hourly Count > 0)

Return result D

Results:

Result

Description

Severity

A

You did not report a MHV record for 02C with a MoistureBasis of W for the Critical Error Level 1
hour.

You did not report a MHV record for 02C with a MoistureBasis of W (or	Critical Error Level 1

blank) for the hour.

You reported too many MHV records for 02C with a MoistureBasis of W (or Critical Error Level 1
blank) for the hour.

You reported an MHV record for 02C with a MoistureBasis of [basis], but Non-Critical Error
this record is not required to calculate emissions.

B

C

D

Usage:
1

Emissions Data Evaluation Report	Unit-Level Evaluation

Environmental Protection Agency

Page 617 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

HOUROP-42

Check Name:

Verily Single S02R Derived Hourly Data Record

Related Former Checks:
Applicability:

CEM Check

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 = DerivedHourlyValueData.Hour
\tab If Current Hourly Op Record OperatingTime > 0

If ( S02R Derived Hourly Count == 0 AND F23 Default Max Value is not null)

Return result A

Else if ( S02R Derived Hourly Count > 0 AND SO2 F23 Method Active For Hour == false)

\tab Return result B

Else if ( S02R Derived Hourly Count >1)

\tab 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 Hou r = DerivedHourly ValueData.Hour
S02R Derived Checks Needed = true

else

If S02R Derived Hourly Count > 0
\tab Return result D

Results:

Result

Description

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

A

Critical Error Level 1

B

Non-Critical Error

C

Critical Error Level 1

D

Critical Error Level 1

Usage:

Environmental Protection Agency

Page 618 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 619 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	HOUROP-43

Check Name:	Validate Single Stack Flow Record

Related Former Checks:

Applicability:	CEM Check

Specifications:

\ucl

\fs20 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
\tab Else if ( Flow Monitor Hourly Count >1)

return result B
\tab Else

\tab Current Stack Flow Hourly Record = MonitorHourlyValueData record with parameter FLOW where
\tab Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour
else

\tab If Flow Monitor Hourly Count > 0
return result C

Results:

Result
A
B
C

Usage:

1

Description

You did not report an MHV record for FLOW for the hour.

You reported more than one MHV record for FLOW for the hour.

You reported a MHV record for FLOW, but this record is not appropriate for
the hour.

Emissions Data Evaluation Report	Unit-Level Evaluation

Severity

Critical Error Level 1
Critical Error Level 1
Non-Critical Error

Environmental Protection Agency

Page 620 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

INTSTAT-1

Check Name:

Determine the Online Daily Interference Check

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set OnlineDailylnt Record = null
Set OfflineDailylnt Record = null.

Set DailylntStatusResult = null

Locate the latest record in DailylntCheck RecordsByLocationForQAStatus for the location :

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

b)	ComponentID is equal to the Current MHV Record .ComponentID AND

c)	TestResultCd is not equal to "IGNORED" //Ignored indicates an offline test
if (DailylntCheck RecordsByLocationForQAStatus is found)

Set OnlineDailylnt Record = the found record in DailylntCheck RecordsByLocationForQAStatus .

If ( OnlineDailylnt Record .TestResultCd = "PASSED")

If (the number of clock hours between the OnlineDailylnt Record .EndDate/Hour and the CurrentMHVRecord
.Date/Hour is less than 26)

Set DailylntStatusResult = "IC"

else if ( OnlineDailylnt Record .TestResultCd = "FAILED")

Set DailylntStatusResult = "OOC-Test Failed"

else if ( OnlineDailylnt Record .TestResultCd = "ABORTED")

Set DailylntStatusResult = "OOC-Test Aborted"

else

Set DailylntStatusResult = "OOC-Test Has Critical Errors"

If (DailylntStatusResult is not equal to "IC")

Locate the latest record in DailylntCheck RecordsByLocationForQAStatus 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 OnlineDailylnt Record .EndDate/Hour /Min

c)	T he ComponentID is equal to the CurrentMHVRecord .ComponentID AND

d)	TestResultCd is equal to "IGNORED"

if (DailylntCheck RecordsByLocationForQAStatus is found

Set OfflineDailylnt Record = the found record in DailylntCheck RecordsByLocationForQAStatus .
If (DailylntStatusResult is not null)

Environmental Protection Agency

Page 621 of 907


-------
Draft Check Specifications

12/16/2015

Set DailylntStatusResult = DailylntStatusResult &

Usage:

1	Emissions Data Evaluation Report	Daily Interference Check Status Evaluation

Environmental Protection Agency

Page 622 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

INTSTAT-2

Check Name:

Determine Daily Interference Status for No Prior Check

Related Former Checks:
Applicability:

CEM Check

Specifications:

If (DailylntStatusResult is null) and ( OnlineDailylnt Record 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)

S et 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/Hour and up to the
hour before CurrentMHVRecord .Date/Hour is greater than 7)

S et DailylntStatusResult = "OOC-No Prior Test".

S et DailylntStatusResult = "OOC-No Prior Test".

If (DailylntStatusResult begins with "OOC")

Locate the record in DailylntCheck RecordsByLocationForQAStatus for the location where :

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

b)	t he ComponentID is equal to the CurrentMHVRecord .ComponentID AND

c)	TestResultCd is equal to "IGNORED"

if (DailylntCheck RecordsByLocationForQAStatus is found )

else

S et DailylntStatusResult = "IC-Undetermined".

else

Environmental Protection Agency

Page 623 of 907


-------
Draft Check Specifications

12/16/2015

Set OfflineDailylnt Record = the found record in DailylntCheck RecordsByLocationForQAStatus .
Set DailylntStatusResult = DailylntStatusResult &

Usage:

1	Emissions Data Evaluation Report	Daily Interference Check Status Evaluation

Environmental Protection Agency

Page 624 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

INTSTAT-3

Check Name:

Related Former Checks:

Determine Expiration Status for Prior Daily Interference Check

Applicability:
Specifications:

CEM Check

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 .Date/Hour and up to the hour
before CurrentMHVRecord .Date/Hour is greater than 7)

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.

Set DailylntStatusResult = "OOC-Expired".

else

Results:

Result

Description

Severity

OOC-Expired

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.

Critical Error Level 1

OOC-Expired*

Critical Error Level 1

Environmental Protection Agency

Page 625 of 907


-------
Draft Check Specifications

12/16/2015

OOC-No Prior Test You did not report a prior daily interference check for [compkey] during the Critical Error Level 1
reporting period. Any daily interference check that may have been completed
in a prior reporting period has expired.

OOC-No Prior	You did not report a prior daily interference check for [compkey] during the Critical Error Level 1

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

OOC-Test Aborted The prior daily interference check for [compkey] completed on [date] was Critical Error Level 1
aborted.

OOC-Test	The prior daily interference check for [compkey] completed on [date] was Critical Error Level 1

Aborted*	aborted. An daily interference check completed on [invdate] was ignored

because it was performed while the unit was offline.

OOC-Test Failed The prior daily interference check for [compkey] completed on [date] failed. Critical Error Level 1

OOC-Test Failed* The prior daily interference check for [compkey] completed on [date] failed. Critical Error Level 1
An daily interference check completed on [invdate] was ignored because it
was performed while the unit was offline.

OOC-Test Has	The prior daily interference check for [compkey] completed on [date] has	Critical Error Level 1

Critical Errors	critical errors.

OOC-Test Has	The prior daily interference check for [compkey] completed on [date] has	Critical Error Level 1

Critical Errors*	critical errors. An daily interference check completed on [invdate] was
ignored because it was performed while the unit was offline.

Usage:

1	Emissions Data Evaluation Report	Daily Interference Check Status Evaluation

Environmental Protection Agency

Page 626 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LINSTAT-1

Check Name:	Check Analyzer Range Exemption For Linearity Status

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set CurrentLinearityStatus = 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 andMonitorSpanRecordsByHourLocation .SpanValue <= 30)

Set CurrentLinearityStatus = "IC-Exempt".

Usage:

1

Emissions Data

Evaluation

2

Emissions Data

Evaluation

3

Emissions Data

Evaluation

4

Emissions Data

Evaluation

5

Emissions Data

Evaluation

6

Emissions Data

Evaluation

Report	C02 Linearity Status Evaluation

Report	Hg Linearity Status Evaluation

Report	NOX Linearity Status Evaluation

Report	02 Dry Linearity Status Evaluation

Report	02 Wet Linearity Status Evaluation

Report	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 627 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LINSTAT-2

Check Name:	Locate Most Recent Prior Linearity Test

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set Prior Linearity Record = null.

Set InvalidLinearityRecord = null.

if ( CurrentLinearityStatus is null)

Locate the most recent record in Linearity TestRecordsByLocationForQAStatus 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 (Linearity TestRecordsByLocationForQAStatus is found)

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

Locate the most recent record in Linearity TestRecordsByLocationForQAStatus 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 PriorTestRecord .EndDate/Hour and the CalculatedTestResult is equal to "INVALID".

if (Linearity TestRecordsByLocationForQAStatus is found)

Set InvalidLinearity Record = the found record in Linearity TestRecordsByLocationForQAStatus .

else

Locate the most recent record in Linearity TestRecordsByLocationForQAStatus 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 (Linearity TestRecordsByLocationForQAStatus is found)

Set InvalidLinearity Record = the found record in Linearity TestRecordsByLocationForQAStatus .

Usage:

1

Emissions

Data

Evaluation

2

Emissions

Data

Evaluation

3

Emissions

Data

Evaluation

4

Emissions

Data

Evaluation

5

Emissions

Data

Evaluation

6

Emissions

Data

Evaluation

Report	C02 Linearity Status Evaluation

Report	Hg Linearity Status Evaluation

Report	NOX Linearity Status Evaluation

Report	02 Dry Linearity Status Evaluation

Report	02 Wet Linearity Status Evaluation

Report	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 628 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LINSTAT-3

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set PriorLinearityEventRecord = null,
if ( CurrentLinearityStatus is null)

Locate all records in QACertiflcationEventRecords where:
the ComponentID is equal to the ApplicableComponentID
AND LinearityRequired 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 PriorTestRecord .EndDate/Hour OR

c ) QACertEventDate/Hour is equal to the Prior TestRecord .EndDate/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the Prior TestRecord .EndDate/Hour)

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 (PriorLinearityEventRecord QACertEventCode = 170 a nd 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 PriorLinearityEventRecord. QACertEventDate/Hour.

Environmental Protection Agency

Page 629 of 907


-------
Draft Check Specifications

12/16/2015

if (MonitorSpanRecordsByLocation is found)
exit for loop.

else

set PriorLinearityEventRecord = null.

else

exit for loop.

If (PriorLinearityEventRecord is null)

If (Prior Linearity Record is null)

Set CurrentLinearityStatus = "OOC-No Prior Test or Event".

else if (InvalidLinearityRecord is not null AND PriorLinearityEventRecord .QACertEventDate/Hour is after
InvalidTestRecord .EndDate/Hour)

Locate the earliest record in Linearity TestRecordsByLocationForQAStatus 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 PriorLinearityEventRecord .QACertEventDate/Hour and prior
to the CurrentDateHour .

if (Linearity TestRecordsByLocationForQAStatus is found)

Set InvalidLinearity Record = the found record in Linearity TestRecordsByLocationForQAStatus .

else

Set InvalidLinearity Record = null.

Usage:

1

Emissions Data

Evaluation

2

Emissions Data

Evaluation

3

Emissions Data

Evaluation

4

Emissions Data

Evaluation

5

Emissions Data

Evaluation

6

Emissions Data

Evaluation

Report	C02 Linearity Status Evaluation

Report	Hg Linearity Status Evaluation

Report	NOX Linearity Status Evaluation

Report	02 Dry Linearity Status Evaluation

Report	02 Wet Linearity Status Evaluation

Report	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 630 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LINSTAT-4

Check Name:

Determine Expiration Dates For Most Recent Prior Linearity Test

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set LinearityMissingOpDatalnfo = null.

if ( CurrentLinearity Status is blank and Prior Linearity Record is not null and PriorLinearityEventRecord is null)
Set CheckForlgnoredLinearity = true.

Set PriorTestExpirationDate = null

Set PriorTestExpirationDateWithExtension = null

Set MissingOpData = false

if (Prior Linearity Record .QANeedsEvaluationFlag = "Y")

Set CurrentLinearityStatus = "Prior Test Not Yet Evaluated".

else if (Prior Linearity Record .TestResultCode = null or Prior Linearity Record .TestResultCode = "FAILED" or
Prior Linearity Record .TestResultCode = "ABORTED")

Locate the most recent record in QACertificationEventRecords where:
the ComponentID is equal to the ApplicableComponentID
AND LinearityRequired is equal to "Y";

AND the ConditionalBeginDate/Hour is:

a)	on or prior to the CurrentDateHour AND

b)	on or after the PriorTestRecord .EndDate/Hour;

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 CurrentHourlyRecordforRATAStatus .Date
if ( QACertificationEventRecords is found)

Set PriorLinearityEventRecord = found record in QACertificationEventRecords .
elseif (Prior Linearity Record .TestResultCode = null)

Set CurrentLinearityStatus = "OOC-Test Has Critical Errors".

Environmental Protection Agency

Page 631 of 907


-------
Draft Check Specifications

12/16/2015

else if (Prior Linearity Record .TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Test Failed",
else if (PriorLinearityRecord .TestResultCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Test Aborted".

else

Set PriorTestExpirationDate = PriorLinearityRecord .TestExpirationDate.

Set PriorTestExpirationDateWithExtension = PriorLinearityRecord .TestExpirationDateWithExtension.
if (PriorTestExpirationDate is null)

if (Annual Reporting Requirement == false)

if (PriorLinearityRecord .TestEndQuarter = "2")

Set PriorTestExpirationDate = July 30th following PriorLinearityRecord .EndDate.

else

S et PriorTestExpirationDate = April 30th following PriorLinearityRecord .EndDate.

else

Set AlternateTestDate = null

if (PriorLinearityRecord. ComponentTypeCode is equal to "HG")

Locate the record in LocationProgramRecordsByHourLocation with the latest EmissionsRecording
BeginDate where the ProgramCode is equal to MATS and the EmissionsRecording BeginDate is ON OR
BEFORE the BeginDate of the associated system in the PriorLinearityRecord.

if found

Set AlternateTestDate = EmissionsRecording BeginDate of the located record

Locate the most recent QACertificationEventRecords for the ApplicableComponentlD where
LinearityRequired is equal to "Y", and the BeginDate/Hour is prior to the PriorLinearityRecord
.BeginDate/Hour.

if ( QACertificationEventRecords is found AND the LinearityCertEvent is equal to "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the PriorLinearityRecord
.EndDate/Hour)

If AlternateTestDate is null

Set PriorTestExpirationDate = the end of the quarter following the quarter of the
QACertificationEventRecords .CompletionTestDate.

Else

Set PriorTestExpirationDate = the end of the quarter following the quarter of the later of
QACertificationEventRecords .CompletionTestDate and AlternateTestDate .

else if (PriorLinearityRecord .GracePeriodlnd =1)

If AlternateTestDate is null

Set PriorTestExpirationDate = the end of the quarter of the quarter of the PriorLinearityRecord
.EndDate.

Environmental Protection Agency	Page 632 of 907


-------
Draft Check Specifications

12/16/2015

Else

Set PriorTestExpirationDate = the end of the quarter of the quarter of the later of
Prior Linearity Record .EndDate 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
Prior Linearity Record .EndDate and AlternateTestDate .

Set Prior Linearity Record .TestExpirationDate = PriorTestExpirationDate .

if ( CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate )

Set CurrentLinearityStatus = "IC".

else i f (Annual Reporting Requirement == false)

Set CurrentLinearityStatus = " OOC-Expired ".

else

if (PriorTestExpirationDate WithExtension is null)

Set NumberOfExtensionQuarters = 0;

For each quarter beginning with the quarter of the PriorTestExpirationDate a nd 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
OperatingSuppDataRecordsByLocation .OpValue < 168)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else if (Prior Linearity Record .ComponentTypeCode 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.

Environmental Protection Agency

Page 633 of 907


-------
Draft Check Specifications

12/16/2015

if ( TestExtensionExemptionRecords is found)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

else

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 Location ReportingFrequency 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 (Location ReportingFrequency record is found)

if (Annual Reporting Requirement == true and the quarter being
checked == 4 and the year of the End Quarter 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 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.)

Stop looking for extensions.

else

Set Missing Op Data to true.

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

Stop looking for extensions.

else

Stop looking for extensions.

if (Prior Linearity Record .ComponentTypeCode is NOT equal to "HG")

For each quarter beginning with the quarter after the End Quarter and continuing through the quarter
orior to the auarter of the CurrentDateHour

Environmental Protection Agency	Page 634 of 907


-------
Draft Check Specifications

12/16/2015

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 Prior Linearity Record .TestExpirationDate WithExtension = PriorTestExpirationDateWithExtension .

else

Set Prior Linearity Record .TestExpirationDate WithExtension = PriorTestExpirationDate
If ( CurrentDateHour is ON OR BEFORE the PriorTestExpirationDateWithExtension)

Set CurrentLinearityStatus = "IC-Extension".
else if (Missing Op Data == true )

Set CurrentLinearityStatus = "Missing Op Data".

Set Prior Linearity Record .TestExpirationDate WithExtension = null
else i f (Rpt Period Op Days Accumulator Array for the location == -1)

Set CurrentLinearityStatus = "Invalid Op Data".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if ( GraceOpHours > 168)

Set CurrentLinearityStatus = "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 CurrentLinearityStatus = "IC-Grace".

else

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)

Environmental Protection Agency	Page 635 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:

1

Emissions Data

Evaluation

2

Emissions Data

Evaluation

3

Emissions Data

Evaluation

4

Emissions Data

Evaluation

5

Emissions Data

Evaluation

6

Emissions Data

Evaluation

Report	C02 Linearity Status Evaluation

Report	Hg Linearity Status Evaluation

Report	NOX Linearity Status Evaluation

Report	02 Dry Linearity Status Evaluation

Report	02 Wet Linearity Status Evaluation

Report	S02 Linearity Status Evaluation

Environmental Protection Agency

Page 636 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LINSTAT-5

Check Name:

Determine Event Conditional Status

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set SubsequentLinearityRecord = null.

if ( CurrentLinearityStatus is null and PriorLinearityEventRecord is not null)

if (PriorLinearityEventRecord .ConditionalDataBeginDate/Hour is null or CurrentDateHour is prior to the
PriorLinearityEventRecord. ConditionalDataBeginDate/Hour)

Set CurrentLinearityStatus = "OOC-Event".

if ( CurrentMhvComponentType = "HG")

Locate the earliest record in LinearityTestRecordsByLocationForQAStatus 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 .ConditionalDataBeginDate/Hour.

else

Locate the earliest record in Linearity TestRecordsByLocationForQAStatus where the ComponentID is equal to the
ApplicableComponentID, the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed, the CalculatedTestResult is
not equal to "INVALID" and the EndDate/Hour is on or after the PriorLinearityEventRecord
. ConditionalDataBeginDate/Hour.

if (Linearity TestRecordsByLocationForQAStatus is found)

Set SubsequentLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus .

if (LinearityTestRecordsByLocationForQAStatus .QANeedsEvaluationFlag = "Y")

Set CurrentLinearityStatus = "Recertification Test Not Yet Evaluated".

else if (Linearity TestRecordsByLocationForQAStatus .TestResultCode is null)

Set CurrentLinearityStatus = "OOC-Recertification Test Has Critical Errors".

else if (LinearityTestRecordsByLocationForQAStatus .TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Recertification Test Failed".

else if (LinearityTestRecordsByLocationForQAStatus .TestResultCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Recertification Test Aborted".

If (InvalidLinearityRecord is null)

if ( CurrentMhvComponentType = "HG")

Locate the earliest record in Linearity TestRecordsByLocationForQAStatus where the Test Type Code =
"HGSI3," 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 .ConditionalDataBeginDate/Hour and is before the EndDate/EndHour of
the Linearity TestRecordsByLocationForQAStatus record retrieved above.

else

Environmental Protection Agency

Page 637 of 907


-------
Draft Check Specifications

12/16/2015

else

Locate the earliest record in Linearity TestRecordsByLocationForQAStatus 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 .ConditionalDataBeginDate/Hour and is before the EndDate/EndHour of the
LinearityTestRecordsByLocationForQAStatus record retrieved above.

if (Linearity TestRecordsByLocationForQAStatus 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 . LinearityCertEvent == "Y") and (PriorLinearityEventRecord .

SystemTypeCode is NOT in set (ST))

if (PriorLinearityEventRecord .EventCode = 125)

If (PriorLinearityEventRecord .MonitoringSystemID 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
EmissionsRecording BeginDate 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
EmissionsRecording BeginDate where the ProgramCode is in set \{ARP, NBP, NHNOX,

Environmental Protection Agency

Page 638 of 907


-------
Draft Check Specifications

12/16/2015

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

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate 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
EmissionsRecording BeginDate where the ProgramCode is in set \{ MATS \} and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorLinearityEventRecord .

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
EmissionsRecording BeginDate 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 (LocationProgramRecordsByHourLocation UnitMonitorCertDeadline is not null)

if (CurrentDate is prior to the LocationProgramRecordsByHourLocation
.UnitMonitorCertDeadline)

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

Environmental Protection Agency

Page 639 of 907


-------
Draft Check Specifications

12/16/2015

if (CurrentDate is prior to the LocationProgramRecordsByHourLocation
.UnitMonitorCertBeginDate +18 0 days)

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

If (the number of calendar days ON OR AFTER the PriorLinearityEventRecord .QACertEventDate and
ON OR BEFORE the CurrentDateHour > 180)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else if (the quarter of the PriorLinearityEventRecord .QACertEventDate is equal to the quarter of the
CurrentDateHour)

If (the number of calendar days ON OR AFTER the PriorLinearityEventRecord .QACertEventDate
and ON OR BEFORE the CurrentDateHour > 90)

If (Rpt Period Op Hours Accumulator Array for the location == -1)

Set CurrentLinearityStatus = "Invalid Op Data".

else if (the number of calendar days ON OR AFTER the PriorLinearityEventRecord
.QACertEventDate and ON OR BEFORE the CurrentDateHour is equal to Rpt Period Op
Days Accumulator Array for the location)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "IC-Conditional".
else if (PriorLinearityEventRecord .MinOpDaysPriorQuarter is null)

Set PriorLinearityEventRecord .MinOpDaysPriorQuarter = 0
Set PriorLinearityEventRecord .MaxOpDaysPriorQuarter = 0

for each quarter beginning with the quarter of the PriorLinearityEventRecord .QACertEventDate
and continuing through the quarter BEFORE the CurrentDateHour :

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

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

if ( OperatingSuppDataRecordsbyLocation is not found)

Set PriorLinearityEventRecord .MinOpDaysPriorQuarter = -1

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

exit for.

else

Environmental Protection Agency	Page 640 of 907


-------
Draft Check Specifications

12/16/2015

If the quarter being checked is the quarter of the PriorLinearityEventRecord
. Q ACertEventDate

If ( OperatingSuppDataRecordsbyLocation .OpValue MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorLinearityEventRecord .QACertEventDate > 0)

Set PriorLinearityEventRecord .MinOpDaysPriorQuarter =
OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorLinearityEventRecord. QACertEventDate

If ( OperatingSuppDataRecordsby Location .Op Value is less than the number of
calendar days in the quarter being checked that are ON OR AFTER the
PriorLinearityEventRecord. QACertEventDate)

Set PriorLinearityEventRecord .MaxOpDaysPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

Set PriorLinearityEventRecord .MaxOpDaysPriorQuarter = the number of
calendar days in the quarter being checked that are ON OR AFTER the
PriorLinearityEventRecord QACertEventDate.

Set PriorLinearityEventRecord .MinOpDaysPriorQuarter =
PriorLinearityEventRecord .MinOpDaysPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

Set PriorLinearityEventRecord .MaxOpDays PriorQuarter =
PriorLinearityEventRecord MaxOpDaysPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

if (PriorLinearityEventRecord .MinOpDaysPriorQuarter == -1

set CurrentLinearityStatus to "Missing Op Data"

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

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else if (PriorEventRecord MaxOpDaysPriorQuarter + Rpt Period Op Days Accumulator Array for
the Location > 90)

Set CurrentLinearityStatus = "Undetermined-Conditional Data".

else

else

else

Set CurrentLinearityStatus = "IC-Conditional".

else

Set CurrentLinearityStatus = "IC-Conditional".

else

If (the quarter of the PriorLinearityEventRecord .ConditionalBeginDate is equal to the quarter of the
CurrentDateHour)

Count the number of HourlvOpData records for the location where OpTime is greater than 0 and

Environmental Protection Agency

Page 641 of 907


-------
Draft Check Specifications

12/16/2015

Date/Hour is ON OR AFTER the PriorLinearityEventRecord .ConditionalBeginDate/Hour and ON OR
BEFORE the CurrentDateHour,

If the number >168,

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearityStatus = "IC-Conditional".

else

if (PriorLinearityEventRecord .MinOpHoursPriorQuarter is null)

Set PriorLinearityEventRecord .MinOpHoursPriorQuarter = 0

Set PriorLinearityEventRecord .MaxOpHoursPriorQuarter = 0

for each quarter beginning with the quarter of the PriorLinearityEventRecord
.ConditionalBeginDate 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 OperatingSuppDataRecordsby Location where the OpTypeCode
is equal to "OPHOURS", FuelCode is null, and the reporting period is equal to the
quarter being checked.

if ( OperatingSuppDataRecordsbyLocation is not found)

Set PriorLinearityEventRecord .MinOpHoursPriorQuarter = -1

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

exit for.

else

If the quarter being checked is the quarter of the PriorLinearityEventRecord
. ConditionalBeginDate

If ( OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
PriorLinearityEventRecord .ConditionalBeginDate/Hour > 0)

Set PriorLinearityEventRecord .MinOpHoursPriorQuarter =
OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
PriorLinearityEventRecord. ConditionalBeginDate/Hour

If ( OperatingSuppDataRecordsby Location .Op Value is less than the number of
calendar hours in the quarter begin checked that are ON OR AFTER the
PriorLinearityEventRecord. ConditionalBeginDate/Hour)

Environmental Protection Agency

Page 642 of 907


-------
Draft Check Specifications

12/16/2015

Set PriorLinearityEventRecord .MaxOpHoursPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

else

Set PriorLinearityEventRecord .MaxOpHoursPriorQuarter = the number of
calendar hours in the quarter being checked that are ON OR AFTER the
PriorLinearityEventRecord. ConditionalBeginDate/Hour.

else

Set PriorLinearityEventRecord .MinOpHoursPriorQuarter =
PriorLinearityEventRecord .MinOpHoursPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

Set PriorLinearityEventRecord .MaxOpHours PriorQuarter =
PriorLinearityEventRecord .MaxOpHoursPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

if (PriorLinearityEventRecord .MinOpHoursPriorQuarter == -1)

set CurrentLinearityStatus to "Missing Op Data"

else if (Rpt Period Op Days Accumulator Array for the location == -1)

if (PriorEventRecord .MinOpHoursPriorQuarter > 168)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else

Set CurrentLinearityStatus = "Invalid Op Data".

else

if (PriorEventRecord MinOpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array for
the Location > 168)

Set CurrentLinearityStatus = "OOC-Conditional Period Expired".

else if (PriorEventRecord MaxOpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array
for the Location > 168)

Set CurrentLinearityStatus = "Undetermined-Conditional Data".

else

Set CurrentLinearityStatus = "IC-Conditional".

Usage:

1	Emissions Data Evaluation Report

2	Emissions Data Evaluation Report

3	Emissions Data Evaluation Report

4	Emissions Data Evaluation Report

5	Emissions Data Evaluation Report

6	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

Environmental Protection Agency

Page 643 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 644 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LINSTAT-6

Check Name:

Determine Final Linearity Status

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set AlternateLinearityRecord = null
Set AlternatelnvalidLinearityRecord = null
if ( CurrentLinearityStatus begins with "OOC")
if (InvalidLinearityRecord is not null)

Set CurrentLinearityStatus = 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 = LowRangeComponentID .

else

Set AlternateAnalyzerRange = "H".

Set AlternateComponentID = HighRangeComponentID .

for each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the

AlternateComponentID

Append MonitorSystemComponentRecordsliyHourLocat'wn .SystemID 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
Environmental Protection Agency	Page 645 of 907


-------
Draft Check Specifications

12/16/2015

MonitorSpanRecordsByHourAndLocation is found or MonitorSpanRecordsByHourAndLocation . SpanValue is null
or is less than or equal to 0)

Set CurrentLinearityStatus = "Invalid Monitor Span".

if (AlternateAnalyzerRange = "H")

Set CurrentLinearityStatus = CurrentLinearityStatus & " (High Scale)".

else

Set CurrentLinearityStatus = CurrentLinearityStatus & " (Low Scale)".

Return result CurrentLinearityStatus .
else if (MonitorSpanRecordsByHourAndLocation .SpanValue < =30)

If ( CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus .

else

exit check.

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for thq AlternateComponentID where the
SpanScaleCode is equal to the AlternateAnalyzerRange and the CalculatedTestResult is not equal to "INVALID" and the
EndDate/Hour is either:

a)	prior to the 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 AlternateComponentID
AND LinearityRequired 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 AlternateLinearityRecord .EndDate/Hour OR

c)	QACertEventDate/Hour is equal to the AlternateLinearityRecord .EndDate/Hour AND (TestCompletionDate is null or
the TestCompletionDate/Hour is after the AlternateLinearityRecord .EndDate/Hour)

AND either

a)	DualRangeStatus = false OR

b)	HighRangeComponentID <> LowRangeComponentID OR

Environmental Protection Agency	Page 646 of 907


-------
Draft Check Specifications

12/16/2015

c)	QACertEventCode <> 27 or 30 or 172 and AlternateAnalyzerRange = "H" OR

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

if ( QACertiJicationEventRecords is found)

if ( QACertiJicationEventRecords .ConditionalBeginDate/Hour is null or CurrentDateHour is prior to the
OA CertiJicationEventRecords. ConditionalBeginDate/Hour)

If ( CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus .

else

Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AlternateComponentID
where the SpanScaleCode is equal to the AlternateAnalyzerRange, the CalculatedTestResult is equal to
"INVALID", and the EndDate/Hour is after the QACertiJicationEventRecords .QACertEventDate/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 AlternateAnalyzerRange , the CalculatedTestResult is
not equal to "INVALID", and the EndDate/Hour is on or after the QACertiJicationEventRecords
. ConditionalDataBeginDate/Hour.

if (Linearity TestRecordsByLocationForQAStatus is found)

Set AlternateLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus .

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
QACertiJicationEventRecords .QACertEventDate/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 (AlternatelnvalidTestRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

Environmental Protection Agency	Page 647 of 907


-------
Draft Check Specifications

12/16/2015

else if (AlternateLinearityRecord .TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Failed",
if (AlternatelnvalidTestRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &
else if (AlternateLinearityRecord .TestResultCode = "ABORTED")

Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Aborted",
if (AlternatelnvalidTestRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &
If ( CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus .

else

if (AlternateLinearityRecord is found)

if (AlternateLinearityRecord .QANeedsEvaluationFlag = "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 thq AlternateAnalyzerRange and the
EndDate/Hour is prior to the CurrentDateHour and the EndDate/Hour is greater than the
AlternateLinearityRecord .EndDate/Hour and the CalculatedTestResult is equal to "INVALID".

if (Linearity TestRecordsByLocationForQAStatus is found)

Set AlternatelnvalidLinearityRecord = the found record in
Linearity TestRecordsByLocationForQAStatus .

if (AlternateLinearityRecord .TestResultCode = null)

Set CurrentLinearityStatus = "OOC-Alternate Range Test Has Critical Errors".

if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AlternateLinearityRecord .TestResultCode = "FAILED")

Set CurrentLinearityStatus = "OOC-Alternate Range Test Failed".

if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

else if (AlternateLinearityRecord .TestResultCode = "ABORTED")

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

if (AlternatelnvalidLinearityRecord is not null)

Set CurrentLinearityStatus = CurrentLinearityStatus &

Environmental Protection Agency

Page 648 of 907


-------
Draft Check Specifications

12/16/2015

else

Set CurrentLinearityStatus = "OOC-No Prior Alternate Range Test or Event".
If ( CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus .
else

If ( CurrentLinearityStatus does not begin with "IC")

Return result CurrentLinearityStatus .

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

Description

The [testtype] status for [key] could not be determined, because the prior
[testtype] for the alternate range component with TestNumber [alttestnum]
has not yet been evaluated.

The [testtype] status for [key] could not be determined, because the prior
[testtype] for the alternate range component with TestNumber [alttestnum]
has not yet been evaluated.

The [testtype] status for [key] could not be determined, because the QA
Certification Event record for QACertEventCode [code] QACertEventDate
[eventdate] has a critical error.

The [testtype] status for [key] could not be determined, because you did not
report a single, valid high-scale [comptype] span record that was active
during the test.

The [testtype] status for [key] could not be determined, because you did not
report a single, valid low-scale [comptype] span record that was active during
the test.

The [testtype] status for [key] could not be determined, because the Monitor
System record for MonitoringSystemID [system] has a critical error.

The [testtype] status for [key] could not be determined, because you did not
report any active Monitor System Component records for the alternate range
of the component.

The [testtype] status for [key] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or
invalid.

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

The [testtype] status for [key] could not be determined, because a Unit
Program record associated with the initial certification event for
QACertEventCode [code] QACertEventDate [eventdate] either does not exist
or has a UnitMonitorCertificationBeginDate inconsistent with the BeginDate
of the associated Monitor System record.

The subsequent recertification [testtype] for the alternate range of the
component for [key] with TestNumber [alttestnum] was aborted.

The subsequent recertification [testtype] for the alternate range of [key] with
TestNumber [alttestnum] was aborted. An invalid [testtype] with

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

Environmental Protection Agency

Page 649 of 907


-------
Draft Check Specifications

12/16/2015

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*

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

TestNumber [altinvtestnum] was ignored.

The subsequent recertification [testtype] for the alternate range of the	Critical Error Level 1

component for [key] with TestNumber [alttestnum] failed.

The subsequent recertification [testtype] for the alternate range of the	Critical Error Level 1

component for [key] with TestNumber [alttestnum] failed. An invalid
[testtype] with TestNumber [altinvtestnum] was ignored.

The subsequent recertification [testtype] for the alternate range of the	Critical Error Level 1

component for [key] with TestNumber [alttestnum] has critical errors.

The subsequent recertification [testtype] for the alternate range of the	Critical Error Level 1

component for [key] with TestNumber [alttestnum] has critical errors. An
invalid [testtype] with TestNumber [altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [alttestnum] was aborted.

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [alttestnum] was aborted. An invalid [testtype] with
TestNumber [altinvtestnum] was ignored.

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [alttestnum] failed.

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [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.

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

The prior [testtype] for the alternate range of the component for [key] with
TestNumber [alttestnum] has critical errors. An invalid [testtype] with
TestNumber [altinvtestnum] was ignored.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [key] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [key] has expired. An invalid [testtype] was ignored.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate], but you did not indicate the use of conditional
data for [key].

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [key], but you did not indicate the use of
conditional data. An invalid [testtype] was ignored.

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

The prior [testtype] for [key] with TestNumber [testnum] has expired. An
invalid prior [testtype] with TestNumber [invtestnum] was ignored.

You did not report a prior [testtype] or certification event for the alternate
range of the component for [key].

Critical Error Level 1

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

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

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

Critical Error Level 1

Environmental Protection Agency

Page 650 of 907


-------
Draft Check Specifications

12/16/2015

OOC-No Prior Test
or Event*

OOC-

Recertification Test
Aborted

OOC-

Recertification Test
Aborted*

OOC-

Recertification Test
Failed

OOC-

Recertification Test
Failed*

OOC-

Recertification Test
Has Critical Errors

OOC-

Recertification Test
Has Critical
Errors*

OOC-Test Aborted

OOC-Test
Aborted*

OOC-Test Failed
OOC-Test Failed*

OOC-Test Has
Critical Errors

OOC-Test Has
Critical Errors*

Prior Test Not Yet
Evaluated

Recertification Test
Not Yet Evaluated

Undetermined-
Conditional Data

Usage:

1

2

3

4

5

6

You did not report a valid prior [testtype] or certification event for [key]. An Critical Error Level 1
invalid [testtype] with TestNumber [invtestnum] was ignored.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] was aborted.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] was aborted. An invalid [testtype] with TestNumber
[invtestnum] was ignored.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] failed.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] failed. An invalid [testtype] with TestNumber [invtestnum] was

ignored.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] has critical errors.

The subsequent recertification [testtype] for [key] with TestNumber	Critical Error Level 1

[subtestnum] has critical errors. An invalid [testtype] with TestNumber
[invtestnum] was ignored.

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

aborted.

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

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

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

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

critical errors.

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

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

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

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

conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for [key]

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

Environmental Protection Agency

Page 651 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LKSTAT-1

Check Name:

Locate Most Recent Prior Leak Check

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set PriorL eak Record = null.

Locate the most recent record in LeakCheck RecordsByLocationForQAStatus for the location where :

a)	the ComponentID is equal to the CurrentMHV.ComponentW

b)	the TestResult Cd is not equal to "INVALID" and

c)	the EndDate/Hou r is on or prior to the CurrentMHVRecord .Date/Hour
if (L eakCheck RecordsByLocationForQAStatus is found)

Set PriorL eak Record = the found record in L eakCheck RecordsByLocationForQAStatus .

Usage:
1

Emissions Data Evaluation Report

Leak Check Status Evaluation

Environmental Protection Agency

Page 652 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LKSTAT-2

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set PriorL eak EventRecord = null.

Set LeakStatusResult = null

If (Prior Leak Record 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 ( QACertificationEventRecord is found)

Set PriorL eak EventRecord = the found record in QACertificationEventRecord .

Locate the latest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMhvRecord .SystemID, TestReasonCode is equal to "INITIAL" or "RECERT", TestResultCode is equal to
"PASSED", and EndDateHour is after QACertificationEventRecord. QACertEventDate/Hour 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
.ComponentID.

If found, and the BeginDate in the SystemComponent record is in the current reporting period,

Set LeakStatusResult = " IC"

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 Prior Leak Record .EndDate/Hour ,

if a record is found

Set Prior Leak EventRecord = the found record in QACertificationEventRecord s .
if Prior Leak EventRecord .LastCompletedTestDate is not null

Set ExpectedLeakCheckQuarter = the quarter of Prior Leak EventRecord .LastCompletedTestDate.

else

Environmental Protection Agency	Page 653 of 907

else


-------
Draft Check Specifications

12/16/2015

Set ExpectedLeakCheckQuarter = the quarter after Prior Leak EventRecord. QACertEventDate .

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 OperatingSuppDataRecordsByLocation .OpValue >= 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 PriorL eak Record .QANeedsEvaluationFlag = "Y"

Set LeakStatusResult = "Prior Test Not Yet Evaluated",
else if PriorLeakRecord .TestResultCd is null

Set LeakStatusResult = "OOC- Test Has Critical Errors ".
else if PriorLeakRecord .TestResultCd == "FAILED"

Set LeakStatusResult = "OOC- Test Failed ".
else if PriorLeakRecord .TestResultCd == "ABORTED"

Set LeakStatusResult = "OOC- Test Aborted ".

Environmental Protection Agency

Page 654 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

Leak Check Status Evaluation

Page 655 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LKSTAT-3

Check Name:

Related Former Checks:

Determine Expiration Date For Prior Leak Check

Applicability:
Specifications:

CEM Check

if (LeakStatusResult is null)

S et PriorLeakExpirationDate = PriorL eak Record .TestExpirationDate.

if (PriorLeakExpirationDate is null)

if (Annual Reporting Requirement == false)

if (PriorL eak Record .TestEndQuarter = "2")

Set PriorLeakExpirationDate = September 30th following PriorL eak Record .EndDate.

else

S et PriorLeakExpirationDate = June 30th following PriorL eak Record .EndDate.

if (PriorL eak Record .GracePeriodlnd =1)

Set PriorLeakExpirationDate = the end of the quarter of the PriorL eak Record .EndDate.

else

Set PriorLeakExpirationDate = the end of the quarter following the quarter of the PriorL eak Record
.EndDate.

Set PriorL eak Record .TestExpirationDate = PriorLeakExpirationDate .
if ( CurrentMHVRecord .Date is ON OR BEFORE the PriorLeakExpirationDate )

Set LeakStatusResult — "IC".

else

S et PriorLeakExpirationDate = null.

else

Usage:
1

Emissions Data Evaluation Report

Leak Check Status Evaluation

Environmental Protection Agency

Page 656 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LKSTAT-4

Check Name:

Related Former Checks:

Determine Extended Expiration Date for Prior Leak Check

Applicability:
Specifications:

CEM Check

Set L eakMissingOpDatalnfo = null.

if (LeakStatusResult is null)

Set MissingOpData = false

if (PriorL eak Record .TestExpirationDateWithExtension is null)

For each quarter beginning with the quarter of the PriorLeakExpirationDate a nd continuing through the quarter prior
to the quarter of the CurrentMHVRecord .Date :

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

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 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 OperatingSuppDataRecordsByLocation where the reporting period is equal to
the year/quarter being checked and the OpTypeCode = "O S HOURS" and FuelCode is null.

if ( OperatingSuppDataRecordsByLocation is found AND OperatingSuppDataRecordsByLocation
.OpValue < 168)

If (Annual 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 Location ReportingFrequency 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 (Location ReportingFrequency record is found)

if (Annual Reporting Requirement == true and the quarter being checked == 4 and the
year of the End Quarter is equal to the year of the quarter being checked .

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

Environmental Protection Agency

Page 657 of 907


-------
Draft Check Specifications

12/16/2015

else

Stop looking for extensions.

else

Set Missing Op Data to true.

Set L eak MissingOpDatalnfo = "[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 L eak MissingOpDatalnfo = "[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.

Add NumberOfExtensionQuarters to PriorLeakExpirationDate

Set PriorL eak Record .TestExpirationDateWithExtension = PriorLeakExpirationDate

else

Set PriorLeakExpirationDate = PriorL eak Record .TestExpirationDateWithExtension
If ( CurrentMHVRecord Date/Hour is ON OR BEFORE the PriorLeakExpirationDate )

Set Leak Status Result = "IC-Extension".
else if (Missing Op Data == true )

Set Leak Status Result = "Missing Op Data".

Set PriorL eak Record .TestExpirationDateWithExtension = null

Usage:
1

Emissions Data Evaluation Report

Leak Check Status Evaluation

Environmental Protection Agency

Page 658 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LKSTAT-5

Check Name:	Determine Grace Period for Leak Check

Related Former Checks:

Applicability:	CEM Check

Specifications:

if (LeakStatusResult is null)

if (Annual Reporting Requirement == false)

Set LeakStatusResult = "OOC-Expired".
else i f (Rpt Period Op Hours Accumulator Array for the location == -1)

Set LeakStatusResult = "Invalid Op Data".

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if ( GraceOpHours > 168)

Set LeakStatusResult = "OOC-Expired".

else

If the quarter after the LATER of the PriorLeakExpirationDate and the EarliestLocationReportDate is the
quarter of the CurrentMHVRecord .Date/Hour ,

Set LeakStatusResult = "IC-Grace".

else

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 LeakStatusResult = "OOC-Expired".

exit for.

else

Set LeakStatusResult = "Missing Op Data".

Set L eak 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.

Environmental Protection Agency

Page 659 of 907


-------
Draft Check Specifications

12/16/2015

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

Usage:

1

Description

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

Emissions Data Evaluation Report ¦

¦ Leak Check Status Evaluation

Environmental Protection Agency

Page 660 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-10

Determine Total Load for Reporting Period

LME-EXP8A

LME Check

Check Name:

Related Former Checks:

Applicability:
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 L TFF April Heat Input Array, LME Gen April Heat Input Array , LME Gen April Load Array, LME Gen April
NOXM Array , LME Gen April Op Time Array , LME Gen April Op Hours Array, and LME Gen LTFF April Op Time Array
to 0 for each location in the monitoring configuration.

Set LME Gen CP Total Heat Input, LME Gen Total Load, and LME Gen Total Optime t o 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 \ul any\ulnone 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 \ul units\ulnone in the monitoring configuration where the QualificationTypeCode is
equal to "LMEA" or "LMES", BeginDate is on or before the la st 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,

Environmental Protection Agency

Page 661 of 907


-------
Draft Check Specifications

12/16/2015

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 Data. HourLoad is not null and is less than 0,
return result E.

else i f Hourly Op Data. OpTime for any hour is null, less than 0, or greater than 1,
return result F.

else i f Hourly Op Data. OpTime is greater than 0 and Hourly Op Data. HourLoad is null,
return result E.

else i f Hourly Op Data. OpTime is greater than 0 AND Hourly Op Data. MHHI Indicator is not equal to 1,
Add HourLoad * OpTime to LME Gen Total Load Array for the location.

Add HourLoad * OpTime to LME Gen T otal 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,

Environmental Protection Agency

Page 662 of 907


-------
Draft Check Specifications

12/16/2015

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 i f 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 T otal 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 T otal Load - LME Gen April Load) is greater than 0 or (LME Gen Total Optime -
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

Description	Severity

You have not reported an active HIT method in your monitoring plan for at	Fatal
least one monitoring location in the configuration.

You have not reported an active LMEA or LMES qualification record for this Fatal
configuration in your monitoring plan.

You have not reported an active LMEA qualification record for this	Fatal

Environmental Protection Agency

Page 663 of 907


-------
Draft Check Specifications

12/16/2015

D

E
F
G

H

I

J

K

M

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.

Fatal
Fatal
Fatal
Fatal

Fatal

Critical Error Level 1
Fatal

Critical Error Level 1
Fatal

Critical Error Level 1

Usage:
1

LME Emissions Data Generation LME Initialization

Environmental Protection Agency

Page 664 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-11

Check Name:	Check LTFF System

Related Former Checks:

Applicability:	LME Check

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

A	You did not report a MonitoringSystemID in an LTFF record.	Fatal

B	The MonitoringSystemID reported in the LTFF record for [key] is not a long- Critical Error Level 1
term fuel flow system.

Usage:

1	Emissions Data Entry Screen Evaluation LTFF Data Evaluation

2	Emissions Data Evaluation Report — Long Term Fuel Flow

3	LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 665 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-12

Check Name:	Check LTFF Fuel Flow Period Code

Related Former Checks:

Applicability:	LME Check

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	Description

A	You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This

value is required for LME units with an ozone-season qualification during
the second quarter.

B	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this

value is only appropriate during the second quarter.

C	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this

value is only appropriate for LME units with an ozone-season qualification.

Usage:

1	LME Emissions Data Generation LTFF Heat Input Data

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 666 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-13

Check Name:	Check Long Term Fuel Flow Value

Related Former Checks:

Applicability:	LME Check

Specifications:

For the LTFF record:

If the LongTermFuelFlowValue is null or is less than or equal to 0,
return result A.

Results:

Result	Description	Severity

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

Usage:

1	Emissions Data Entry Screen Evaluation LTFF Data Evaluation

2	Emissions Data Evaluation Report — Long Term Fuel Flow

3	LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 667 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-14

Check Name:

Check Long Term Fuel Flow UOM

Related Former Checks:
Applicability:

LME Check

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

Description

The [fieldname] reported in the LTFF record for [key] is missing or invalid.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Emissions Data Evaluation Report — Long Term Fuel Flow
LME Emissions Data Generation LTFF Heat Input Data

2

3

Environmental Protection Agency

Page 668 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-15

Check Name:	Check LTFF GCV

Related Former Checks:

Applicability:	LME Check

Specifications:

For the LTFF record:

If the GrossCalorificValue is null or is less than or equal to 0,
return result A.

Results:

Result	Description	Severity

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

Usage:

1	Emissions Data Entry Screen Evaluation LTFF Data Evaluation

2	Emissions Data Evaluation Report — Long Term Fuel Flow

3	LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 669 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-16

Check Name:

Check LTFF GCV UOM

Related Former Checks:
Applicability:

LME Check

Specifications:

For the LTFF record:

LME Gen LTFF Heat Input = null.

If the GCVUnitsOfMeasureCode is null,

return result A.

Otherwise,

If the LongTermFuelFlowUOMCode is "LB" and the GCVUnitsOfMeasureCode is not equal to "BTULB",
return result A.

If the LongTermFuelFlowUOMCode is "GAL" and the GCVUnitsOfMeasureCode is not equal to "BTUGAL",
return result A.

If the LongTermFuelFlowUOMCode is "SCF" and the GCVUnitsOfMeasureCode is not equal to "BTUSCF",
return result A.

Otherwise,

If GrossCalorificValue is greater than 0 and LongTermFuelFlowValue is greater than 0,

Calculate LME Gen LTFF Heat Input = GrossCalorificValue * LongTermFuelFlowValue / 1,000,000,
rounded to the nearest integer.

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 GrossCalorificValue > Max Allowed GCV) OR (Min Allowed GCV is not
null AND GrossCalorificValue < Min Allowed GCV)

return result B

else

Environmental Protection Agency

Page 670 of 907


-------
Draft Check Specifications

12/16/2015

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

A

B

C

Usage:

1

2

3

Description

The [fieldname] reported in the LTFF record for [key] is missing or invalid.

The GrossCalorificValue reported in the long-term fuel flow record for [key]
is outside the range of allowable values for the fuel type [fueled].

The GrossCalorificValue reported in the long-term fuel flow record for [key]
is outside the range of expected values for the fuel type [fueled].

Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Emissions Data Evaluation Report — Long Term Fuel Flow
LME Emissions Data Generation LTFF Heat Input Data

Severity

Critical Error Level 1
Critical Error Level 1

Non-Critical Error

Environmental Protection Agency

Page 671 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-17

Check Name:

Check LTFF Total Heat Input

Related Former Checks:
Applicability:

LME Check

Specifications:

For the LTFF record:

If LME Gen LTFF Heat Input is not null and is greater than or equal to 0 ,

i f LME Gen Total Heat Input Array for the location is greater than or equal to 0,

add LME Gen LTFF Heat Input to LME Gen LTFF 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

Description
obsolete

Severity

A

No Errors

Usage:
1

LME Emissions Data Generation LTFF Heat Input Data

Environmental Protection Agency

Page 672 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-18

Check Name:

Check LME Begin Hour

Related Former Checks:
Applicability:

LME Check

Specifications:

For the LME Hourly Op record:

If BeginHour is null or is not between 0 and 23 (inclusive),
return result A.

Results:

Result	Description	Severity

A	The Hour is missing or invalid.	Fatal

Usage:
1

Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 673 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-19

Check Name:	Check LME Begin Date

Related Former Checks:

Applicability:	LME Check

Specifications:

For the LME Hourly Op record:

If BeginDate is null or is not within the reporting period,
return result A.

Results:

Severity
Fatal

Result	Description

A	The Date is missing or not within the reporting period.

Usage:

1	Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 674 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-20

Check Name:	Duplicate LME Hourly Op Record

Related Former Checks:

Applicability:	LME Check

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

A	Another [recordtype] record already exists with the same [fieldnames].	Fatal

Usage:

1	Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 675 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-21

Check Name:

Locate Hourly Op Record for LME Unit

Related Former Checks:

Applicability:

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

Description

There is no active LME method in your monitoring plan.

Severity

A

Critical Error Level 1

B

You reported an LME Hourly record for April, but the unit does not have an Informational Message

Environmental Protection Agency

Page 676 of 907


-------
Draft Check Specifications

12/16/2015

annual 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	LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 677 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-22

Check Name:

Check LME Op Time

Related Former Checks: LME-EXP2

Applicability:

LME Check

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

Description

The [fieldname] reported in the LME Hourly record is missing or invalid.

Severity

A

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 678 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-23

Check Name:

Check LME Data Entry Screen Op Time

Related Former Checks:
Applicability:

LME Check

Specifications:

For the LME Hourly Op record:

If OpTime is null, or is not between 0 and 1 inclusive,
return result A.

Results:

Result	Description	Severity

A	The [fieldname] reported in the LME Hourly record is missing or invalid. Critical Error Level 1

Usage:
1

Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Environmental Protection Agency

Page 679 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-24

Check Name:

Check LME Load Value

Related Former Checks: LME-EXP5

Applicability:

LME Check

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

Description

The [fieldname] reported in the LME Hourly record is invalid.

You did not report a LoadValue in the LME Hourly record.

You did not report a LoadValue in the LME Hourly record.

You reported a LoadValue in the LME Hourly record. This field should be
blank for a non-operating hour.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

C

Non-Critical Error

D

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 680 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-25

Check Name:	Check LME Data Entry Screen Load Value

Related Former Checks:

Applicability:	LME Check

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	Description

A	The [fieldname] reported in the LME Hourly record is missing or invalid.

B	You reported a LoadValue in the LME Hourly record. This field should be
blank for a non-operating hour.

Usage:

1	Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

Severity

Critical Error Level 1
Non-Critical Error

Environmental Protection Agency

Page 681 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-26

Check Name:	Check LME Load UOM

Related Former Checks:

Applicability:	LME Check

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

C

Usage:

1

2

Description

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.

Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
LME Emissions Data Generation Hourly Emissions Data

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 682 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-27

Check Name:	Check LME Fuel Code List

Related Former Checks:

Applicability:	LME Check

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

A	You did not report a value in the FuelCodeList in the LME Hourly record, Critical Error Level 1
but the unit operated during the hour.

Usage:

1	Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation

2	LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 683 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-28

Related Former Checks:
Applicability:

Check Name:

Calculate Heat Input for LME Unit
LME-EXP3B, LME-EXP9A
LME Check

Specifications:

\ucl

\fs20 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 .OperatingTime is greater than 0,

If LME Gen HI Method is equal to "MHHI" or Current LME Hourly Op Record .MHHIIndicator is equal to 1,

Locate all Monitor Default records for the hour and location where the Param e terCode 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 .OpTime, 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 .HourLoad 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

Environmental Protection Agency

Page 684 of 907


-------
Draft Check Specifications

12/16/2015

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 L TFF 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 L TFF 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 .HourLoad * 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 L TFF April 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 - 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 .OpTime / (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 . OpT ime /
(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 .HourLoad 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 * Cur rent LME Hourly Op Record .OpTime / LME Gen LTFF Total Op Time Array for
the location), and round the result to 1 decimal place.

Environmental Protection Agency

Page 685 of 907


-------
Draft Check Specifications

12/16/2015

If LME Calc Heat Input is not null,

If LME Calc Heat Input is greater than 999,999.9
If LME Gen Parameters contains "S02M",

set LME Gen Total S02M Array for location to -1.

If LME Gen Parameters contains "NOXM",

set LME Gen Total NOXM Array for location to -1.

If LME Gen Parameters contains "C02M",

set LME Gen Total C02M Array for location to -1.
set LME Calc Heat Input to null, LME Gen Total Heat Input Array for location to -1, and return result B.
else if LME Calc Heat Input is greater than or equal to 0,

LME Gen Heat Input Record .HourlD = Current LME Hourly Op Record .HourlD
LME Gen Heat Input Record .ParameterCode = "HIT"

LME Gen Heat Input Record AdjustedHourly Value = LME Calc Heat Input
If Current LME Hourly Op Record .MHHIIndicator 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
A

Description

You did not report a single, active, valid default record for MHHI in your
monitoring plan.

Severity

Critical Error Level 1

Environmental Protection Agency

Page 686 of 907


-------
Draft Check Specifications

12/16/2015

B	The value calculated for [param] in the LME Hourly record exceeds the	Critical Error Level 1

maximum value.

Usage:

1	LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 687 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-29

Check Name:	Calculate S02 Mass for LME Unit

Related Former Checks:	LME-EXP3C, LME-EXP9C

Applicability:	LME Check
Specifications:

\ucl

\fs20 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 .FuelCodeList is not null,

S02 Rate = 0
SO2 Fuel = null

For each FuelCode in the Current LME Hourly Op Record .FuelCodeList

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
to "LBMMBTU",

If S02 Rate is less than the DefaultValue in the retrieved record,

set SO2 Rate to the DefaultValue.

set S02 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 S02 Mass is greater than 99,999.9

set LME Gen Total S02M Array for location to -1, and return result B.

Otherwise,

LME Gen S02M Record .HourlD = Current LME Hourly Op Record .HourlD

LME Gen S02M Record .ParameterCode = "S02M"

LME Gen S02M Record .AdjustedHourlyValue = SO2 Mass

LME Gen S02M Record .FuelCode = SO2 Fuel

If LME Gen Total S02M Array for location is greater than or equal to 0,

Add SO2 Mass to LME Gen Total S02M Array for location.

Environmental Protection Agency

Page 688 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

Description

You did not report a single, active, valid [defparm] default record for
FuelCode [fuel] in your monitoring plan.

The value calculated for [param] in the LME Hourly record exceeds the
maximum value.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 689 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-30

Check Name:

Calculate NOX Mass for LME Unit

Related Former Checks: LME-EXP3A, LME-EXP9B

Applicability:
Specifications:

LME Check

\ucl

\fs20 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 .OpTime is greater than 0,

If Current LME Hourly Op Record .FuelCodeList is not null,

NOX Rate = 0
NOX Fuel = null

For each FuelCode in the Current LME Hourly Op Record .FuelCodeList

If Current LME Hourly Op Record .OperatingConditionCode 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 "NOR X ",
DefaultPurposeCd = " MD ", the OperatingConditionCode is equal to "U", and FuelCode is equal to the
current FuelCode.

else

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
to "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 .OperatingConditionCode is null,
return result A.

else

return result B.

Environmental Protection Agency

Page 690 of 907


-------
Draft Check Specifications

12/16/2015

If LME Calc Heat Input is not null and is greater than or equal to 0 AND NOXRate is greater than 0,
Calculate NOX Mass = LME Calc Heat Input * NOX Rate , and round the result to 1 decimal place.
If NOX Mass is greater than 99,999.9

set LME Gen Total NOXM Array for location to -1, and return result C.

Otherwise,

LME Gen NOXM Record .HourlD = Current LME Hourly Op Record .HourlD
LME Gen NOXM Record .ParameterCode = "NOXM"

LME Gen NOXM Record .AdjustedHourly Value = NOX Mass
LME Gen NOXM Record .FuelCode = NOX Fuel

LME Gen NOXM Record .OperatingConditionCode = Current LME Hourly Op Record
. OperatingConditionCode

If LME Gen Total NOXM Array for location is greater than or equal to 0,

Add NOX Mass to LME Gen Total NOXM Array for location.

If current date in the month of April,

Add NOX Mass to LME Gen April NOXM Array for location.

Results:

Result

Description

Severity

A

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.

Critical Error Level 1

B

Critical Error Level 1

C

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 691 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-31

Check Name:	Calculate C02 Mass for LME Unit

Related Former Checks:	LME-EXP3D, LME-EXP9D

Applicability:	LME Check
Specifications:

\ucl

\fs20 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 .FuelCodeList is not null,

C02 Rate = 0
C02 Fuel = null

For each FuelCode in the Current LME Hourly Op Record .FuelCodeList

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
to "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 C02 Mass = LME Calc Heat Input * C02 Rate , and round the result to 1 decimal place.

If CO2 Mass is greater than 99,999,999.9

set LME Gen Total C02M Array for location to -1, and return result B.

Otherwise,

LME Gen C02M Record .HourlD = Current LME Hourly Op Record .HourlD

LME Gen C02MRecord .ParameterCode = "C02M"

LME Gen C02M Record .AdjustedHourlyValue = CO2 Mass

LME Gen C02M Record .FuelCode = C02 Fuel

If LME Gen Total C02M Array for location is greater than or equal to 0,

Add CO2 Mass to LME Gen Total C02M Array for location.

Environmental Protection Agency

Page 692 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

Description

You did not report a single, active, valid [defparm] default record for
FuelCode [fuel] in your monitoring plan.

The value calculated for [param] in the LME Hourly record exceeds the
maximum value.

Severity

Critical Error Level 1
Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 693 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-32

Check Name:

Calculate HIT Summary Values

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 LME Summary Heat Input Record = null
If location is a com m on pipe,

tempHIT = LME Gen LTFFHeat 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 Record .ReportingPeriodld = current reporting period ID

LME Summary Heat Input Record ParameterCode = "HIT"

If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,

LME Summary Heat Input Record .CurrentReportingPeriodTotal = tempHIT - tempAprilHIT, rounded to 0 decimal

LME Summary Heat Input Record .CurrentReportingPeriodTotal = tempHIT, rounded to 0 decimal places.

If LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Heat Input Record .OzoneSeasonToDateTotal = tempHIT - tempAprilHIT, rounded to 0 decimal
places.

else if Quarter of Reporting Period is equal to 3,

LME Summary Heat Input Record .OzoneSeasonToDateTotal = tempHIT, rounded to 0 decimal places.

else if Quarter of Reporting Period is equal to 4 AND LME Year Start Quarter is less than 4 ,

Locate the Op Supp Data records for the location WHERE the reporting period is the third quarter of the Year of
the Reporting Period and OpTypeCode = "HIT".

If not found,

set LME Summary Heat Input Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

places.

else

Environmental Protection Agency

Page 694 of 907


-------
Draft Check Specifications

12/16/2015

LME Summary Heat Input Record .OzoneSeasonToDateTotal = OpValue in the retrived record.

if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,

Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of the Year of
the Reporting Period and OpTypeCode = "HITOS".

If not found,

set LME Summary Heat Input Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary Heat Input Record .OzoneSeasonToDateTotal.

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

Description

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or
more previous reporting periods. If you have submitted emissions data for
prior quarters, you should be able to retrieve these records by logging on to
the EPA host.

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 695 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-33

Check Name:

Calculate OPTIME Summary Values

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 LME Summary Op Time Record = null

If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,

LME Summary Op Time Record .MonLocId = current location ID
LME Summary Op Time Record .ReportingPeriodld = current reporting period ID
LME Summary Op Time Record .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 Record .CurrentReportingPeriodTotal = LME Gen Total Op Time Array for the location -
LME Gen April Op Time Array for the location.

LME Summary Op Time Record .CurrentReportingPeriodTotal = LME Gen Total Op Time Array for the location.

If LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Op Time Record .OzoneSeasonToDateTotal = 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 .OzoneSeasonToDateTotal = 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 Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

LME Summary Op Time Record .OzoneSeasonToDateTotal = OpValue in the retrived record.

if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,

Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of the current
year and OpTypeCode = "OSTIME".

If not found,

set LME Summary Op Time Record .OzoneSeasonToDateTotal to null.

Locate the Facility record for the location.

Environmental Protection Agency	Page 696 of 907

else


-------
Draft Check Specifications

12/16/2015

If the First ECMPS Reporting Period in the retrieved record is not null and is on or prior to the second quarter
of the current year,

return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary Op Time Record .OzoneSeasonToDateTotal.

If LME Gen Annual == true,

LME Summary Op Time Record .YearToDateTotal = LME Summary Op Time Record .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 =

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.

'OPTIME".

Results:

Result

Description

Severity

A

The program could not determine ozone-season-to-date totals for [osparam], Critical Error Level 1

because the Op Supp Data record for this parameter is missing for one or

more previous reporting periods. If you have submitted emissions data for

prior quarters, you should be able to retrieve these records by logging on to

the EPA host.

The program could not determine year-to-date for [param], because the Op Critical Error Level 1
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 697 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-34

Check Name:

Calculate OPHOURS Summary Values

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 LME Summary Op Hours Record = null

If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,
LME Summary Op Hours Record .MonLocId = current location ID
LME Summary Op Hours Record .ReportingPeriodld = current reporting period ID
LME Summary Op Hours Record .ParameterCode = "OP HOURS "

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.

LME Summary Op Hours Record .CurrentReportingPeriodTotal = LME Gen Total Op Hours Array for the location.

If LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary Op Hours Record .OzoneSeasonToDateTotal = 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 Record .OzoneSeasonToDateTotal = 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,

LME Summary Op Hours Record .OzoneSeasonToDateTotal = OpValue in the retrived record.

if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,

Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of the current
year and OpTypeCode = "OSHOURS".

If not found,

set LME Summary Op Hours Record .OzoneSeasonToDateTotal to null, and return result A.

else

set LME Summary Op Hours Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

Otherwise,

Environmental Protection Agency

Page 698 of 907


-------
Draft Check Specifications

12/16/2015

add OpValue in the retrieved record to LME Summary Op Hours Record .OzoneSeasonToDateTotal.

If LME Gen Annual == true,

LME Summary Op Hours Record .YearToDateTotal = LME Summary Op Hours Record
. CurrentReportingPeriodT otal.

If the quarter of the current reporting period is greater than the LME Year Start Quarter ,

For each reporting period in the year of the current reporting period and in a quarter that is on or after the LME
Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =
"OPHOURS".

If not found,

set LME Summary Op Hours Record .YearToDateTotal to null, and return result B.

Otherwise,

add OpValue in the retrieved record to LME Summary Op Hours Record .YearToDateTotal.

Results:

Result
A

B

Description

The program could not determine ozone-season-to-date totals for [osparam],
because the Op Supp Data record for this parameter is missing for one or
more previous reporting periods. If you have submitted emissions data for
prior quarters, you should be able to retrieve these records by logging on to
the EPA host.

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 699 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-35

Check Name:	Calculate S02M Summary Values

Related Former Checks:

Applicability:	LME Check

Specifications:

\ucl

\fs20 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 S02M Record .MonLocId = current location ID

LME Summary S02M Record .ReportingPeriodld = current reporting period ID

LME Summary S02M Record .ParameterCode = "S02M"

LME Summary S02M Record .CurrentReportingPeriodTotal = LME Gen Total S02M Array for the location / 2000,
rounded to one decimal place.

LME Summary S02MRecord .YearToDateTotal = LME Summary S02MRecord .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 S02M Record .YearToDateTotal to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary S02M Record .YearToDateTotal.

Results:

Result
A

Description

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 700 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-36

Check Name:	Calculate C02M Summary Values

Related Former Checks:

Applicability:	LME Check

Specifications:

\ucl

\fs20 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 C02M Record .MonLocId = current location ID

LME Summary C02M Record .ReportingPeriodld = current reporting period ID

LME Summary C02M Record .ParameterCode = "C02M"

LME Summary C02M Record .CurrentReportingPeriodTotal = LME Gen Total C02M Array for the location.

LME Summary C02MRecord .YearToDateTotal = LME Summary C02MRecord .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 = "C02M".

If not found,

set LME Summary C02M Record .YearToDateTotal to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary C02M Record .YearToDateTotal.

Results:

Result
A

Description

The program could not determine year-to-date for [param], because the Op
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

Severity

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 701 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-37

Check Name:

Calculate NOXM Summary Values

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 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 " NOX M" .

2)	MethodCode is equal to "LME" .

3)	BeginDate is on or before :

a)	May \lang9\f2\fs22 l\super st\langl033\nosupersub \fs20 of the year of the reporting period when the reporting period is
for the \lang9\f2\fs22 2\super nd\langl033\nosupersub \fs20 quarter AND LME Gen OS is equal to true .

b)	T he first day of the reporting period otherwise.

4)	EndDate is null or is on or after the last day of the reporting period.

If found,

LME Summary NOXM Record .MonLocId = current location ID

LME Summary NOXM Record .ReportingPeriodld = current reporting period ID

LME Summary NOXM Record .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 .CurrentReportingPeriodTotal = LME Gen Total NOXM Array for the location /
2000, rounded to one decimal place.

If LME Gen OS == true,

If Quarter of Reporting Period is equal to 2,

LME Summary NOXM Record .OzoneSeasonToDateTotal = (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 .OzoneSeasonToDateTotal = 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 ".

Environmental Protection Agency	Page 702 of 907

LME Summary NOXM Record .CurrentReportingPeriodTotal = (LME Gen Total NOXM Array for the location -
LME Gen April NOXM Array for the location) / 2000, rounded to one decimal place.

else


-------
Draft Check Specifications

12/16/2015

If not found,

set LME Summary NOXM Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

LME Summary NOXM Record .OzoneSeasonToDateTotal = OpValue in the retrived record.

if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,

Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of the
current year and OpTypeCode = "NOXMOS".

If not found,

set LME Summary NOXM Record .OzoneSeasonToDateTotal to null, and return result A.

Otherwise,

add OpValue in the retrieved record to LME Summary NOXM Record .OzoneSeasonToDateTotal.

If LME Gen Annual == true,

LME Summary NOXM Record .YearToDateTotal = LME Summary NOXM Record
. CurrentReportingPeriodT otal.

If the quarter of the current reporting period is greater than the LME Year Start Quarter ,

For each reporting period in the year of the current reporting period and in a quarter that is on or after the

LME Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =
"NOXM".

If not found,

set LME Summary NOXM Record .YearToDateTotal to null, and return result B.

Otherwise,

add OpValue in the retrieved record to LME Summary NOXM Record .YearToDateTotal.

Results:

Result

Description

Severity

A

The program could not determine ozone-season-to-date totals for [osparam], Critical Error Level 1

because the Op Supp Data record for this parameter is missing for one or

more previous reporting periods. If you have submitted emissions data for

prior quarters, you should be able to retrieve these records by logging on to

the EPA host.

The program could not determine year-to-date for [param], because the Op Critical Error Level 1
Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B

Usage:
1

LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 703 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 704 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-38

Check Name:

Calculate NOXR Summary Values

Related Former Checks:
Applicability:

LME Check

Specifications:

\ucl

\fs20 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 .MonLocId = current location ID
LME Summary NOXR Record .ReportingPeriodld = current reporting period ID
LME Summary NOXR Record ParameterCode = "NOXR"

If LME Summary NOXM Record .ReportingPeriodTotal = = 0

LME Summary NOXR Record .CurrentReportingPeriodTotal = 0

else

LME Summary NOXR Record .CurrentReportingPeriodTotal = LME Gen Total NOXM Array for the location /
LME Summary Heat Input Record .ReportingPeriodTotal, rounded to 3 decimal places.

If the quarter of the current reporting period is greater than the LME Year Start Quarter ,

If LME Summary Heat Input Record .YearToDateTotal is not null,

NOxTotal = LME Gen Total NOXM Array for the location.

For each reporting period in the year of the current reporting period and in a quarter that is on or after the
LME Year Start Quarter and is prior to the current reporting period.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =

If not found,

set LME Summary NOXR Record .YearToDateTotal to null, and return result A.

Otherwise,

NOXRValue = OpValue.

Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode =
"HIT".

If not found,

set LME Summary NOXR Record .YearToDateTotal to null, and return result B.

Otherwise,

'NOXR".

Environmental Protection Agency

Page 705 of 907


-------
Draft Check Specifications

12/16/2015

Add OpValue * \()\I^J ct I lie (rounded to 1 decimal) to NOxTotal.

If NOxTotal == 0,

LME Summary NOXR Record .YearToDateTotal = 0.

else

LME Summary NOXR Record .YearToDateTotal = NOxTotal / LME Summary Heat Input Record
.YearToDateTotal, rounded to 3 decimal places.

else

LME Summary NOXR Record YearToDateTotal = LME Summary NOXR Record
. CurrentReportingPeriodT otal.

Results:

Result	Description	Severity

A	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters,
you should be able to retrieve these records by logging on to the EPA host.

B	The program could not determine year-to-date for [param], because the Op Critical Error Level 1

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.

Usage:

1	LME Emissions Data Generation Summary Value Data

Environmental Protection Agency

Page 706 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-40

Check Name:

Check LME MHHI Indicator

Related Former Checks:
Applicability:

LME Check

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

Description

You reported a MHHIIndicator, but you did not report an active LTFF heat
input method with a SubstituteDataCode of "MHHI".

Severity

A

Critical Error Level 1

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 707 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-41

Check Name:	Check LTFF Fuel Flow Period Code

Related Former Checks:

Applicability:	LME Check

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.

Results:

Result	Description

A	You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This

value is required for LME units with an ozone-season qualification during
the second quarter.

B	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this

value is only appropriate during the second quarter.

C	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this

value is only appropriate for LME units with an ozone-season qualification.

Usage:

1	Emissions Data Evaluation Report — Long Term Fuel Flow

Severity

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 708 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-42

Check Name:

Check LTFF Total Heat Input

Related Former Checks:
Applicability:

LME Check

Specifications:

For the Current LTFF record:

If LME Gen LTFF Heat Input is not null,

If LME Total Heat Input Array for the location is greater than or equal to 0,

add LME Gen LTFF Heat Input to LME Total Heat Input Array for the location.

If LME OS is true and the Current LTFF Record .FuelFlowPeriodCode is equal to "A",

add LME Gen 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 LTFF Record .FuelFlowPeriodCode is equal to "A",

else

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 .TotalHeatlnput is greater than or equal to 0,

If (the LocationName begins with "CP" AND Rpt Period HI Reported Accumulator Array for this location is greater
than or equal to 0)

Rpt Period HI Reported Accumulator Array for this location = Rpt Period HI Reported Accumulator Array for
this location + Current LTFF Record .TotalHeatlnput

If LME Gen LTFF Heat Input is not null AND Current LTFF Record .TotalHeatlnput 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"

add LME Gen LTFF Heat Input to LME CP April Heat Input.

Environmental Protection Agency

Page 709 of 907


-------
Draft Check Specifications

12/16/2015

else

if (ABS( Current LTFFRecord .TotalHeatlnput - LME Gen LTFFHeat Input) > Heat Input Tolerance )
return result A.

If (the LocationName begins with "CP")

Rpt Period HI Reported Accumulator Array for this location = -1.
return result B

Results:

Result
A

B

Usage:

1

Description

Severity

The TotalHeatlnput reported in the LTFF record for [key] is inconsistent with Critical Error Level 1
the recalculated value.

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

Emissions Data Evaluation Report — Long Term Fuel Flow

Environmental Protection Agency

Page 710 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-43

Check Name:	Check LTFF Fuel Flow Period Code

Related Former Checks:

Applicability:	LME Check

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

A	You reported a FuelFlowPeriodCode in the LTFF record for [key], but this Critical Error Level 1

value is only appropriate during the second quarter.

Usage:

1	Emissions Data Entry Screen Evaluation LTFF Data Evaluation

Environmental Protection Agency

Page 711 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

LME-44

Check Name:

Check Fuel Codes against LTFF Records

Related Former Checks:
Applicability:

LME Check

Specifications:

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

Description

Severity

A

You did not report a Long Term Fuel Flow record for a fuel flow system for Critical Error Level 1
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.

Usage:
1

LME Emissions Data Generation Hourly Emissions Data

Environmental Protection Agency

Page 712 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	LME-45

Check Name:	Duplicate LTFF Record

Related Former Checks:

Applicability:	LME Check

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	Description

A	Another [recordtype] record already exists with the same [fieldnames]

Usage:

1	LME Emissions Data Generation LTFF Heat Input Data

Seventy
Fatal

Environmental Protection Agency

Page 713 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-1

Check Name:

Initialize HGRE Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 6.24 x 10 A -11
CurrentDh v Parameter = MatsHgDhv Parameter
CurrentDhvRecordValid = MatsHgDh v ValidD.

MatsDh v Record = MatsHgDh v Record

Mats Mil vCalculated Value = Mats Mil vCalculatedHgc VtdueD.
MatsMh v Record = MatsHgcMh v Record
MatsMoistureEquationList = \{A-3\}
MatsDhvMeasuredModcList to \{36, 39\}

MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS Hg RE Calculation Verification

Environmental Protection Agency

Page 714 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-2

Check Name:

Initialize HCLRE Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 9.43 x 10 A -8
CurrentI)h v Parameter = MatsHclDhvParameter
CurrentDhvRecordValid = MatsHclDhvValidxD.

MatsDh v Record = Mats Hcl Dh vRecordSl
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValueM2
MatsMh v Record = MatsHclcMhvRecord\S2
MatsMoistureEquationList = \{HC-3\}
MatsDhvMeasuredModcList to \{36, 39\}
MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification

Environmental Protection Agency

Page 715 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-3

Check Name:

Initialize HFRE Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 5.18 x 10 A -8

CurrentDh v Parameter = MatsHfDh v Parameter

CurrentDhvRecordValid = MatsHfDh v ViitidFl

MatsDh v Record = Mats Hf Dh vRecordSl

Mats Mil vCalculated Value = Mats Mil vCalculatedHfc VcducD.

MatsMh v Record = MatsHfcMhvRecord\S2

MatsMoistureEquationList = \{HF-3\}

MatsDhvMeasuredModcList to \{36, 39\}

MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS HF RE Calculation Verification

Environmental Protection Agency

Page 716 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 1.66 x 10 A -7
CurrentI)h v Parameter = MatsSo2I)hv Parameter
CurrentDhvRecordValid = MatsSo2DhvValicM2
MatsDh v Record = Mats So2 Dh vRecordSl
MatsMoistureEquationList = \{S-3\}
MatsDhvMeasuredModcList to \{36, 39\}
MatsDhvUnavailableModcList to \{38\}

Usage:

1	Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

MATSCHV-4

Initialize S02RE Calculated Hourly Data

Environmental Protection Agency

Page 717 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-5

Check Name:

Initialize HGRH Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 6.24 x 10 A -11

CurrentI)h v Parameter = MatsHgDhv Parameter

CurrentDhvRecordValid = MatsHgDh v ValidD.

MatsDh v Record = MatsHgDhvRecordsD.

Mats Mil vCalculated Value = Mats Mil vCalculatedHgc VtdueD.

MatsMh v Record = MatsHgcMhvRecordSl

MatsMoistureEquationList = \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9\}
MatsDhvMeasuredModcList to \{36, 37\}
MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS Hg RH Calculation Verification

Environmental Protection Agency

Page 718 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-6

Check Name:

Initialize HCLRH Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 9.43 x 10 A -8
CurrentI)h v Parameter = MatsHclDhvParameter
CurrentDhvRecordValid = MatsHclDhvValidxD.

MatsDh v Record = Mats Hcl Dh vRecordSl
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValueM2
MatsMh v Record = MatsHclcMhvRecord\S2

MatsMoistureEquationList = \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9Y}
MatsDhvMeasuredModcList to \{36, 37\}
MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS HC1RH Calculation Verification

Environmental Protection Agency

Page 719 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-7

Check Name:

Initialize HFRH Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 5.18 x 10 A -8

CurrentDh v Parameter = MatsHfDh v Parameter

CurrentDhvRecordValid = MatsHfDh v ViitidFl

MatsDh v Record = Mats Hf Dh vRecordSl

Mats Mil vCalculated Value = Mats Mil vCalculatedHfc VcducD.

MatsMh v Record = MatsHfMh v Record

MatsMoistureEquationList = \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9Y}
MatsDhvMeasuredModcList to \{36, 37\}
MatsDhvUnavailableModcList to \{38\}

Usage:
1

Emissions Data Evaluation Report	MATS HF RH Calculation Verification

Environmental Protection Agency

Page 720 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-8

Check Name:

Initialize S02RH Calculated Hourly Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConversionFactor = 1.66 x 10 A -7
CurrentI)h v Parameter = MatsSo2I)hv Parameter
CurrentDhvRecordValid = MatsSo2DhvValicM2
MatsDh v Record = Mats So2 Dh vRecordSl

MatsMoistureEquationList = \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9Y}
MatsDhvMeasuredModcList to \{36, 37\}
MatsDhvUnavailableModcList to \{38\}

\sa200\sl276\slmultl

Usage:
1

Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

Environmental Protection Agency

Page 721 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSCHV-9

Check Name:	Determine the Calculation Concentration for a MATS Parameter

Related Former Checks:

Applicability:

Specifications:

\ucl

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

Usage:

1

Emissions Data

Evaluation

2

Emissions Data

Evaluation

3

Emissions Data

Evaluation

4

Emissions Data

Evaluation

5

Emissions Data

Evaluation

6

Emissions Data

Evaluation

Report	MATS HC1 RE Calculation Verification

Report	MATS HC1RH Calculation Verification

Report	MATS HF RE Calculation Verification

Report	MATS HF RH Calculation Verification

Report	MATS Hg RE Calculation Verification

Report	MATS Hg RH Calculation Verification

Environmental Protection Agency

Page 722 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-10

Check Name:

Determine the Calculation Concentration for S02

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationConcentration = null
CalculationConcentrationSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord .ModcCode in MatsDhvMeasuredModcList)
If CurrentSo2MonitorHourlyRecord is not null

CalculationConcentration = CurrentSo2MonitorHourlyRecord .UnadjustedHourlyValue
If ( CurrentSo2MonitorHourlyRecord .ModcCode in set \{05, 06, 07, 08, 09, 10, 12, 13, 15, 18, 23, 55\})
CalculationConcentrationSubstituted = true

Usage:
1

Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

2

Environmental Protection Agency

Page 723 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSCHV-11

Check Name:	Determine the Calculation Flow

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationFlow = null
CalculationFlowSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord .ModcCode in MatsDhvMeasuredModcList)
If ( CurrentStackFlowHourlyRecord is NOT null)

CalculationFlow = CurrentStackFlowHourlyRecord .UnadjustedHourlyValue
If ( CurrentStackFlowHourlyRecord .ModcCode \f2 not in set \{01, 02, 03, 04, 20, 53, \f2 54\})
CalculationFlowSubstituted = true\f2

Else

CalculationFlow = null
CalculationFlowSubstituted = false

Usage:

1	Emissions Data Evaluation

2	Emissions Data Evaluation

3	Emissions Data Evaluation

4	Emissions Data Evaluation

Report	MATS HC1 RE Calculation Verification

Report	MATS HF RE Calculation Verification

Report	MATS Hg RE Calculation Verification

Report	MATS S02 RE Calculation Verification

Environmental Protection Agency

Page 724 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSCHV-12

Check Name:	Determine the Calculation Diluent Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationDiluent = null
CalculationDiluentSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord .ModcCode in MatsDhvMeasuredModcList)

If (MatsDhvRecord .EquationCode in set \{ 19-3D, 19-5D\} OR MatsDhvRecord .ModcCode == 37 )

\f2

If (MatsDhvRecord .EquationCode \f2 in set \{ 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 .DefaultValue is NULL OR 02MonitorDefaultRecord .DefaultValue <= 0)
return result C

Else

CalculationDiluent = 02MonitorDefaultRecord .DefaultValue
V£2

E\f2 lse if (MatsDhvRecord .EquationCode \f2 in set \{ 19-6, 19-7, 19-8, 19-9\})

Co2MonitorDefaultMatches = count of MonitorDefaultRecordsByHourLocation where:

1)	ParameterCode = "\f2 C02N "

2)	DefaultPurposeCode = "DC"

3)	FuelCode = "NFS"

V£2

Environmental Protection Agency	Page 725 of 907


-------
Draft Check Specifications

12/16/2015

IV£2 f ( Co2MonitorDefaultMatches \f2 > 1 )\f2

return result D
E\f2 lse if (Co2MonitorDefaultMatches \f2 = =\f2 0 )\f2

return result E
EVE lse

C o\f2 2MonitorDefaultRecord = the single matched record

IVf2 f (C o\f2 2MonitorDefaultRecord .DefaultValue is NULL OR C o\f2 2MonitorDefaultRecord
.DefaultValue <= 0)

return result F

EVf2 lse

CalculationDiluent \f2 = C o\f2 2MonitorDefaultRecord .DefaultValue

Else

If (MatsDhvRecord .EquationCode in set V{ 19-1, 19-4V} AND 02DryNeededForMats == true)

CalculationDiluent = 02DryCalculatedAdjustedValue
If ( 02DryModc not in set Vf2V{01, 02, 03, 04, 17, 20, 53, Vf2 54V} )Vf2
CalculationDiluentSubstituted = true
Else if (MatsDhvRecord .EquationCode in set V{ 19-2, 19-3, 19-5V} AND ()2 WetNeededFor Mats == true)
CalculationDiluent = 02WetCalculatedAdjustedValue
If ( 02WetModc not in set Vf2V{01, 02, Vf2 03, 04, 17, 20, 53, Vf2 54V} )Vf2
CalculationDiluentSubstituted = true
Else if (MatsDhvRecord .EquationCode in set V{ 19-6, 19-7, 19-8, 19-9V} AND Co2DiluentNeededForMats == true)
CalculationDiluent = Co2cMhvCalculatedAdjustedValue
If ( Co2cMhv Mode not in set Vf2V{01, 02, Vf2 03, 04, 17, 20, 21, 53, Vf2 54V} )Vf2
CalculationDiluentSubstituted = true

Results:

Result
A

B

C

D

E

Description

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.

Severity

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

Environmental Protection Agency

Page 726 of 907


-------
Draft Check Specifications

12/16/2015

F	The DefaultValue reported in the active Default record for C02N in your	Critical Error Level 1

monitoring plan is invalid. The value must be greater than 0.

Usage:

1	Emissions Data Evaluation Report	MATS HC1RH Calculation Verification

2	Emissions Data Evaluation Report	MATS HF RH Calculation Verification

3	Emissions Data Evaluation Report	MATS Hg RH Calculation Verification

4	Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

Environmental Protection Agency

Page 727 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculationMoisture = null
CalculationMoistureSubstituted = false

If CurrentDhvRecordValid AND (MatsDhvRecord .ModcCode in MatsDhvMeasuredModcList)

If (MatsDhvRecord EquationCode in MatsMoistureEquationList)

If (H2oMethodCode is equal to "MWD") AND H2oDerivedHourlyChecksNeeded AND (
H2oDhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oDhvCalculatedAdjustedValue

If (H2oDhvModc not in set \£2\{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, \f2 54, 55\})

CalculationMoistureSubstituted = true

Else if (H2oMethodCode in set \{MMS, MTB\}) AND H2oMonitorHourlyChecksNeeded AND (
H2oMhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oMhvCalculatedAdjustedValue

If (H2oMhvModc not in set \£2\{01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, \f2 54, 55\})

CalculationMoistureSubstituted = true

Else if (H2oMethodCode is equal to "MDF") AND H2oDerivedHourlyChecksNeeded AND (
H2oDhvCalculatedAdjustedValue is not null)

CalculationMoisture = H2oDhvCalculatedAdjustedValue

If (H2oDhvModc not in set \£2\{01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, YE2 54, 55\})

CalculationMoistureSubstituted = true

Else if (H2oMethodCode is equal to "MDF") AND (H2oDerivedHourlyChecksNeeded is false) AND (
H2oDefaultValue is not null)

CalculationMoisture = H2oDefaultValue

MATSCHV-13

Determine the Calculation Moisture

Usage:

1	Emissions Data Evaluation

2	Emissions Data Evaluation

3	Emissions Data Evaluation

4	Emissions Data Evaluation

5	Emissions Data Evaluation

6	Emissions Data Evaluation

Report	MATS HC1 RE Calculation Verification

Report	MATS HC1RH Calculation Verification

Report	MATS HF RE Calculation Verification

Report	MATS HF RH Calculation Verification

Report	MATS Hg RE Calculation Verification

Report	MATS Hg RH Calculation Verification

Environmental Protection Agency

Page 728 of 907


-------
Draft Check Specifications	12/16/2015

7	Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

8	Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

Environmental Protection Agency

Page 729 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSCHV-14

Check Name:	Check MODC and determine the MATS Formula Calculated Unadjusted Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CalculatedUnadjustedValue = null
If CurrentDh v Record V(didSl

If (MatsDhvRecord. ModcCode in MatsDhvMeasuredModcList)

\f2

If (MatsDhvRecord .EquationCode is NOT null)

\£2

If (MatsDhvRecord EquationCode 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 = CalculationConversionFactor * CalculationConcentration *
CalculationFlow * (1 - CalculationMoisture ))

\f2
Else\f2

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
\£2

Else // Unavailable MODC

Environmental Protection Agency

Page 730 of 907


-------
Draft Check Specifications

12/16/2015

\f2

If (MatsDhvRecord .EquationCode is NOT null)
return result E

Results:

Result
A

B

C

D

Description

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

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

You reported an incorrect MODCCode in the MATS Derived Hourly Value
record for [param], as you reported measured data for essential auxiliary
parameters.

Severity

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

Usage:

1	Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification

2	Emissions Data Evaluation Report	MATS HF RE Calculation Verification

3	Emissions Data Evaluation Report	MATS Hg RE Calculation Verification

4	Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

Environmental Protection Agency

Page 731 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-15

Check Name:

Related Former Checks:

Check MODC and determine the Formula 19 Calculated Unadjusted Value

Applicability:
Specifications:

\ucl

\fs20 CalculatedUnadjustedValue = null

If CurrentDhvRecordValid

If (MatsDhvRecord. ModcCode in MatsDhvMeasuredModcList)

If (MatsDhvRecord .EquationCode is NOT null)

Case (MatsDhvRecord .EquationCode )

19-1" :

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

Else i f ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFdFactor Exists

is false)\f2

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

Else

Environmental Protection Agency

Page 732 of 907


-------
Draft Check Specifications

12/16/2015

return result F

If ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFwFactor Exists

is false) OR (MoistureFraction is null)

return result C

Else if ( CalculationDiluent is equal to 20.9 * (1 - MoistureFraction ))
return result D

Else

CalculatedUnadjustedValue = CalculationConversionFactor * CalculationConcentration *
CurrentHourlyOpRecord .FwFactor * [20.9 / (20.9 *(1 - MoistureFraction ) -
CalculationDiluent)]

"19-3":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR CalculationMoisture
Substituted

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 .FdFactor * (20.9 / denom)

"19-3D":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR CalculationMoisture
Substituted

return result A

Else if ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFdF actor 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 )

Environmental Protection Agency

Page 733 of 907


-------
Draft Check Specifications

12/16/2015

CalculatedUnadjustedValue = CalculationConversionF'actor * CalculationConcentration *
CurrentHourlyOpRecord .FdFactor *(20.9 / denom )

"19-4":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR CalculationMoisture
Substituted

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 = CalculationConversionFactor * ( CalculationConcentration *
CurrentHourlyOpRecord .FdFactor / ((100 - CalculationMoisture ) / 100.0)) * (20.9 / (20.9 -
CalculationDiluent))

"19-5":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR CalculationMoisture
Substituted

return result A

Else if ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFdF actor 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 .FdFactor * 20.9 / denom

"19-5D":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A

Else if ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFdF actor Exists
is false)

return result C

Else if ( CalculationDiluent is equal to 20.9)

return result D

Environmental Protection Agency

Page 734 of 907


-------
Draft Check Specifications

12/16/2015

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 ( ValidFcFactor Exists
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 CalculationMoisture
Substituted

return result A

Else if ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFcF actor 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 * (( CalculationConcentration *
CurrentHourlyOpRecord .FcFactor) /((100 - CalculationMoisture ) / 100.0) )* (100.0 /
CalculationDiluent)

"19-9":

If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR CalculationMoisture
Substituted

return result A

Else if ( CalculationDiluent is null) OR ( CalculationConcentration is null) OR ( ValidFcF actor Exists
is false) OR ( CalculationMoisture is null)

return result C

Else if ( CalculationDiluent is equal to 0.0)

return result D

Environmental Protection Agency

Page 735 of 907


-------
Draft Check Specifications

12/16/2015

Else

h2oFactor = (100 - CalculationMoisture ) / 100.0
co2Term = 100.0 / CalculationDiluent

CalculatedUnadjustedValue = CalculationConversionFactor * CalculationConcentration *
CurrentHourlyOpRecord .FcFactor * h2oFactor * co2Term\D.

Else

return result B

Else

If (MatsDhvRecord .EquationCode is NOT null)
return result B

Results:

Result
A

B

C

D

F

Usage:

1

2

3

4

Description

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

Emissions Data Evaluation Report	MATS HC1RH Calculation Verification

Emissions Data Evaluation Report	MATS HF RH Calculation Verification

Emissions Data Evaluation Report	MATS Hg RH Calculation Verification

Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

Environmental Protection Agency

Page 736 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-16

Check Name:

Stash Hg Calculated Value

Related Former Checks:

Applicability:

Specifications:

\ucl

Xfs20 MatsCalculatedHgRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)

Usage:
1

Emissions Data Evaluation Report	MATS Hg RE Calculation Verification

Emissions Data Evaluation Report	MATS Hg RH Calculation Verification

2

Environmental Protection Agency

Page 737 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-17

Check Name:

Stash HC1 Calculated Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsCalculatedHclRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)

Usage:
1

Emissions Data Evaluation Report	MATS HC1 RE Calculation Verification

Emissions Data Evaluation Report	MATS HC1RH Calculation Verification

2

Environmental Protection Agency

Page 738 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-18

Check Name:

Stash HF Calculated Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsCalculatedHfRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)

Usage:
1

Emissions Data Evaluation Report	MATS HF RE Calculation Verification

Emissions Data Evaluation Report	MATS HF RH Calculation Verification

2

Environmental Protection Agency

Page 739 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSCHV-19

Check Name:

Stash S02 Calculated Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsCalculatedSo2RateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)

Usage:
1

Emissions Data Evaluation Report	MATS S02 RE Calculation Verification

Emissions Data Evaluation Report	MATS S02 RH Calculation Verification

2

Environmental Protection Agency

Page 740 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-1

Check Name:

Initialize HGRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CurrentI)h vParameter = "HGRE"

MatsDh v Record = MatsHgDh v Record
MatsEquationCodeWithH2o = "A-3"

\sa200\sl276\slmultl MatsEquationCodeWithoutH2o = "A-2"
\fs24

Usage:
1

Emissions Data Evaluation Report	MATS Hg RE Derived Hourly Evaluation

Environmental Protection Agency

Page 741 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-2

Check Name:

Initialize HGRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "HGRH"

\ltrpar\sa200\sl276\slmultl MatsDhvRecord = MatsHgDhvRecord\fs24

Usage:
1

Emissions Data Evaluation Report	MATS Hg RH Derived Hourly Evaluation

Environmental Protection Agency

Page 742 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-3

Check Name:

Initialize HCLRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "HCLRE"

MatsDh v Record = MatsHctDh v Record
MatsEquationCodeWithH2o = "HC-3"

\ltrpar\sa200\sl276\slmultl MatsEquationCodeWithoutH2o = "HC-2"
\ltrpar\f2

Usage:
1

Emissions Data Evaluation Report	MATS HC1 RE Derived Hourly Evaluation

Environmental Protection Agency

Page 743 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-4

Check Name:

Initialize HCLRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "HCLRH"
\ltrpar\sa200\sl276\slmultl MatsDhvRecord = MatsHclDhvRecord
\ltrpar \fs24

Usage:

Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation

Environmental Protection Agency

Page 744 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-5

Check Name:

Initialize HFRE Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "HFRE"

MatsDh v Record = MatsHfDh v Record
MatsEquationCodeWithH2o = "HF-3"

\ltrpar\sa200\sl276\slmultl MatsEquationCodeWithoutH2o = "HF-2"

Usage:
1

Emissions Data Evaluation Report	MATS HF RE Derived Hourly Evaluation

Environmental Protection Agency

Page 745 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-6

Check Name:

Initialize HFRH Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "HFRH"
\ltrpar\sa200\sl276\slmultl MatsDhvRecord = MatsHfDhvRecord

Usage:
1

Emissions Data Evaluation Report	MATS HF RH Derived Hourly Evaluation

Environmental Protection Agency

Page 746 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-7

Check Name:

Initialize S02RE Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "S02RE"

MatsDh v Record = MatsSo2I)h v Record
\ltrpar MatsEquationCodeWithH2o = "S-3"

\ltrpar\sa200\sl276\slmultl MatsEquationCodeWithoutH2o = "S-2"

Usage:
1

Emissions Data Evaluation Report	MATS S02 RE Derived Hourly Evaluation

Environmental Protection Agency

Page 747 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-8

Check Name:

Initialize S02RH Derived Hourly Value Data

Related Former Checks:

Applicability:

Specifications:

\ucl

\ltrpar \fs20 CurrentI)h vParameter = "S02RH"
\ltrpar\sa200\sl276\slmultl MatsDhvRecord = MatsSo2DhvRecord

Usage:
1

Emissions Data Evaluation Report	MATS S02 RH Derived Hourly Evaluation

Environmental Protection Agency

Page 748 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSDHV-9

Check Name:	Check Mats MODC in DHV Records

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 DerivedHourlyModcStatus = false
If Mats DhvRecord. ModcCode not in set \{36, 37, 38, 39\}
return result A
Else

DerivedHourlyModcStatus = true

\f2

Results:

Result
A

Usage:

1

2

3

4

5

6

7

Description

You reported an MODC code that is not valid for the MATS DHV.

Severity

Critical Error Level 1

Emissions
Emissions
Emissions
Emissions
Emissions
Emissions
Emissions
Emissions

Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

HC1 RE Derived Hourly Evaluation
HC1RH Derived Hourly Evaluation
HF RE Derived Hourly Evaluation
HF RH Derived Hourly Evaluation
Hg RE Derived Hourly Evaluation
Hg RH Derived Hourly Evaluation
S02 RE Derived Hourly Evaluation
S02 RH Derived Hourly Evaluation

Environmental Protection Agency

Page 749 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MAT SDH V-10

Check Name:

Check Formula in MATS DHV Record

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 DerivedHourlyFormulaStatus = false
If (DerivedHourlyModcStatus = true)

If (MatsDhvRecord .FormulaKey is null)

\fi45 If MatsDhvRecord .ModcCode = "38"

\fi45 DerivedHourlyFormulaStatus = true
\fi630 else

\fi630 return result A
else //FormulaKey not null

If (MatsDhvRecord .ModcCode in set \{36, 37, 39\} )

If (MatsDhvRecord.FormulaActivelnd is NOT equal to 1)
return result B

Else if (MatsDhvRecord .FormulaParameterCode is not equal to CurrentDh vParameter)
return result C

Else if ( CurrentDhvParameter in set \{"HGRE", "HCLRE", "HFRE", "S02RE"\} and MatsDhvRecord
.ModcCode = "37"\f2

return result D

Else if ( CurrentDh vParameter in set \{"HGRH", "HCLRH", "HFRH", "S02RH"\} and MatsDhvRecord
.ModcCode = "39"\f2

return result E

Else

DerivedHourlyFormulaStatus = true
\fi720 else //other MODC code (38)

\fi720 return result F

Results:

Result

Description

You did not report a FormulalD in the MATS DHV record for [param].

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.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Environmental Protection Agency

Page 750 of 907


-------
Draft Check Specifications

12/16/2015

C
D

E
F

Usage:

1

2

3

4

5

6

7

You reported FormulalD [ID] in the MATS DHV record for [param], but in
your monitoring plan this formula has a different ParameterCode.

You reported a MODCCode of 37 for the MATS DHV record, but the use of
a diluent cap value is not applicable to [param].

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

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Emissions
Emissions
Emissions
Emissions
Emissions
Emissions
Emissions
Emissions

Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation
Data Evaluation

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

Report	MATS

HC1 RE Derived Hourly Evaluation
HC1RH Derived Hourly Evaluation
HF RE Derived Hourly Evaluation
HF RH Derived Hourly Evaluation
Hg RE Derived Hourly Evaluation
Hg RH Derived Hourly Evaluation
S02 RE Derived Hourly Evaluation
S02 RH Derived Hourly Evaluation

Environmental Protection Agency

Page 751 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MAT SDH V-11

Check Name:

Check Equation Code for MATS RE

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 DerivedHourlyEquationStatus = false
If (Derive\f2 d Hourly\f2 Formula Status == true)

If ( MatsDhvRecordSl .EquationCode is not null)

If ( MatsDhvRecordSl EquationCode == 1/2 MatsEquationCodeWithoutH2o )
DerivedHourlyEquationStatus = true
FlowMonitorHourlyChecksNeeded = true

Else If ( MatsDhvRecordSl EquationCode == 1/2 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\f2

Results:

Result

Description

You reported a formula code that does not match any of the MATS derived
hourly value formulas.

Severity

A

Critical Error Level 1

Usage:
1

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

2

3

4

Environmental Protection Agency

Page 752 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 DerivedHourly E quationStatus = false
\£2

If (DerivedHourly FormulaStatusXf2 == true)

\fi720 If (MatsDhvRecord .EquationCode \f2 is not null)

\fi720 If (MatsDhvRecord .EquationCode\f2 in set \{ 19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D, 19-6, 19-7, 19-8, 19-9Y})
\fi720 DerivedHourl y EquationStatus\f2 = true
\fi720 If (MatsDhvRecord .EquationCode\f2 in set \{ 19-1, 19-4\} )

\fi720 02DryNeededForMats = true
FDFactorNeeded = true
\fi720 Else if (MatsDhvRecord .EquationCode\f2 in set \{ 19-3,19-3D, 19-5, 19-5D\} )

\fi720 ()2 WetNeeded For Mats = true
FDFactorNeeded = true
\fi720

Else if (MatsDhvRecord .EquationCode\f2 in set \{ 19-2\} )

\fi720 ()2 WetNeeded For Mats = true
FWFactorNeeded = true
\fi720 Else if (MatsDhvRecord .EquationCode\f2 in set \{ 19-6, 19-7, 19-8, 19-9\} )

C02DiluentNeededForMats = true
\fi720 FCFactor Needed = true
\fi720 If (MatsDhvRecord .EquationCode\f2 in set \{ 19-3, 19-3D, 19-4, 19-5, 19-8, 19-9\}

\fi720 MoistureNeeded = true
\fi720 Else

\fi720 return result A
\fi720
Else

\fi720 DerivedHourlyEquationStatusSl = true

MATSDHV-12

Check Equation Code for MATS RH

Environmental Protection Agency

Page 753 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

Usage:

1

2

3

4

Description

You reported a formula code that does not match any of the MATS derived
hourly value formulas.

Severity

Critical Error Level 1

Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS HF RH Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg RH Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS S02 RH Derived Hourly Evaluation

Environmental Protection Agency

Page 754 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-13

Check Name:

Complete HGRE and HGRH Derived Hourly Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsHgDhvParameter = CurrentI)hv Parameter

MatsHgDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus

Usage:
1

Emissions Data Evaluation Report	MATS Hg RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg RH Derived Hourly Evaluation

2

Environmental Protection Agency

Page 755 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-14

Check Name:

Complete HCLRE and HCLRH Derived Houly Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 Mats He!I)h v Parameter = CurrentI)h v Parameter

MatsHclDlivValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus

Usage:
1

Emissions Data Evaluation Report	MATS HC1 RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation

2

Environmental Protection Agency

Page 756 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-15

Check Name:

Complete HFRE and HFRH Derived Hourly Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsHfDhv Parameter = CurrentI)h v Parameter

MatsHfDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus

Usage:
1

Emissions Data Evaluation Report	MATS HF RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS HF RH Derived Hourly Evaluation

2

Environmental Protection Agency

Page 757 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSDHV-16

Check Name:

Complete S02RE and S02RH Derived Hourly Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsSo2I)hv Parameter = CurrentI)h v Parameter

MatsSo2DhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus

Usage:
1

Emissions Data Evaluation Report	MATS S02 RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS S02 RH Derived Hourly Evaluation

2

Environmental Protection Agency

Page 758 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSDHV-17

Check Name:	Check Unadjusted Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 DerivedHourlyUnadjustedValueStatus = false
If (DerivedHourlyModcStatus = true)

If (MatsDhvRecord .ModcCode in set \{36, 37, 39 \})

If (MatsDhvRecord .UnadjustedHourlyValue is null)
return result A

Else if (MatsDhvRecordvf2 .UnadjustedHourlyValue is NOT reported in scientific notation to three significant digits)
return result B

Else i\f2 f (MatsDhv\f2 Record .UnadjustedHourlyValue <\f2 0)
return result C

Else

DerivedHourlyUnadjustedValueStatus = true\f2
Else // MODC 38

If (MatsDhvRecord .UnadjustedHourlyValue is not null)
return result D

Else

DerivedHourlyUnadjustedValueStatus = true\f2

Results:

Result

A

B

C
D

Usage:

1

2

Description

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

Critical Error Level 1
Critical Error Level 2

Emissions Data Evaluation Report	MATS HC1 RE Derived Hourly Evaluation

Emissions Data Evaluation Report	MATS HC1RH Derived Hourly Evaluation

Environmental Protection Agency

Page 759 of 907


-------
Draft Check Specifications

12/16/2015

3	Emissions Data Evaluation Report

4	Emissions Data Evaluation Report

5	Emissions Data Evaluation Report

6	Emissions Data Evaluation Report

7	Emissions Data Evaluation Report

8	Emissions Data Evaluation Report

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

Environmental Protection Agency

Page 760 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSGFM-1

Check Name:

Component ID Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsHourlyGFMComponentldValid = false.
Set MatsSamplingTrainRecord to null.
Set MatsSamplingTrainQaStatus to null.
Set MatsSorbentTrapBeginDateHour to null.
Set MatsSorbentTrapEndDateHour to null.
Set MatsSamplingTrainCount to null.

\fi45

If the MatsHourlyGFMRecord .ComponentID is null,
Return result A.

Locate MatsSamplingTrainRecords where:

1)	Componentld is equal to MatsHourlyGFMRecord .ComponentID

2)	SorbentTrapBeginDateHour is on or before CurrentDateHour \f2

3)	SorbentTrapEndDateHour is on or after CurrentDateHour \f2

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)	SorbentTrapForQuarterBorder is 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 MatsSamplingTrainRecord .TrainQAStatusCode .

Environmental Protection Agency	Page 761 of 907

Else


-------
Draft Check Specifications

12/16/2015

Set MatsSorbentTrapBeginDateHour to MatsSamplingTrainRecord .BeginDateHour.
Set MatsSorbentTrapEndDateHour to MatsSamplingTrainRecord .EndDateHour.

Results:

Result
A

B

Usage:

1

Description

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

Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 762 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSGFM-2

Check Name:

Begin and End Hour Flags Valid

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 If MatsHourlyGFMComponentldValid is true,

If HourlyGFMData .BeginEndHourFlag is \ldblquote I\rdblquote ,

\fi-720\tab If Current DateHour is not equal to the MatsSorbentTrapBeginDateHour and is not the hour after the
MatsSorbentTrapBeginDateHour .

\tab\tab Return result A

\fi720

Else if the HourlyGFMData .BeginEndHourFlag is \ldblquote F\rdblquote ,

\fi-720\tab If Current DateHour is not equal to the MatsSorbentTrapEndDateHour and is not the hour before the
MatsSorbentTrapEndDateHour,

Else if HourlyGFMData .BeginEndHourFlag is null,

\fi-720\tab If Current DateHour is on the MatsSorbentTrapBeginDateHour,
\tab\tab Return result C.

Else if Current DateHour is on the MatsSorbentTrapEndDateHour ,

Return result D.

Else if HourlyGFMData .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 Current DateHour
If found,

1fi-720 Return result B.

Set SupplementalSorbentTrapExists to true.

Environmental Protection Agency

Page 763 of 907


-------
Draft Check Specifications

12/16/2015

If SupplementalSorbentTrapExists is equal to false,

// No transition overlap between sorbent traps
Return result E.

Else if Current DateHour is not equal to the MatsSorbentTrapEndDateHour
II Current hour is not the end hour of the current sorbent trap
Return result F.

\fi720

\fi675\tab\tab

Results:

Result	Description	Severity

A	For [key], you identified a begin hour that is not the first or second hour of Critical Error Level 1

the sampling period.

B	For [key], you identified an end hour that is not the last or second to the last Critical Error Level 1

hour of the sampling period.

C	For [key], you did not identify the first hour of the sampling period as a begin Critical Error Level 1

or transition hour.

D	For [key], you did not identify the last hour of the sampling period as an end Critical Error Level 1

or transition hour.

E	For [key], you identified an hour as a transition hour, but the hour is not	Critical Error Level 1

included in two consecutive sampling periods.

F	For [key], you identified a transition hour that is not the last hour of a	Critical Error Level 1

sampling period.

Usage:

1	Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 764 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 If MatsHourlyGFMComponentldValid is true,

fi45 If the Mats HourlyGFMRecord.HourlyGFMReading is null,

If the MatsSamplingTrainQaStatus is NOT equal to \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote , AND HourlyGFMData .BeginEndHourFlag is NOT equal to 'N',

Return result A.

Else,

If HourlyGFMData .BeginEndHourFlag is equal to 'N',

\tx0

\tx0 Return result D.

\tx0

Else if the MatsSamplingTrainQaStatus is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote , or
\ldblquote UNCERTAIN\rdblquote,

Return result B.

\tx0 Else if the Mats HourlyGFMRecord .HourlyGFMReading is not reported to two decimal places ,

Return result C.

MATSGFM-3

Hourly GFM Reading Valid

Results:

Result
A

B

C
D

Usage:
1

Description

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

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 765 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 If MatsHourlyGFMComponentldValid is true,

\1145 If the Mats HourlyGFMRecord. AvgHourlySamplingRate is null,

\fi45

If the MatsSamplingTrainQaStatus is NOT equal to \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote , AND HourlyGFMData .BeginEndHourFlag is NOT equal to 'N',

\fi45

Return result A.

Else,

If HourlyGFMData .BeginEndHourFlag is equal to 'N',

\tx0

\tx0 Return result D.

Else if the MatsSamplingTrainQaStatus is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote , or
\ldblquote UNCERTAIN\rdblquote,

\tab

Return result B.

\tx0

Else if the Mats HourlyGFMRecord .AvgHourlySamplingRate is not reported to two decimal places ,

Return result C.

MATSGFM-4

Average Hourly Sampling Rate Valid

Results:

Result
A

B

C
D

Description

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

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:

Environmental Protection Agency

Page 766 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 767 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSGFM-5

Check Name:

Sampling Rate UOM Valid

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 If MatsHourlyGFMComponentldValid is true,

\fi45 If the Mats HourlyGFMRecord. SamplingRateUOM is null,

\fi720

If the MatsSamplingTrainQaStatus is NOT equal to \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote , AND HourlyGFMData .BeginEndHourFlag is NOT equal to 'N',

Return result A.

Else,

If HourlyGFMData .BeginEndHourFlag is equal to 'N',

\tx0

\tx0 Return result D.

Else if the MatsSamplingTrainQaStatus is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote , or
\ldblquote UNCERTAIN\rdblquote,

\tab

Return result B.

Else if the Mats HourlyGFMRecord .SamplingRateUOM is not \ldblquote CCMIN\rdblquote , \ldblquote DSCMMIN
\rdblquote , \ldblquote LMIN\rdblquote , \ldblquote CCHR\rdblquote , \ldblquote DSCMHR\rdblquote , or \ldblquote
LHR\rdblquote,

Return result C.

Results:

Result

Description

Severity

A

You did not report a [fieldname] value in the [key] records which is required Critical Error Level 1
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 Critical Error Level 1
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

C

For [key] you reported a [value] which is not valid for [fieldname].

Critical Error Level 1

D

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.

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 768 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 769 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSGFM-6

Check Name:	Hourly SFSR Ratio Valid

Related Former Checks:

Applicability:

Specifications:

If the Mats HourlyGFMRecord .HourlySFSRRatio is null,

If MatsSamplingTrainQaStatus is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or \ldblquote LOST
\rdblquote , AND CurrentStackFlowHourlyRecord is NOT null AND CurrentStackFlowHourlyRecord .ModcCode \f2 in
set \{01, 02, 03, 04, 20, 53, \f2 54\} , AND HourlyGFMData .BeginEndHourFlag is NOT equal to 'N',

\fi720

\fi45 Return result A.

\fi720

\fi45 Else,

If HourlyGFMData .BeginEndHourFlag is equal to 'N',

\tx0

\tx0 Return result G.

\fi-720 Else if MatsSamplingTrainQaStatus is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote , or
\ldblquote UNCERTAIN\rdblquote,

Return result B.

Else if CurrentStackFlowHourlyRecord is null,

Return result F.

Else if CurrentStackFlowHourlyRecord .ModcCode NOT \f2 in set \{01, 02, 03, 04, 20, 53, \f2 54\} ,

Return result E.

\tab Else if the the Mats HourlyGFMRecord .HourlySFSRRatio is not reported to one decimal place ,

Return result C.

\fi-720\tab Else if the Mats HourlyGFMRecord. HourlySFSRRatio is not greater than or equal to 1.0 and less than or equal
to 100.0,

Return result D.

\tab Else if MatsHourlyGFMComponentldValid is true AND MatsSamplingTrainDictionary contains a key equal to Mats
SamplingTrainRecord .TrainID AND MatsSamplingTrainDictionary . ReferenceSFSRRatio where the key equals Mats
SamplingTrainRecord .TrainID is NOT null or equal to 0,

Set MatsHourlySfsrRatioDeviation to absolute value of [1 - (Mats HourlyGFMRecord .HourlySFSRRatio /
MatsSamplingTrainDictionary . Reference SFSRRatio where the key equals Mats SamplingTrainRecord .TrainID)] x
100, rounded to an integer.

\fi-720

\sa200\sl276\slmultl Add one to MatsSamplingTrainDictionary . TotalSFSRRatioCount where the key equals Mats
SamplingTrainRecord. TrainID\0\fs22

Environmental Protection Agency

Page 770 of 907


-------
Draft Check Specifications

12/16/2015

\fi-720 \fs20 If the MatsHourlySfsrRatioDeviation is greater than 25,

\fi-720

\fi-720 Add one to MatsSamplingTrainDictionary . DeviatedSFSRRatioCount where the key equals Mats
SamplingTrainRecord .TrainID

Results:

Result	Description	Severity

A	You did not report a [fieldname] value in the [key] records which is required Critical Error Level 1

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

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

D	The [fieldname] value for [key] must be a number between 1 and 100.	Critical Error Level 1

E	You reported a [fieldname] value in the [key] records which is not reported if Critical Error Level 1

the stack gas flow rate for the hour is a substitute data value.

F	You reported a [fieldname] value in the [key] records which you should not Critical Error Level 1

report when a stack gas flow rate is not reported for the hour.

G	You reported a [fieldname] value in the [key] records, but also reported a	Critical Error Level 1

problem with the hourly GFM data with a "N" in the BeginEndHourFlag
record.

Usage:

1	Emissions Data Evaluation Report	MATS Hourly Gas Flow Meter Evaluation

Environmental Protection Agency

Page 771 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-1

Check Name:

MATS Hg: Locate Active Monitor Method

Related Former Checks:

Applicability:

Specifications:

Set MatsHgMethodRecord to null.

Set MatsHgParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate Monitor MethodRecordsBy Hour Location 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 ParameterCode.

Results:

Result

Description

You reported more than one monitoring method record for [param] for the
hour and location.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 772 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-2

Check Name:

MATS HC1: Locate Active Monitor Method

Related Former Checks:

Applicability:

Specifications:

Set MatsHclMethodRecord to null.

Set MatsHclParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate Monitor MethodRecordsBy Hour Location 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 MatsHclMethodRecord ParameterCode.

Results:

Result

Description

You reported more than one monitoring method record for [param] for the
hour and location.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 773 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-3

Check Name:

MATS HF: Locate Active Monitor Method

Related Former Checks:

Applicability:

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

Description

You reported more than one monitoring method record for [param] for the
hour and location.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 774 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-4

Check Name:

MATS S02: Locate Active Monitor Method

Related Former Checks:

Applicability:

Specifications:

Set MatsSo2MethodRecord to null.

Set MatsSo2ParameterCode to null.

If DerivedHourlyChecksNeeded is equal to true,

Locate Monitor MethodRecordsBy Hour Location 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 MatsSo2 Method Record to the located record.

Set MatsSo2 ParameterCode to MatsSo2 Method Record ParameterCode.

Results:

Result

Description

You reported more than one monitoring method record for [param] for the
hour and location.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 775 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-5

Check Name:

MATS: Set MATS Expected Flag

Related Former Checks:

Applicability:

Specifications:

If MatsHgParameterCode , MatsHclParameterCode , MatsHfParameterCode or MatsSo2ParameterCode is not null,
Set MatsExpected to true.

Else

Set MatsExpected to false.

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 776 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-6

Check Name:

MATS Hg: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Specifications:

Set MatsHgreDhvChecksNeeded to false.

Set MatsHgrhDhvChecksNeeded to false.

Set MatsHgcNeeded to false.

Set MatsHgDhvRecord to null.

Set MatsHgDh v Parameter Description to "MATS Hg Rate".

If DerivedHourlyChecksNeeded is equal to true,

Set RecordCount equal to the number of records in MatsDhvRecordsByHourLocation where ParameterCode is equal to
"HGRE" or "HGRH".

If CurrentHourlyOpRecord .OperatingTime 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 MatsDhvRecordsByHourLocation record.
If MatsHgDhvRecord .ParameterCode 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

Description

Severity

Environmental Protection Agency

Page 777 of 907


-------
Draft Check Specifications

12/16/2015

MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

B	You reported more than one MATS Derived Hourly Value records for	Critical Error Level 1

[param] for the hour.

C	MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not Critical Error Level 1

reported if the unit did not operate in the hour.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 778 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-7

Check Name:

MATS HC1: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Specifications:

Set MatsHclreDhvChecksNeeded to false.

Set MatsHclrhDhvChecksNeeded to false.

Set MatsHclcNeeded to false.

Set MatsHclDhvRecord to null.

Set MatsHclDh v Parameter Description 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 CurrentHourlyOpRecord .OperatingTime 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',

Else /* DHV and Method parameter code mismatch */
return result C.

Else /* Non Operating Hour */

If RecordCount is greater than 0,
return result D.

Set MatsHclrhDhvChecksNeeded to true.

Results:

Result

Description

Severity

Environmental Protection Agency

Page 779 of 907


-------
Draft Check Specifications

12/16/2015

MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

B	You reported more than one MATS Derived Hourly Value records for	Critical Error Level 1

[param] for the hour.

C	MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not Critical Error Level 1

reported if the unit did not operate in the hour.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 780 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-8

Check Name:

MATS HF: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Specifications:

Set MatsHfreDhvChecksNeeded to false.

Set MatsHfrhDhvChecksNeeded to false.

Set MatsHfcNeeded to false.

Set MatsHfDhvRecord to null.

Set MatsHfDh v Parameter Description 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 CurrentHourlyOpRecord .OperatingTime 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 MatsHfDhvRecord .ParameterCode is equal to 'HFRE',

Set MatsHfreDhvChecksNeeded to true,
if MatsHfDhvRecord .ParameterCode 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

Description

Severity

Environmental Protection Agency

Page 781 of 907


-------
Draft Check Specifications

12/16/2015

MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

B	You reported more than one MATS Derived Hourly Value records for	Critical Error Level 1

[param] for the hour.

C	MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not Critical Error Level 1

reported if the unit did not operate in the hour.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 782 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-9

Check Name:

MATS S02: Locate Derived Hourly Record

Related Former Checks:

Applicability:

Specifications:

Set MatsSo2reDhvChecksNeeded to false.

Set MatsSo2rhDhvChecksNeeded to false.

Set MatsSo2cNeeded to false.

Set MatsSo2DhvRecord to null.

Set MatsSo2I)h v Parameter Description 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 CurrentHourlyOpRecord .OperatingTime is greater than 0

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

Description

Severity

Environmental Protection Agency

Page 783 of 907


-------
Draft Check Specifications

12/16/2015

MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

B	You reported more than one MATS Derived Hourly Value records for	Critical Error Level 1

[param] for the hour.

C	MATS Derived Hourly Value records were reported for [param], but no	Critical Error Level 1

supporting method exists.

D	You reported MATS Derived Hourly Value records for [param] that are not Critical Error Level 1

reported if the unit did not operate in the hour.

Usage:

1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 784 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSHOD-10

Check Name:	MATS Hg: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

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 CurrentHourlyOpRecord .OperatingTime 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 vRecord to the located MatsMhvHgcRecordsByHourLocation 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

Description

You reported a MATS Monitor Hourly Value for [param], but did not report
either a MATS Derived Hourly Value or monitoring method for that
pollutant.

You did not report a MATS Hourly Monitor Value record for [param],
though reporting 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.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1

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

Environmental Protection Agency

Page 785 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 786 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSHOD-11

Check Name:	MATS HC1: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

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 CurrentHourlyOpRecord .OperatingTime 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 MatsHclcMhvRecord 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

Description

You reported a MATS Monitor Hourly Value for [param], but did not report
either a MATS Derived Hourly Value or monitoring method for that
pollutant.

You did not report a MATS Hourly Monitor Value record for [param],
though reporting 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.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1

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

Environmental Protection Agency

Page 787 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 788 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSHOD-12

Check Name:	MATS HF: Locate Monitor Hourly Record

Related Former Checks:

Applicability:

Specifications:

Set MatsHfcMhvChecksNeeded to false.

Set McitsHfcMh 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 CurrentHourlyOpRecord .OperatingTime 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.

Results:

Result
A

B
C
D

Description

You reported a MATS Monitor Hourly Value for [param], but did not report
either a MATS Derived Hourly Value or monitoring method for that
pollutant.

You did not report a MATS Hourly Monitor Value record for [param],
though reporting 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.

Severity

Critical Error Level 1

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

Usage:

Environmental Protection Agency

Page 789 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 790 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSHOD-13

Check Name:	MATS: Check MATS Load

Related Former Checks:

Applicability:

Specifications:

If CurrentHourlyOpRecord is not null

If CurrentHourlyOpRecord .OperatingTime is greater than 0,

If MatsHgParameterCode is equal to "HGRE", OR MatsHclParameterCode is equal to "HCLRE", OR
MatsHfParameterCode is equal to "HFRE", ORMatsSo2ParameterCode is equal to "S02RE",

If CurrentHourlyOpRecord .MatsHourLoad is null,

return result A

Else if CurrentHourlyOpRecord LoadUnitsOfMeasureCode = "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 .MatsHourLoad is not null,
return result C.

Results:

Result
A

B

C

D

Usage:

1

Description

You did not provide a MATSHourLoad record, which is required when you
report an output based emission rate.

You provided a MATSHourLoad record which is not required when you
report a heat input based emission rate.

You reported a MATSHourLoad record, but this is not appropriate for a non-
operating hour.

The reported MATSHourLoad is less than the reported HourLoad value.

Emissions Data Evaluation Report	Operating Hour Evaluation

Severity

Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 791 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-14

Check Name:

Update Sorbent Trap Operating Date List

Related Former Checks:

Applicability:

Specifications:

If CurrentHourlyOpRecord is NOT null,

For each entry in MatsSorbentTrapListByLocationArray where the array index is CurrentMonitorPlanLocationPosition ,
When:

1)	CurrentHourlyOpRecord .OperatingTime 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.

Usage:
1

Emissions Data Evaluation Report	Operating Hour Evaluation

Environmental Protection Agency

Page 792 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSHOD-15

Check Name:

Initialize Message Plug-ins

Related Former Checks:

Applicability:

Specifications:

Set MatsHclDh v Parameter Description to "HCLRE or HCLRH".

Set MatsHctMh vParameterDescription to "HCLC".

Set MatsHfDh v Parameter Description to "HFRE or HFRH".

Set MatsHfMhvParameterDescription to "HFC".

Set MatsHgDh vParameterDescription to "HGRE or HGRH".

Set MatsHgMh vParameterDescription to "HGC".

Set MatsSo2Dh vParameterDescription to "S02RE or S02RH".

Usage:
1

Emissions Data Evaluation Report Summary Value Initialization

Environmental Protection Agency

Page 793 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-1

Check Name:

MATS HgC: Initialize

Related Former Checks:

Applicability:

Specifications:

Set CurrentMhvParameter to "HGC"

Set MatsMh vRecord to MatsHgcMh vRecord
If ( MatsHgMethodRecord .MethodCode is equal to "ST")
Set CurrentMhvSystemType to "ST"
Set CurrentMhvComponentType to "STRAIN"

Set MatsMhvM easuredM odd Ast to \{01, 02, 32, 33, 41, and 42\}
Else

Set CurrentMh vSystem Type to "HG"

Set CurrentMhvComponentType to "HG"

Set MatsMhvM easuredM odd Ast to \{01, 02, 17, and 21\}

Set MatsMhvlInavailableModcIAst to \{34 and 35\}

Usage:
1

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 794 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-2

Check Name:

MATS HC1C: Initialize

Related Former Checks:

Applicability:

Specifications:

Set CurrentMhvParameter to "HCLC"

Set MatsMh vRecord to MatsHclcMh vRecord

Set CurrentMhvComponentType to "HCL"

Set CurrentMh vSystem Type to"HCL"

Set MatsMhvMeasuredModdAst to \{01, 02, 17, and 21\}

Set MatsMhvUnavailableModcList to \{34 and 35\}

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 795 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-3

Check Name:

MATS HFC: Initialize

Related Former Checks:

Applicability:

Specifications:

Set CurrentMhv Parameter to "HFC"

Set MatsMh vRecord to MatsHfcMh vRecord

Set CurrentMhvComponentType to "HF"

Set CurrentMh vSystem Type to "HF"

Set MatsMhvMeasuredModdAst to \{01, 02, 17 and 21\}

Set MatsMhvUnavailableModcIJst to \{34 and 35\}

Usage:
1

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 796 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSMHV-4

Check Name:	MATS: Check MODC

Related Former Checks:

Applicability:

Specifications:

Set MonitorHourlyModcStatus to false.

If ( MatsMh vRecord .ModcCode is null)
return result A

Else if ( MatsMhvRecord ModcCode not in MatsMhvMeasuredModcList AND not in MatsMhvUnavailableModcList)
return result B

Else if ( CurrentMhvSystemType is equal to "ST") AND ( MatsMhvRecord .ModcCode is NOT equal to "41" or "42")
\f2 Locate MatsSorbentTrapRecords where:

1)	Systemld is equal to MatsMhvRecordsD. .SystemID

2)	BeginDateHour is on or before CurrentDateHour

3)	EndDateHour is on or after CurrentDateHour

4)	Records are sorted by \f2 BeginDateHour and EndDateHour // The earliest sorbent trap is the correct trap.\f2
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

Usage:

Description

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

Environmental Protection Agency

Page 797 of 907


-------
Draft Check Specifications	12/16/2015

1	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 798 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-5

Check Name:

MATS: Check Percent Monitor Availability

Related Former Checks:

Applicability:

Specifications:

Set MonitorHourlyPmaStatus = false
If (MonitorHourlyModcStatus == true)

If (MatsMhv Record .PercentAvailable is NULL)
return result A

E lse i f (Mats M hv Record.PercentAvailable> 100.0 OR Mats M hv Record .PercentAvailable <0.0)
return result B

Else

Set MonitorHourlyPmaStatus = true

Results:

Result

Description

You did not report a PMA for the MATS Monitor Hourly Value.
The PMA must be in a range from 0 to 100.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

2

3

Environmental Protection Agency

Page 799 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSMHV-6

Check Name:	MATS: Monitoring System

Related Former Checks:

Applicability:

Specifications:

Set MonitorHourlySystemStatus = false
If (MonitorHourlyModcStatus == true)

If (Mats M hv Record. ModcCode in MatsMhvMeasuredModcList)

I f Mats M hv Record .MonitoringSystemID is null

return result A
E lse if Mats M hv Record. Systemldentifier is null
return result B

E lse if (Mats M hv Record .SystemTypeCode <> CurrentM hv SystemType )
return result C

E lse

MonitorHourlySystemStatus = true
E lse // Unavailable MODC

I f (Mats M hv Record .MonitoringSystemID is NOT null)
return result D

E lse

MonitorHourlySystemStatus = true

Results:

Result
A

B

C
D

Usage:

1

2

3

Description

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 is not reported based on the MODCCode.

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 800 of 907


-------
Draft Check Specifications	12/16/2015

Environmental Protection Agency	Page 801 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-7

Check Name:

MATS: System Designation

Related Former Checks:

Applicability:

Specifications:

If (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true AND Mats Mhv Record . Systemldentifier is
not null)

case (Mats M hv Record. ModcCode)

01 OR 17: If (Mats M hv Record. SystemDesignationCode <> "P")
return result A

02: If (Mats Mhv Record.SystemDesignationCode NOT in set \{B, RB\}
return result B

Results:

Result

Description

Severity

A

You reported a MATS Hourly Value MODCCode that is only used with
primary or temporary like kind monitoring systems.

You reported a MATS Monitor Hourly Value MODCCode that is only used
with backup or redundant backup monitoring systems.

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

2

3

Environmental Protection Agency

Page 802 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSMHV-8

Check Name:	MATS: Check Like Kind Analyzer Use

Related Former Checks:

Applicability:

Specifications:

I f (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true )

If (Mats M hv Record .ModcCode =="17")

HoursOfUseOJLikeKindAnalyzer = Count of MonitorHourlyValueData record s for the location and reporting period
where :

1)	ParameterCode = CurrentM hv Parameter

2)	ModcCode == "17"

3)	BeginDate Hour < Current Operating DateHour

If HoursOfUseOJLikeKindAnalyzer >= 720

FirstUseOfLikeKindAnalyzerRecord = MonitorHourlyValueData record at earliest time for the location and
reporting period where :

1)	ParameterCode = CurrentM hv Parameter

2)	ModcCode == "17"

3)	BeginDate Hour < Current Operating DateHour

Mine

Locate a RATATestRecordsByLocationForQAStatus for the location where:

1)	MonitoringSystemID is equal to Mats M hv Record .MonitoringSystemID

2)	TestResultCode begins with "PASS"

3)	EndDate/EndHour is after the FirstUseOJLikeKindAnalyzerRecord .Date/Hour and on or prior to the
Current Operating DateHour .

If not found,

return result A

Results:

Result
A

Usage:

1

2

Description	Severity

You reported an MODCCode of 17 in the MATS Monitor Hourly Value	Critical Error Level 1

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.

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 803 of 907


-------
Draft Check Specifications 12/16/2015
3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 804 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-9

Check Name:

MATS: Component

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MonitorHourlyComponentStatus = false
If ( CurrentMhvSystemType o "ST")

If (MonitorHourlyModcStatus = true)

If (Mats M hv Record .ModcCode in set MatsMhvMeasuredModcList)

I f MatsMhv Record. ComponentID is null
return result A

E lse

I f Mats M hv Record. Componentldentifier is null
return result B

E lse if (Mats M hv Record ComponentTypeCode <> CurrentM hv ComponentType )
return result C

E lse if Mats M hv Record. ModcCode ==17 AND Mats M hv Record. Componentldentifier does not begin
with \ldblquote LKArdblquote

return result D

Else

E lse

I f Mats M hv Record. ComponentID is NOT null
return result E

E lse

MonitorHourlyComponentStatus = true
Else

I f MatsMhv Record. ComponentID is NOT null
return result F

Else

MonitorHourlyComponentStatus = true

MonitorHourlyComponentStatus = true

Results:

Environmental Protection Agency

Page 805 of 907


-------
Draft Check Specifications

12/16/2015

Result
A

B

C

D

E
F

Description

You did not report a ComponentID for the [param] MATS Monitor Hourly
Value.

Your reported ComponentID [ID] in the MATS MHV record for [param], but
there is no Component record for this component in your monitoring plan.

The component type associated with the ComponentID for the [param]

MATS Monitor Hourly Value is not consistent with the parameter.

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.

You reported a ComponentID for the [param] MATS Monitor Hourly Value
that is not reported based on the MODCCode.

You reported a ComponentID in the MATS MHV record for a [type] system,
but a ComponentID is only reported for a gas CEMS.

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	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 806 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-10

Check Name:

MATS: System Component

Related Former Checks:

Applicability:

Specifications:

I f (MonitorHourlySystemStatus == true ) AND (Mats M hv Record . MonitoringSystemID is not null) AND (
MonitorHourlyComponentStatus == true) AND (Mats M hv Record . ComponentID is not null)

CountMonSysCompRecord = count MonitoringSystemComponentByHourLocation record s where :

1)	MonitoringSystemID = MatsMhv Record. MonitoringSystemID

2)	ComponentID = MatsMhv Record .ComponentID

If CountMonSysCompRecord = 0
return result A

Results:

Result

Description

Severity

A

You reported MonitoringSystemID [sys] ComponentID [ID] in the MATS
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.

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

2

3

Environmental Protection Agency

Page 807 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSMHV-11

Check Name:	MATS: Max/Min Value

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 CurrentMHVMaxMin V alue = null

If (MonitorHourlyModcStatus == true AND Mats M hv Record ModcCode in set MatsMhvMeasuredModcList)
If ( CurrentMhvComponentType == "HG")

MonitorSpanRecordCount = Find active MonitorSpanRecordByHourAndLocation where :

1)	ComponentTypeCode = CurrentM hv ComponentType AND

2)	SpanScaleCode = "H"

I f (MonitorSpanRecordCount > 1)

return result A
E lse if (MonitorSpanRecordCount = 0)
return result B

E lse

CurrentMonitorSpanRecord = the single matched record
I f CurrentMonitorSpanRecord .MPCValue > 0)

CurrentM It vMax Min Value = CurrentMonitorSpanRecord. MPCValue

E lse

return result C

Results:

Result
A

B

C

Usage:

1

2

3

Description

You have more than one active High Range SpanScaleCode at the current
location for the hour.

You have no active High Range SpanScaleCode at the current location for
the hour.

The value in the reported span record for [param] is invalid.

Severity

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

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 808 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

1fs20 MonitorHourlyUnadjustedValueStatus = false
Mats Mil vCalculated Value = null
I f (MonitorHourlyModcStatus == true)

C ase (Mats M hv Record. ModcCode )

= 21:

MatsMhvCalculatedValue = 0 .00E0

I f (Mats M hv Record .UnadjustedHourlyValue == 0 .00E0 )

MonitorHourlyUnadjustedValueStatus = true
E lse

return result A
= All Other Codes:

If ( MatsMh vRecord ModcCode in set MatsMhvMeasuredModcList)

If (Mats M hv Record .UnadjustedHourlyValue is null)
return result B

Else if (Mats M hv Record .UnadjustedHourlyValue is not reported in scientific notation to three significant
digits)

return result C

Else i f (Mats M hv Record .UnadjustedHourlyValue < 0 .00E0 )
return result D

Else

MonitorHourlyUnadjustedValueStatus = true

MatsMhvCalculatedValue = MatsMh vRecord . UnadjustedHourlyValue

I f ( CurrentM hv MaxMin Value is not null AND Mats M hv Record .UnadjustedHourlyValue >
CurrentM hv MaxMin Value )

return result E

Else

If (Mats M hv Record .UnadjustedHourlyValue is not null)
return result F

Environmental Protection Agency	Page 809 of 907

MATSMHV-12
MATS: Unadjusted Value


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C

D

E

Description

You reported an MODCCode of 21 in the MATS Monitor Hourly Value
record for [param], but the UnadjustedHourly Value does not equal 0.

You reported a measured value MODCCode in the MATS Monitor Hourly
Value record for [param] but did not report an UnadjustedHourlyValue.

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

Warning: The UnadjustedHourlyValue reported in the MATS 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 range values. You should investigate the cause of these exceedances
and determine whether adjustments to your monitoring systems or
monitoring plan are necessary.

You did not report a measured value MODCCode in the MATS Monitor
Hourly Value record for [param], but did report an UnadjustedHourlyValue.

Severity

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

Critical Error Level 1
Informational Message

Critical Error Level 1

Usage:

1	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 810 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-13

Check Name:

MATS: QA Status Required and QA Status Parameters

Related Former Checks:

Applicability:

Specifications:

Set QaStatusComponentBeginDate = Mats M hv Record ComponentBeginDate

Set QaStatusComponentld = Mats M hv Record Componentld

Set QaStatusComponentldentifier = Mats M hv Record Componentldentifier

Set QaStatusComponentTypeCode = Mats M hv Record ComponentTypeCode

Set QaStatusSystemDesignationCode = Mats M hv Record. SystemDesignationCode

Set QaStatusSystemld = Mats M hv Record . Systemld

Set QaStatusSystemldentifier = Mats M hv Record. Systemldentifier

Set QaStatusSystemTypeCode = Mats M hv Record .SystemTypeCode

Set DailyCalStatusRequired = false.

Set LinearityStatusRequired = false.

Set QuarterlyGasAuditStatus = false.

Set R ata StatusRequired = false.

Set WsiStatusRequired = false.

if (MonitorHourlyModcStatus == true ) AND (Mats M hv Record .ModcCode in MatsMhvMeasuredModcList) AND (Mats
M hv Record .UnadjustedHourlyValue is not null)

if (MonitorHourlyComponentStatus = true ) AND (Mats M hv Record .ComponentID is not null)

if (Mats M hv Record. ParameterCode is equal to "HGC")

If (Mats M hv Record. SystemTypeCode is equal to "HG")

Set DailyCalStatusRequired = true.

Set LinearityStatusRequired = true.

If ( MatsMh vRecord .HgConverterlnd is equal to 1)

Set WsiStatusRequired = true.

else if (Mats M hv Record. ParameterCode is in set \{"HCLC", "HFC"\})

Set Quarterly GasAuditStatus = true.

if (MonitorHourlySystemStatus = true ) AND (Mats M hv Record. MonitoringSystem ID is not null)

Set R ata StatusRequired = true.

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 811 of 907


-------
Draft Check Specifications	12/16/2015

2	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 812 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-14

Check Name:

MATS HgC: Complete

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsMhvCalculatedHgcValue = MatsMhvCalculatedValue \fs20

Usage:
1

Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 813 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-15

Check Name:

MATS HC1C: Complete

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsMhvCalculatedHclcValue = MatsMhvCalculatedValue \fs20

Usage:
1

Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 814 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-16

Check Name:

MATS HFC: Complete

Related Former Checks:

Applicability:

Specifications:

\ucl

\fs20 MatsMhvCalculatedHfcValue = MatsMhvCalculatedValue \fs20

Usage:
1

Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 815 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-17

Check Name:

MATS: QA Status Analyzer Range Parameters

Related Former Checks:

Applicability:

Specifications:

I f (LinearityStatusRequired == true ) OR (DailyCalStatusRequired == true )

Set DualRangeStatus = false.

Set ApplicableComponentID = null.

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

I f (AnalyzerRangeRecordsByHourLocation is not found OR if more than one AnalyzerRangeRecordsByHourLocation is
found)

S et LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result A

E lse if (AnalyzerRangeRecordsByHourLocation .DualRangelndicator = 1)

S et LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result B

Else if (AnalyzerRangeRecordsByHourLocation .AnalyzerRangeCode <> "H")

S et LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result C

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 . SystemID to ApplicableSystemlDs .

E lse

Environmental Protection Agency

Page 816 of 907


-------
Draft Check Specifications

12/16/2015

if (MonitorSystemComponentRecordsByHourLocation is not found)
set LinearityStatusRequired = false
set DailyCalStatusRequired = false
return result D

Results:

Result
A

B

C

D

Description

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	Emissions Data Evaluation Report	MATS HC1 Concentration Monitor Hourly Evaluation

2	Emissions Data Evaluation Report	MATS HF Concentration Monitor Hourly Evaluation

3	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 817 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSMHV-18

Check Name:

MATS HgC: 3-Level System Integrity Status Check

Related Former Checks:

Applicability:

Specifications:

If WsiStatusRequired is equal to true.

Locate the most recent record in QACertiflcationEventRecords where:

a)	ComponentID is equal to Mats M hv Record .Componentld.

b)	QaCertEventDateHour is prior to CurrentDateHour .

c)	QaCertEventCode is equal to "120" or "125"

If found

Set TestRequiredDateHour equal to the hour after the located QaCertEventDateHour.

Else

Locate the most recent record in MonitorSystemComponentRecordByHourLocation where:

1)	Systemld is equal to Mats M hv Record. Systemld.

2)	Componentld is equal to Mats M hv Record .ComponentId\f2 .

If found

Set TestRequiredDateHour equal to the hour after the located BeginDate/BeginHour.

Else

If return result is null

Locate records in Mats3LevelSystemIntegrityRecordsForQaStatus where:

1)	ComponentID is equal to Mats M hv Record .Componentld.

2)	EndDateHour is prior to CurrentDateHour .

3)	EndDateHour is on or after TestRequiredDateHour .

If not found

return result A.

return result B.

Results:

Result

Description

A 3 Level System Integrity test is required for component [COMPID],

Unable to locate a system component record for system [SYS ID] and
component [COMP ID],

Severity

Informational Message
Critical Error Level 1

A

B

Usage:

Environmental Protection Agency

Page 818 of 907


-------
Draft Check Specifications 12/16/2015
1	Emissions Data Evaluation Report	MATS Hg Concentration Monitor Hourly Evaluation

Environmental Protection Agency

Page 819 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

Check Name:

Related Former Checks:

Applicability:

Specifications:

\ucl

\1145 \fs20 Set MatsSamplingTrainComponentldValid equal to false.

If MatsS amplingTrainRecord .ComponentID is null,

Set MatsSamplingTrainProblemComponentExists equal to true.

Return result A.

Else if MatsS amplingTrainRecord. ComponentTypeCode is not equal to \ldblquote STRAIN\rdblquote ,
Set MatsSamplingTrainProblemComponentExists equal to true.

\fi675 Return result B.

Else

Set MatsSamplingTrainComponentldValid equal to true.

Add an entry to MatsSamplingTrainDictionary with a key equal to MatsS amplingTrainRecord .TrainID 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.

MATSTRN-1
Component ID Valid

Results:

Result

A

B

Usage:

1

Description

For [key], you have not reported a value for [fieldname], which is required.

The [fieldname] in the monitoring plan is [component type]. A [component
type] [fieldname] is not associated with sorbent trap data.

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Severity

Critical Error Level 1
Critical Error Level 1

Environmental Protection Agency

Page 820 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-2

Check Name:

Sorbent Trap Serial Number

Related Former Checks:

Applicability:

Specifications:

\ucl

\fi45 \fs20 If the Mats SamplingTrainRecord .SorbentTrapSn is null,
Return result A.

Results:

Result

Description

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

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 821 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-3

Check Name:

Train Quality Assurance Status Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSamplingTrainQaStatusCodeValid to false.

If Mats SamplingTrainRecord .TrainQAStatusCode is null,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats SamplingTrainRecord
.TrainlD.

Return result A,

Else if Mats SamplingTrainRecord TrainQAStatusCode does not match a value in MatsSamplingTrainQaStatusLookupTable ,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats SamplingTrainRecord
.TrainlD.

Return result B.

Else

Set MatsSamplingTrainQaStatusCodeValid to true.

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .TrainQAStatusCode to Mats SamplingTrainRecord .TrainQAStatusCode where
the key equals Mats SamplingTrainRecord .TrainlD.

Results:

Result

Description

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

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 822 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-4

Check Name:	Main Trap Hg Valid

Related Former Checks:

Applicability:

Specifications:

Set Mats MainTrapHgValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

\fi45 If the Mats SamplingTrainRecord .MainTrapHg is null,

\fi720

\fi45 \tab If the Mats SamplingTrainRecord .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED
\rdblquote , or \ldblquote LOST\rdblquote ,

Return result A.

\fi720

Otherwise

Set Mats MainTrapHgValid to true.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

\fi720 Return result B.

Else, if the Mats SamplingTrainRecord .MainTrapHg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),

\fi720

\fi720 Return result C.

\fi720

Otherwise

Set Mats MainTrapHgValid to true.

Results:

Result
A

B

C

Description

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

Severity

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

Environmental Protection Agency

Page 823 of 907


-------
Draft Check Specifications	12/16/2015

decimal point.

Usage:

1	Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 824 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-5

Check Name:	BT Trap Hg Valid

Related Former Checks:

Applicability:

Specifications:

Set Mats BtTrapHgValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

\fi45

\fi45 If the Mats SamplingTrainRecord. BTTrapHg is null,

\tab If the Mats SamplingTrainRecord .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

Return result A.

\fi720

Otherwise

Set Mats BtTrapHgValid to true.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

\fi720 Return result B.

Else if the Mats SamplingTrainRecord .BTTrapHg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),

\fi720

\fi720 Return result C.

\fi720

Otherwise

Set Mats BtTrapHgValid to true.

Results:

Result
A

B

C

Description

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

Severity

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

Environmental Protection Agency

Page 825 of 907


-------
Draft Check Specifications	12/16/2015

decimal point.

Usage:

1	Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 826 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-6

Check Name:	Spike Trap Hg Valid

Related Former Checks:

Applicability:

Specifications:

Set Mats SpikeTrapHgValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

\fi45 If the Mats SamplingTrainRecord .SpikeTrapHg is null,

\tab If the Mats SamplingTrainRecord .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

Return result A.

\fi720

Otherwise

Set Mats SpikeTrapHgValid to true.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

\fi720 Return result B.

Else if the Mats SamplingTrainRecord .SpikeTrapHg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),

\fi720

\fi720 Return result C.

\fi720

Otherwise

Set Mats SpikeTrapHgValid to true.

Results:

Result
A

B

C

Description

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

Environmental Protection Agency

Page 827 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

MATS Sampling Train Evaluation

Page 828 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-7

Check Name:	Spike Reference Value Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSpikeReferenceValueValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

\fi45 If the Mats SamplingTrainRecord. SpikeReferenceValue is null,

\tab If the SamplingTrainData .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

Return result A.

\fi720

Otherwise

Set Mats SpikeReferenceValueValid to true.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

\fi720 Return result B.

Else if the Mats SamplingTrainRecord .SpikeReferenceValue is not reported in scientific notation rounded to three
decimal places, keeping one to the left of the decimal point (x.xx-E-x),

\fi720

\fi720 Return result C.

\fi720

Otherwise

Set Mats SpikeReferenceValueValid to true.

Results:

Result
A

B

C

Description

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

Environmental Protection Agency

Page 829 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

MATS Sampling Train Evaluation

Page 830 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-8

Check Name:	Total Sample Volume DSCM Valid

Related Former Checks:

Applicability:

Specifications:

Set Mats TotalSample VolumeDSCMValid to false.

If MatsSamplingTrainQaStatusCodeValid is true,

\fi45 If the Mats SamplingTrainRecord .TotalSampleVolumeDSCM is null,

\tab If the SamplingTrainData .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

Return result A.

\fi720

Otherwise

Set Mats TotalSampleVolumeDSCM Valid to true.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

\fi720 Return result B.

Else if the Mats SamplingTrainRecord .TotalSampleVolumeDSCM is equal to or greater than two decimal places ,

\fi720
\fi720 Return result C.

\fi720

Otherwise

Set Mats TotalSampleVolumeDSCM Valid to true.

\fi720

Results:

Result
A

B

C

Description

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

Environmental Protection Agency

Page 831 of 907


-------
Draft Check Specifications

Usage:

1	Emissions Data Evaluation Report

Environmental Protection Agency

12/16/2015

MATS Sampling Train Evaluation

Page 832 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-9

Check Name:	Reference SFSR Ratio Valid

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the Mats SamplingTrainRecord.ReferenceSFSRRatio is null,

\tab If the MatsSamplingTrainRecord .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result A.

Else,

If the Mats SamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result B.

Else if the Mats SamplingTrainRecord .ReferenceSFSRRatio is not reported to one decimal place,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result C.

\fi-720

\fi-720 Else if the Mats HourlyGFMRecord. HourlySFSRRatio is not greater than or equal to 1.0 and less than or
equal to 100.0,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result D.

Else

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary . Reference SFSRRatio to Mats SamplingTrainRecord
.ReferenceSFSRRatio where the key equals Mats SamplingTrainRecord .TrainlD.

Environmental Protection Agency

Page 833 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C
D

Usage:

1

Description

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

Emissions Data Evaluation Report ¦

¦ MATS Sampling Train Evaluation

Environmental Protection Agency

Page 834 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-10

Check Name:	Sampling Ratio Check Result Code Valid

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If MatsSamplingTrainRecord. SamplingRatioCheckResultCode is null,

If the MatsSamplingTrainRecord .QAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result A.

Else,

If MatsSamplingTrainRecord .SamplingRatioCheckResultCode is equal to \ldblquote PASSED\rdblquote ,

If MatsSamplingTrainRecord .QAStatus Code is not equal \ldblquote PASSED\rdblquote , "FAILED", or
\ldblquote UNCERTAIN\rdblquote,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result B.

Else if MatsSamplingTrainRecord .SamplingRatioCheckResultCode is equal to \ldblquote FAILED\rdblquote ,

If MatsSamplingTrainRecord .QAStatus Code is not equal \ldblquote FAILED\rdblquote ,

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result C.

Otherwise

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result D.

Results:

Result
A

Description

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,

Severity

Critical Error Level 1

Environmental Protection Agency

Page 835 of 907


-------
Draft Check Specifications

12/16/2015

and the stack flow rate for the hour is a measured data value.

B

C
D

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

Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 836 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	MATSTRN-11

Check Name:	Post Leak Check Result Code Valid

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord .PostLeakCheckResultCode is null,

If the MatsSamplingTrainRecord .QAStatusCode is not \ldblquote \ldblquote INC\rdblquote , \ldblquote EXPIRED
\rdblquote or \ldblquote LOST\rdblquote ,

Return result A.

Else

If MatsSamplingTrainRecord .PostLeakCheckResultCode is equal to \ldblquote PASSED\rdblquote ,

If MatsSamplingTrainRecord .QAStatus Code is not equal to \ldblquote PASSED\rdblquote , "FAILED", OR
\ldblquote UNCERTAIN\rdblquote,

\tab

Return result B.

Else if MatsSamplingTrainRecord .PostLeakCheckResultCode is equal to \ldblquote FAILED\rdblquote ,
If MatsSamplingTrainRecord .QAStatus Code is not equal to \ldblquote FAILED",

\tab

Return result C.

Otherwise

Return result D.

Results:

Result
A

B

C

D

Usage:

1

Description

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 of [value] from the [key] records exceeds the PS-12B
breakthrough criteria, but you did not report the train QA Status Code as
FAILED.

The [fieldname] is not reported as PASSED or FAILED.

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Severity

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

Environmental Protection Agency

Page 837 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-12

Check Name:

Sample Damage Explanation

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord. SampleDamageExplanation is null,

\tab If the MatsSamplingTrainRecord .QAStatus Code is equal to \ldblquote LOST\rdblquote ,
\fi720 Return result A.

Results:

Result

Description

Severity

A

For [key], you did not report a SampleDamageExplanation which is required Critical Error Level 1
if the sorbent train QA Status Code is LOST.

Usage:
1

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 838 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-13

Check Name:

Hg Concentration reported properly

Related Former Checks:

Applicability:

Specifications:

Set MatsCalcTrainHgConcentration = null.

If MatsSamplingTrainQaStatusCodeValid is true,

If MatsSamplingTrainRecord .HgConcentration is null,

If MatsSamplingTrainRecord .TrainQAStatusCode is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote ,
or \ldblquote LOST\rdblquote,

If MatsSamplingTrainRecord .TrainQAStatusCode is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote
, or \ldblquote UNCERTAIN\rdblquote ,

\tab

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result B.

Else if MatsSamplingTrainRecord .HgConcentration 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 .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result C.

Else if Mats Main TrapHg Valid is true AND Mats B TTrapHg Valid is true AND Mats
TotalSampleVolumeDSCMValid is true ,

Set MatsCalcTrainHgConcentration = (MatsS amplingTrainRecord .MainTrapHg + MatsS
amplingTrainRecord .BTTrapHg) I MatsS amplingTrainRecord .TotalSampleVolumeDSCM, rounded to three
significant figures, using scientific notation (x.xx-E-2).

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .HgConcentration to MatsCalcTrainHgConcentration where the key
equals Mats SamplingTrainRecord TrainlD.

If Mats SamplingTrainRecord HgConcentration is not equal to MatsCalcTrainHgConcentration , \f2\fs22

Environmental Protection Agency	Page 839 of 907

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result A.

Else,


-------
Draft Check Specifications

12/16/2015

\fs20

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Return result D

Else // A calculation input is not valid

If MatsSamplingTrainComponentldValid is true,

Set MatsSamplingTrainDictionary .SamplingTrainValid to false where the key equals Mats
SamplingTrainRecord .TrainlD.

Results:

Result
A

B

C

D

Usage:

1

Description

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.

Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Severity

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

Environmental Protection Agency

Page 840 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-14

Check Name:

Percent Breakthrough reported properly.

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord .PercentBreakthrough is null,

\fi-720 If the MatsSamplingTrainRecord .QAStatus Code is "PASSED", \ldblquote FAILED\rdblquote , or
\ldblquote UNCERTAIN\rdblquote , AND the. MatsSamplingTrainRecord .HgConcentration is greater than or
equal to 0.2,

\fi720

\fi720 Return result A.

\tab If the MatsSamplingTrainRecord .QAStatusCode is \ldblquote LOST\rdblquote , \ldblquote EXPIRED\rdblquote ,
or \ldblquote INC\rdblquote,

Return result B\tab

\fi720\tab

Else if the MatsSamplingTrainRecord .PercentBreakthrough is NOT reported to one decimal place.

Return result C

Else if Mats Main T rapHgValid is equal to true, and MatsB tTrapHgValid is equal to true,

Set MatsCalcTrainPercentBreakthrough = (MatsSamplingTrainRecord .BTTrapHg /
MatsSamplingTrainRecord .MainTrapHg) x 100, rounded to one decimal place.

If MatsSamplingTrainRecord PercentBreakthrough is NOT equal to MatsCalcTrainPercentBreakthrough ,
\f2\fs22

\fs20

Return result D,

\fi-720\sa200\sl276\slmultl Else, if the MatsSamplingTrainRecord .HgConcentration is NOT less than 0.2,

\fi-720\sa200\sl276\slmultl If the MatsSamplingTrainRecord .PercentBreakthrough is greater than 10%,
OR

the MatsSamplingTrainRecord.PercentBreakthrough is greater than 5%, AND the
MatsSamplingTrainRecord.HgConcentration is greater than 0.5,

\fi-720\sa200\sl276\slmultl If MatsSamplingTrainRecord .TrainQAStatusCode is NOT equal to
"FAILED",

\fi-720\sa200\sl276\slmultl Return result E

Else,

Results:

Result

Description

Severity

Environmental Protection Agency

Page 841 of 907


-------
Draft Check Specifications

12/16/2015

B

C
D

For [key], you did not report a [fieldname] value which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and
the train Hg Concentration is not less than 10% of the Hg limit equivalent
concentration.

For [key], you reported a [fieldname] value which is not reported if the
sorbent train QA 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
Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report ¦

¦ MATS Sampling Train Evaluation

Environmental Protection Agency

Page 842 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-15

Check Name:

Percent Spike Recovery reported properly

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainQaStatusCodeValid is true,

If the MatsSamplingTrainRecord .\f2\fs22 \fs20 PercentSpikeRecovery is null,

If the MatsSamplingTrainRecord .QAStatus Code is not \ldblquote INC\rdblquote , \ldblquote EXPIRED\rdblquote , or
\ldblquote LOST\rdblquote,

Return result A.

If the MatsSamplingTrainRecord .QAStatus Code is not \ldblquote PASSED\rdblquote , \ldblquote FAILED\rdblquote ,
or \ldblquote UNCERTAIN\rdblquote,

Return result B.

Else if the MatsSamplingTrainRecord .PercentSpikeRecovery is not reported to one decimal place,

Return result C.

Else if Mats SpikeTrapHgValid is equal to true, AND Mats S pikeReferenceValueValid, is equal to true,

Set MatsCalcTrainPercentSpikeRecovery = Mats SamplingTrainRecord .SpikeTrapHg / Mats
SamplingTrainRecord. SpikeReferenceValue) x 100, rounded to one decimal place.

If Mats SamplingTrainRecord .PercentSpikeRecovery is not equal to MatsCalcTrainPercentSpikeRecovery ,
Return result D.

\sa200\sl276\slmultl Else if the Mats SamplingTrainRecord .PercentSpikeRecovery is less than 75% or greater
than 125%

\sa200\sl276\slmultl If Mats SamplingTrainRecord .TrainQAStatusCode is not equal to "FAILED",

Else

\sa200\sl276\slmultl Return result E

\fi720

Results:

Result

Description

Severity

A

You did not report a [fieldname] value in the [key] records which is required Critical Error Level 1
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 Critical Error Level 1
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.	Critical Error Level 1

B

C

E

D

The [fieldname] is inconsistent with the value [value] calculated from the	Critical Error Level 1

reported [key] records used in the calculation.

The [fieldname] value of [value] from the [key] records exceeds the PS-12B Critical Error Level 1

Environmental Protection Agency

Page 843 of 907


-------
Draft Check Specifications	12/16/2015

breakthrough criteria, but you did not report the train QA Status Code as
FAILED.

Usage:

1	Emissions Data Evaluation Report	MATS Sampling Train Evaluation

Environmental Protection Agency

Page 844 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRN-16

Check Name:

Check Hourly Sampling Ratios

Related Former Checks:

Applicability:

Specifications:

If MatsSamplingTrainDictionary contains the key Mats SamplingTrainRecord .TrainID,

Set SamplingTrainValid to MatsSamplingTrainDictionary .SamplingTrainValid where the key equals Mats
SamplingTrainRecord .TrainID.

Set SamplingTrainValid to false.

If SamplingTrainValid is true,

Set TotalSFSRRatioCount to MatsSamplingTrainDictionary . TotalSFSRRatioCount where the key equals Mats
SamplingTrainRecord .TrainID.

Set DeviatedSFSRRatioCount to MatsSamplingTrainDictionary . DeviatedSFSRRatioCount where the key equals Mats
SamplingTrainRecord .TrainID.

\fi-720 If TotalSFSRRatioCount is greater than or equal to 100,

\tab Set MatsCalcPercentSFSRRatioDev to DeviatedSFSRRatioCount / TotalSFSRRatioCount x 100 , rounded to an
integer.

\tab If the Mats SamplingTrainRecord. SamplingRatioCheckResultCode is equal to \ldblquote PASSED\rdblquote
\tab\tab

\tab\tab If the MatsCalcPercentSFSRRatioDev is greater than 5,\tab
\tab\tab\tab\tab Return result A.

\fi-720\tab Else if the Mats SamplingTrainRecord .SamplingRatioCheckResultCode is equal to \ldblquote FAILED
\rdblquote,

\fi-720\tab\tab If the MatsCalcPercentSFSRRatioDev is less than or equal to 5,\tab

\tab\tab\tab\tab Return result B.

\tab Else // TotalSFSRRatioCount is less than 100

\fi-720\tab If the Mats SamplingTrainRecord .SamplingRatioCheckResultCode is equal to \ldblquote PASSED
\rdblquote

\tab\tab

\tab\tab If the DeviatedSFSRRatioCount is greater than 5,\tab
\tab\tab\tab\tab Return result C.

\fi-720\tab If the Mats SamplingTrainRecord .SamplingRatioCheckResultCode is equal to \ldblquote FAILED
\rdblquote,

\fi-720\tab\tab If the DeviatedSFSRRatioCount is less than or equal to 5,\tab
\tab\tab\tab\tab Return result D.

Else

Environmental Protection Agency

Page 845 of 907


-------
Draft Check Specifications

12/16/2015

Results:

Result
A

B

C

D

Usage:
1

Description

For [key], you reported that the SFSR Ratio Check PASSED, but more than
five percent 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 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.

Severity

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

Emissions Data Evaluation Report	MATS Sampling Train Last Hour Evaluation

Environmental Protection Agency

Page 846 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-1

Check Name:

Begin Date Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapBeginDateValid equal to false.

If the Mats SorbentTrapRecord .BeginDate is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else

Set MatsSorbentTrapBeginDateValid equal to true.

Results:

Result	Description	Severity

A	For [key], a value for [fieldname] is required.	Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation

Environmental Protection Agency

Page 847 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-2

Check Name:

Begin Hour Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapBeginDateHourValid equal to false.
If MatsSorbentTrapBeginDateValid,

If the Mats SorbentTrapRecord .BeginHour is null,
Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else, if the Mats SorbentTrapRecord .BeginHour is less than 0 or greater than 23,
\fi720

\fi720 Set MatsSorbentTrapEvaluationNeeded to false.

Return Result B.

Else

MatsSorbentTrapBeginDateHourValid equal to true.

Results:

Result

Description

For [key], a value for [fieldname] is required.

For [key], you have reported a Begin Hour not between 0 and 23.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation

Environmental Protection Agency

Page 848 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-3

Check Name:

End Date Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapEndDateValid equal to false.

If the Mats SorbentTrapRecord .EndDate is null,

Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else

Set MatsSorbentTrapEndDateValid equal to true.

Results:

Result	Description	Severity

A	For [key], a value for [fieldname] is required.	Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation

Environmental Protection Agency

Page 849 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-4

Check Name:

End Hour Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapEndDateHourValid equal to false.

If the Mats SorbentTrapRecord .EndHour is null,
Set MatsSorbentTrapEvaluationNeeded to false.

Return Result A.

Else, if the Mats SorbentTrapRecord .EndHour is less than 0 or greater than 23,
Set MatsSorbentTrapEvaluationNeeded to false.

Return Result B.

Else

Set MatsSorbentTrapEndDateHourValid equal to true.

Results:

Result

Description

For [key], a value for [fieldname] is required.

For [key], you have reported an End Hour that is not between 0 and 23.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation

Environmental Protection Agency

Page 850 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-5

Check Name:

Begin and End Times Consistent

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapDatesAndHoursConsistent to false.

If MatsSorbentTrapBeginDateHourValid is true AND MatsSorbentTrapEndDateHourValid is true,

If the the Mats SorbentTrapRecord ,BeginDateHour is after the Mats SorbentTrapRecord .EndDateHour,
Set MatsSorbentTrapEvaluationNeeded to false.

Return result A.

Else

Set MatsSorbentTrapDatesAndHoursConsistent to true.

Results:

Result

Description

For [key], the BeginDate/Hour is inconsistent with the EndDate/Hour.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation

Environmental Protection Agency

Page 851 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-6

Check Name:

Check For Overlap With Another Sorbent Trap

Related Former Checks:

Applicability:

Specifications:

Locate Mats SorbentTrapRecords where:

1)	Systemld equals Mats SorbentTrapRecord .Systemld

2)	Trapld does not equal Mats SorbentTrapRecord .Trapld

3)	BeginDateHour is before Mats SorbentTrapRecord .EndDateHour

4)	EndDateHour is after Mats SorbentTrapRecord .BeginDateHour
If found,

Set MatsSorbentTrapEvaluationNeeded to false.

Return result A.

Results:

Result

Description

For [key], you reported sorbent traps with overlapping sampling periods.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap Overlap Evaluation

Environmental Protection Agency

Page 852 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-7

Check Name:

Initialize MATS Sorbent Trap Parameters

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapValidExists to false.

Set MatsSorbentTrapSamplingTrainList to null.

Set MatsSamplingTrainProblemComponentExists to false.

For MatsSorbentTrapRecord:

If MatsSorbentTrapRecord .EndDateHour is after CurrentReportingPeriodEndHour ,
Set SorbentTrapForQuarterBorder to true.

Set SorbentTrapForQuarterBorder to false.

Set SorbentTrapInformation record with:

1)	SorbentTrapValidExists set to true.

2)	SorbentTrapForQuarterBorder set to SorbentTrapForQuarterBorder .

3)	SorbentTrapId set to MatsSorbentTrapRecord .Trapld

3)	SorbentTrapBeginDateHour set to MatsSorbentTrapRecord .BeginDateHour

4)	SorbentTrapEndDateHour set to MatsSorbentTrapRecord .EndDateHour

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 Locationld key is equal MatsSorbentTrapRecord
.Trapld.

Append SorbentTrapInformation to MatsSorbentTrapListByLocationArray element for
CurrentMonitorPlanLocationPosition .

Set MatsSorbentTrapValidExists to MatsSorbentTrapDictionary SorbentTrapValidExists where
Environmental Protection Agency	Page 853 of 907

Else


-------
Draft Check Specifications

12/16/2015

MatsSorbentTrapDictionary key is equal to MatsSorbentTrapRecord .Trapld.

Set MatsSorbentTrapSamplingTrainList to MatsSorbentTrapDictionary .SamplingTrainList where
MatsSorbentTrapDictionary key is equal to MatsSorbentTrapRecord .Trapld.

Set MatsSamplingTrainProblemComponentExists to MatsSorbentTrapDictionary

.SamplingTrainProblemComponentExists where MatsSorbentTrapDictionary key is equal to MatsSorbentTrapRecord
.Trapld.

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap First Hour Initialization

Environmental Protection Agency

Page 854 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-8

Check Name:

Monitoring System Check

Related Former Checks:

Applicability:

Specifications:

If the Mats SorbentTrapRecord .MonitoringSystemID is null,

Set MatsSorbentTrapValidExists to false.

Return result A.

Else, if the Mats SorbentTrapRecord. SystemTypeCode of the associated system is not equal to "ST",
Set MatsSorbentTrapValidExists to false.

Return result B.

Results:

Result

Description

For [key], you have not reported a value for [fieldname], which is required.

The SystemTypeCode in the monitoring plan is [system type]. This type of
system does not report sorbent trap data.

Severity

A

Critical Error Level 1

B

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation

Environmental Protection Agency

Page 855 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-9

Check Name:

Number and Validity of Sampling Trains

Related Former Checks:

Applicability:

Specifications:

Set MatsSamplingTrainsValid to false,

If MatsSamplingTrainProblemComponentExists is false,

If number of entries in MatsSorbentTrapSamplingTrainList is not equal to 2,

Set MatsSorbentTrapValidExists to 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

Description

For [key], you did not report two sets of sorbent train records for the sorbent
trap.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation

Environmental Protection Agency

Page 856 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-10

Check Name:

Sorbent Trap MODC Code is Valid

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbent TrapMODCCodeValid to false

If MatsSorbentTrapRecord .MODCCode is not equal to \ldblquote 01\rdblquote , \ldblquote 02\rdblquote , \ldblquote
32\rdblquote , \ldblquote 33\rdblquote , \ldblquote 34\rdblquote or \ldblquote 35\rdblquote ,

Set MatsSorbentTrapValidExists to false.

Return result A.

Else if MatsSamplingTrainsValid,

If MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 01\rdblquote or \ldblquote 02\rdblquote ,

If MatsSorbentTrapSamplingTrainList. TrainQAStatusCode for both sampling train components are equal to
\ldblquote PASSED\rdblquote,

Set MatsSorbent TrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result B

Else if MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 32\rdblquote ,

IfMatsSorbentTrapSamplingTrainList .TrainQAStatusCode are equal to "PASSED" for one sampling train
component, AND "FAILED" or "LOST" for the other,

Set MatsSorbent TrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result C

Else if the MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 33\rdblquote ,

If MatsSorbentTrapSamplingTrainList .TrainQAStatusCode for both sampling train components are equal to
\ldblquote UNCERTAIN\rdblquote,

Set MatsSorbent TrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result D

Else if the MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 34\rdblquote ,

If MatsSorbentTrapSamplingTrainList .TrainQAStatusCode for both sampling train components are equal to
\ldblquote FAILED\rdblquote,

Environmental Protection Agency

Page 857 of 907


-------
Draft Check Specifications

12/16/2015

Set MatsSorbent TrapMODCCodeValid equal to true.

Else If MatsSorbentTrapSamplingTrainList .TrainQAStatusCode for both sampling train components are equal to
\ldblquote UNCERTAIN\rdblquote,

Set MatsSorbent TrapMODCCodeValid equal to true.

Else if MatsSorbentTrapSamplingTrainList .TrainQAStatusCode for one or both sampling train components is equal
to \ldblquote LOST\rdblquote , \ldblquote EXPIRED\rdblquote or \ldblquote INC\rdblquote ,

Set MatsSorbent TrapMODCCodeValid equal to true.

Else

Set MatsSorbentTrapValidExists to false.

Return result E

Else if the MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 35\rdblquote ,

Set MatsSorbent TrapMODCCodeValid equal to true.

Results:

Result

A

B

C

D

E

Usage:
1

Description

For [key] you reported a [value] which is not valid for [fieldname].

For [key], you reported a [fieldname] of [value] which is valid if the QA
Status Codes of both trains is PASSED.

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.

For [key] you reported a [fieldname] of [value] which is valid if the QA
Status Code of both trains is UNCERTAIN.

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

Severity

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Emissions Data Evaluation Report ¦

¦ MATS Sorbent Trap Evaluation

Environmental Protection Agency

Page 858 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-11

Check Name:

Paired Trap Agreement Validation and Re-calculation

Related Former Checks:

Applicability:

Specifications:

Set MatsSorbentTrapPairedTrapAgreementValid to false.

\fi-720 Set MatsCalcTrapAbsoluteDifference = null.

Set MatsCalcTrapPercentDifference = null.

If the MatsSorbent TrapMODCCodeValid is equal to true, \ul
\ulnone I f MatsS orbentTrapRecord .PairedTrapAgreement is null,

\tab If Mats SorbentTrapRecord .MODCCode is not \ldblquote 32\rdblquote , \ldblquote 34\rdblquote , or \ldblquote
35\rdblquote,

Set MatsSorbentTrapValidExists to false.

Return result A.

Else if Mats SorbentTrapRecord .AbsoluteDifferencelndicator is not null,

Set MatsSorbentTrapValidExists to false.

Return result BAhighlightl
\highlightO

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true

If Mats SorbentTrapRecord .MODCCode is not \ldblquote 01\rdblquote , \ldblquote 02\rdblquote , or \ldblquote
33\rdblquote,

Set MatsSorbentTrapValidExists to false.

Return result C.

Else if Mats SorbentTrapRecord .PairedTrap Agreement is not rounded to two decimal places)

\fi720

Set MatsSorbentTrapValidExists to false.

Return result D.

\fi720

Else if Mats SorbentTrapRecord. AbsoluteDifferencelndicator is equal to 0, OR Mats SorbentTrapRecord.
AbsoluteDifferencelndicator is equal to 1,

\fi-720 Set MatsCalcTrapAbsoluteDifference = the absolute value of the difference between the
MatsSorbentTrapSamplingTrainList .HgConcentration for each train.

Set MatsCalcTrapPercentDifference = 100 * MatsCalcTrapAbsoluteDifference divided by the sum of the
Environmental Protection Agency	Page 859 of 907

Else


-------
Draft Check Specifications

12/16/2015

MatsSorbentTrapSamplingTrainList .HgConcentration for each train.

Round MatsCalcTrapAbsoluteDifference to 2 decimal places.

Round MatsCalcTrapPercentDifference to 2 decimal place.

\fi-720

\fi-720 If Mats SorbentTrapRecord. AbsoluteDifferencelndicator is equal to 0,

If Mats SorbentTrapRecord .PairedTrap Agreement does not equal MatsCalcTrapPercentDifference ,
Set MatsSorbentTrapValidExists to false.

Return result G.\f2
\fi-720

\fi-720 Else if MatsSorbentTrapRecord .PairedTrapAgreement is less than or equal to 10,

\fi-720

If Mats SorbentTrapRecord. MODCCode is not equal to "01" OR "02",

\fi-720

Set MatsSorbentTrapValidExists to false.

Return result H.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.\f2
\fi-720

\fi-720 Else if MatsSorbentTrapRecord .PairedTrap Agreement is less than or equal to 20, and the Mats
SorbentTrapRecord .HgSystemConcentration is less than or equal to 1.0,

\fi-720

If Mats SorbentTrapRecord. MODCCode is not equal to "01" OR "02",

\fi-720

Set MatsSorbentTrapValidExists to false.

Return result I.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.\f2
\fi-720
\fi-720 Else
\fi-720

If Mats SorbentTrapRecord. MODCCode is not equal to "33",

\fi-720

Set MatsSorbentTrapValidExists to false.

Environmental Protection Agency	Page 860 of 907


-------
Draft Check Specifications

12/16/2015

Return result J.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.\12

\fi-720

Else // AbsoluteDifferencelndicator is equal to l\highlightl

\fi-720\highlight0 If Mats SorbentTrapRecord. PairedTrap Agreement is less than or equal to 0.03,
If Mats SorbentTrapRecord .PairedTrap Agreement does not equal MatsCalcTrapAbsoluteDifference ,
Set MatsSorbentTrapValidExists to false.

Return result E.

Else

Set MatsSorbentTrapPairedTrapAgreementValid to true.\f2

Else

Set MatsSorbentTrapValidExists to false.

Return result F.

\fi-720

Else // AbsoluteDifferencelndicator is null (not 0 or 1)

\fi-720

Set MatsSorbentTrapValidExists to false.

Return result K.

\fi-720

Results:

Result
A

B
C

D

E

G
H

Description

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.

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

Environmental Protection Agency

Page 861 of 907


-------
Draft Check Specifications

12/16/2015

I
J
K

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

Critical Error Level 1

Critical Error Level 1

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report ¦

¦ MATS Sorbent Trap Evaluation

Environmental Protection Agency

Page 862 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-12

Check Name:

Hg System Concentration Validation and Re-calculation

Related Former Checks:

Applicability:

Specifications:

Set Mats CalcHgSystemConcentration equal to null.

If the MatsSorbentTrapPairedTrapAgreementValid is equal to true, \ul

\ulnone

If the Mats SorbentTrapRecord .HgSystemConcentration is null,

If the Mats SorbentTrapRecord. MODCCode is not \ldblquote 34\rdblquote or \ldblquote 35\rdblquote ,\tab
Set MatsSorbentTrapValidExists to false.

Return result A.

Else

If the Mats SorbentTrapRecord .MODCCode is not \ldblquote 01\rdblquote , \ldblquote 02\rdblquote , \ldblquote
32\rdblquote, or 33,

\fi720

Set MatsSorbentTrapValidExists to false.

Return result B.

\fi-720 Else if the Mats SorbentTrapRecord .HgSystemConcentration 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.

Else

\sl276\slmultl\f2\fs22

\sl276\slmultl \fs20 If MatsSorbentTrapRecord .MODCCode is equal to \ldblquote 32\rdblquote ,

Set HgConcentrationCalculation = multiply 1.111 times the MatsSorbentTrapSamplingTrainList.
HgConcentration entry where MatsSorbentTrapSamplingTrainList .TrainQAStatusCode is equal to
\ldblquote PASSED\rdblquote .

\sl276\slmultl Else if MatsSorbentTrapDataRecord .MODCCode is equal to \ldblquote 33\rdblquote ,

Set HgConcentrationCalculation = the higher of the MatsSorbentTrapSamplingTrainList. HgConcentration
entries for the sampling train components.

Else //MODC "01" or "02"

Set HgConcentrationCalculation = the sum of the MatsSorbentTrapSamplingTrainList .HgConcentration for
each train divided by two.

\sl276\slmultl\f2\fs22

Environmental Protection Agency	Page 863 of 907

\fi720


-------
Draft Check Specifications

12/16/2015

\fs20 Set MatsCalcHgSystemConcentration to HgConcentrationCalculation in scientific notation with three
significant digits, keeping one to the left of the dicmal point (x.xxEx).

If Mats SorbentTrapRecord .HgSystemConcentration does not equal Mats CalcHgSystemConcentration ,
Set MatsSorbentTrapValidExists to false.

Return result D.VO

Results:

Result
A

B

C

D

Usage:

1

Description

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.

Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation

Severity

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

Critical Error Level 1

Environmental Protection Agency

Page 864 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-13

Check Name:

Update Sorbent Trap Parameters

Related Former Checks:

Applicability:

Specifications:

For SorbentTrapDictionary entry where the key is equal to MatsSorbentTrapRecord .Trapld, set:

1)	SorbentTrapValidExists set to MatsSorbentTrapValidExists .

2)	SamplingTrainProblemComponentExists set to MatsSamplingTrainProblemComponentExists .

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap Evaluation

Environmental Protection Agency

Page 865 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

MATSTRP-14

Check Name:

Number of Unit Operating Days

Related Former Checks:

Applicability:

Specifications:

If MatsSorbentTrapRecord .ModcCode is NOT equal to "34",

If MatsSorbentTrapDictionary OperatingDateList where MatsSorbentTrapDictionary key is equal to
MatsSorbentTrapRecord .Trapld contains more than 14 dates,

Return result A.

Results:

Result

Description

You reported a sorbent trap sampling period longer than the maximum 14
operating days.

Severity

A

Critical Error Level 1

Usage:
1

Emissions Data Evaluation Report	MATS Sorbent Trap Last Hour Evaluation

Environmental Protection Agency

Page 866 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

RATSTAT-1

Check Name:

Check Low Sulfur and FLOW Exemptions

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set CurrentRATAStatus = null.

Set Override RATA BAF= null.

Set MaxLevelCount = null.

Set FlowRATAExemption = false.

if ( QaStatusSystemTypeCode 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 = Current
Monitor Location Id

and the QualificationTypeCode is equal to "LOWSULF".
if (MonitorQualiJicationRecordsByHour 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 Bypasslnd == 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 UnitStackConfisurationRecordsBvHourLocation record and QualificationTypeCode is equal
to "PK" or "SK".

if (MonitorQualiJicationRecordsByHour is NOT found)

Set PeakingBypass = false.

Exit for.

Environmental Protection Agency

Page 867 of 907


-------
Draft Check Specifications

12/16/2015

else if ( CurrentUnitisPeaking)

Set PeakingBypass = true,
if (PeakingBypass)

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where the MonitoringLocationld = Current
Monitor Location Id and QualificationTypeCode is equal to "PRATA1"

if (MonitorQualiJicationRecordsByHour is found)

Set MaxLevelCount = 1.

else

Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld = Current
Monitor Location Id and the QualificationTypeCode is equal to "PRATA2"

if (MonitorQualiJicationRecordsByHour is found)

Set MaxLevelCount = 2.

else

Set MaxLevelCount = 3.

Append QaStatusSystemld to FLOWSystemlDArray 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.

Usage:

1

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Emissions Data Evaluation Report	

	Hg RATA Status Evaluation

5

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 868 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	RATSTAT-2

Check Name:	Locate Most Recent Prior RATA Test

Related Former Checks:

Applicability:	CEM Check

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 . SystemID 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 TestResult Code 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 PriorRATARecord .EndDate/Hour and the TestResult Code 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 TestResult Code is equal to "INVALID" and the EndDate/Hour is prior to the
CurrentDateHour

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus .

Usage:

1	Emissions Data Evaluation Report	C02/02 RATA Status Evaluation

2	Emissions Data Evaluation Report	H20 RATA Status Evaluation

3	Emissions Data Evaluation Report	H20M RATA Status Evaluation

Environmental Protection Agency	Page 869 of 907


-------
Draft Check Specifications

12/16/2015

4	Emissions Data Evaluation Report

5	Emissions Data Evaluation Report

6	Emissions Data Evaluation Report

7	Emissions Data Evaluation Report

8	Emissions Data Evaluation Report

Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 870 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

RATSTAT-3

Check Name:

Locate Most Recent Prior Event

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set PriorRA TAEventRecord = null.

If ( CurrentRATAStatus is null)

Locate the most recent record in QACertiflcationEventRecords where the SystemID is in the ApplicableSystemlDList 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 PriorRATARecord .EndDate/Hour OR

c)	QACertEventDate/Hour is equal to the PriorRATARecord .EndDate/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the PriorRATARecord .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
AND either:

a)	QaStatusSystemTypeCode NOT is set (HCL, HF, HG, ST) OR

b)	QACertEvent Code is in set (101, 110, 125, 130)
if ( QACertiflcationEventRecords is found)

Set PriorRA TAEventRecord = the found record in QACertiflcationEventRecords .

if ( PriorRA TA EventRecord is null)

if (PriorRATARecord is null)

Set CurrentRATAStatus = "OOC-No Prior Test or Event"

if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TA BA E = 1.0

else if (InvalidRATARecord is not null AND PriorRA TAEventRecord .QACertEventDate/Hour is after
InvalidRATARecord .EndDate/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 TAEventRecord .QACertEventDate/Hour and the
EndDate/Hour is prior to CurrentDateHour and the TestResult is equal to "INVALID"

if (RATATestRecordsByLocationForQAStatus is found)

Environmental Protection Agency

Page 871 of 907


-------
Draft Check Specifications

12/16/2015

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

else

Set InvalidRATARecord = null.

Usage:

1

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Emissions Data Evaluation Report	

	Hg RATA Status Evaluation

5

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 872 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

RATSTAT-4

Check Name:

Check RATA Result

Related Former Checks:
Applicability:

CEM Check

Specifications:

if ( CurrentRATAStatus is null and Prior RA TA Record is not null and Prior RA TA E ventRecord is null)

Set EvaluateMultiLevelRATA = true.

if ( PriorRA TA Record .QANeedsEvaluationFlag = "Y")

Set CurrentRATAStatus = "Prior Test Not Yet Evaluated".

else if ( Prior RA TA Record .TestResultCode = null or Prior RA TA Record .TestResultCode = "FAILED" or
Prior RA TA Record .TestResultCode = "ABORTED")

Locate the most recent record in QACertiflcationEventRecords where the SystemID is in the ApplicableSystemlDList
and RATARequired is equal to "Y" and the ConditionalBeginDate/Hour is:

a)	on or prior to the CurrentDateHour AND

b)	on or after the PriorRA TA Record .EndDate/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 ( QACertiflcationEventRecords is found)

Set PriorRA TAEventRecord = found record in QACertiflcationEventRecords .
elseif ( Prior RA TA Record .TestResultCode = null)

Set CurrentRATAStatus = "OOC-Prior Test Has Critical Errors",
if ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = Prior RATARecord .OverallBiasAdjustmentFactor .
else if (Prior RAT ARecord .TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Test Failed",
if ( CurrentMhv Parameter == "FLOW")

Set OverrideRATABAF = Prior RAT ARecord .OverallBiasAdjustmentFactor .
else if (Prior RAT ARecord .TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Test Aborted",
if ( CurrentMhv Parameter == "FLOW")

Set OverrideRATABAF = Prior RAT ARecord .OverallBiasAdjustmentFactor .

Usage:
1

Emissions Data Evaluation Report
Emissions Data Evaluation Report

C02/02 RATA Status Evaluation

2

H20 RATA Status Evaluation

Environmental Protection Agency

Page 873 of 907


-------
Draft Check Specifications

12/16/2015

3

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Emissions Data Evaluation Report	

	Hg RATA Status Evaluation

5

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 874 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	RATSTAT-5

Check Name:	Determine Event Conditional Status

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set SubsequentRATARecord = null.

Set RATA MissingOpDatalnfo = null.

Set RA TA Event Operating Level Count = null.

if ( CurrentRATAStatus is null and PriorRA TAEventRecord is not null)

if ( PriorRA TA EventRecord .ConditionalDataBeginDate/Hour is null or CurrentDateHour is prior to the
Prior RA TAEventRecord. ConditionalDataBeginDate/Hour)

Set CurrentRATAStatus = "OOC-Event".

Set OverrideRA TABAF =1.0.

else

Locate the earliest record in RATATestRecordsByLocationForQAStatus where the SystemID is equal to the
PriorRATAEventRecord .SystemID, the TestResult is not equal to "INVALID" and the EndDate/Hour is on or after
the PriorRATAEventRecord .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 ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = SubsequentRATARecord .OverallBiasAdjustmentFactor .

else if (RATATestRecordsByLocationForQAStatus .TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Recertification Test Failed".

if ( CurrentMhv Parameter == "FLOW")

Set OverrideRATABAF = SubsequentRATARecord .OverallBiasAdjustmentFactor .

else if (RATATestRecordsByLocationForQAStatus .TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Recertification Test Aborted".

if ( CurrentMhv Parameter == "FLOW")

Set OverrideRATABAF = SubsequentRATARecord .OverallBiasAdjustmentFactor .

else

Environmental Protection Agency

Page 875 of 907


-------
Draft Check Specifications

12/16/2015

if ( PriorRA TA Record is null)

RequiredLevelCount = MaxLevelCount
else (if Prior RA TA E ventRecord .RAT A3 Required is equal to "Y")

RequiredLevelCount = 3
else (if PriorRA TAEventRecord ,RATA2Required is equal to "Y")

RequiredLevelCount = 2

else

RequiredLevelCount = 1

If ( number of levels in RATATestRecordsByLocationForQAStatus .OpLevelCodeList is less than

RequiredLevelCount)

Set CurrentRATAStatus = "OOC- Incomplete Recertification".
if ( CurrentMhv Parameter == "FLOW")

Set OverrideRATABAF = SubsequentRATARecord .OverallBiasAdjustmentFactor .

else

Set RA TA Event Operating Level Count to the RequiredLevelCount.

If (InvalidRATARecord is null)

Locate the earliest record in RATATestRecordsByLocationForQAStatus where the SystemID is equal to the
PriorRATAEventRecord .SystemID, the TestResult is equal to "INVALID" and the EndDate/Hour is on or
after the PriorRATAEventRecord .ConditionalDataBeginDate/Hour and is before the EndDate/EndHour of
the RATATestRecordsByLocationForQAStatus record retrieved above.

if (RATATestRecordsByLocationForQAStatus is found)

Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus .

else

if (PriorRATAEventRecord .RAT A3 Required is equal to "Y")

Set RA TA Event Operating Level Count to 3.
else (if PriorRATAEventRecord ,RATA2Required is equal to "Y")

Set RA TA Event Operating Level Count to 2.

else

Set RA TA Event Operating Level Count to 1.

if ( CurrentRA TAStatus is null AND Annual Reporting Requirement == false)

If (SubsequentRATARecord is not null and SubsequentRATARecord .EndDate/Hour is greater than October
30th of the year of the CurrentDateHour ) OR ( SubsequentRATARecord is null and the CurrentDateHour is in
the 3rd quarter))

Set CurrentRATAStatus = " OOC -Conditional Period Expired".

if ( CurrentMhv Parameter == "FLOW")

Environmental Protection Agency

Page 876 of 907


-------
Draft Check Specifications

12/16/2015

Set OverrideRA TABAF =1.0.

if ( CurrentRATAStatus is null)

if ( PriorRA TAEventRecord. RATACert Event == "Y") and ( PriorRA TAEventRecord. SystemTypeCode is ==
"HF")

if (( CurrentMhvParameter <> "FLOW" and PriorRA TAEventRecord .EventCode = 125) or (
CurrentMhvParameter == "FLOW" and PriorRATAEventRecord .EventCode = 305))

if (the associated BeginDate of the system in the PriorRATAEventRecord is null)

Set CurrentRATAStatus = "Invalid Monitor System"

If (the associated SystemTypeCode of the system in the PriorRATAEventRecord == "S02")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set \{ARP, CAIRS02 , TRS02G1,
TRS02G2 \} and the UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate
of the system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is in set \{ARP, CAIRS02 ,
TRS02G1, TRS02G2 \} and the EmissionsRecording BeginDate is ON OR BEFORE the
associated BeginDate of the system in the PriorRATAEventRecord.

else if (the associated SystemTypeCode of the system in the PriorRATAEventRecord == "NOX")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set \{ARP, NBP, NHNOX,
CAIRNOX, CAIROS , TRNOX, TRNOXOS, SIPNOX \} and the UnitMonitorCertBeginDate
is ON OR BEFORE the associated BeginDate of the system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is in set \{ARP, NBP, NHNOX,
CAIRNOX, CAIROS , TRNOX, TRNOXOS, SIPNOX \} and the EmissionsRecording
BeginDate is ON OR BEFORE the associated BeginDate of the system in the
PriorRA TA EventRecord .

else if (the associated SystemTypeCode of the system in the PriorRATAEventRecord == "NOXC")

Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set \{NBP, NHNOX, CAIRNOX,
CAIROS , TRNOX, TRNOXOS, SIPNOX \} and the UnitMonitorCertBeginDate is ON OR
BEFORE the associated BeginDate of the system in the PriorRATAEventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is in set \{NBP, NHNOX,
CAIRNOX, CAIROS , TRNOX, TRNOXOS, SIPNOX \} and the EmissionsRecording
BeginDate is ON OR BEFORE the associated BeginDate of the system in the
Prior RA TA E ventRecord .

else if (the associated SystemTypeCode of the system in the PriorRATAEventRecord in set (" HCL,
HG, ST "))

Environmental Protection Agency

Page 877 of 907


-------
Draft Check Specifications

12/16/2015

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

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is in set \{ MATS \} and the
EmissionsRecording BeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorRA TA EventRecord .

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 PriorRA TA EventRecord.

If (the record in LocationProgramRecordsByHourLocation is not found)

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the EmissionsRecording BeginDate 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 (LocationProgramRecordsByHourLocation UnitMonitorCertDeadline is not null)

if (CurrentDate is prior to the LocationProgramRecordsByHourLocation
.UnitMonitorCertDeadline)

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "OOC-Conditional Period Expired",
if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else

if (CurrentDate is prior to the LocationProgramRecordsByHourLocation
.UnitMonitorCertBeginDate +18 0 days)

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "OOC-Conditional Period Expired",
if ( CurrentMhv Parameter == "FLOW")

Set OverrideRA TABAF =1.0.

else

If (the number of calendar days ON OR AFTER the PriorRATAEventRecord .QACertEventDate and
ON OR BEFORE the CurrentDateHour > 180)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

Environmental Protection Agency	Page 878 of 907


-------
Draft Check Specifications

12/16/2015

if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else if (the quarter of the PriorRATAEventRecord .QACertEventDate is equal to the quarter of the
CurrentDateHour)

If (the number of calendar days ON OR AFTER the PriorRATAEventRecord .QACertEventDate
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 PriorRATAEventRecord
.QACertEventDate 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 ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else

Set CurrentRATAStatus = "IC-Conditional".

else

Set CurrentRATAStatus = "IC-Conditional".
else if (PriorRATAEventRecord .MinOpDaysPriorQuarter is null)

Set PriorRATAEventRecord .MinOpDaysPriorQuarter = 0
Set PriorRATAEventRecord .MaxOpDaysPriorQuarter = 0

F or each quarter beginning with the quarter of the PriorRATAEventRecord .QACertEventDate and
continuing through the quarter BEFORE the CurrentDateHour :

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

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

if ( OperatingSuppDataRecordsbyLocation is not found)

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

ReportingFrequencyByLocation .ReportingFrequencyCode is equal to "Q"),

Set PriorRATAEventRecord .MinOpDaysPriorQuarter = -1

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

Environmental Protection Agency

Page 879 of 907


-------
Draft Check Specifications

12/16/2015

If the quarter being checked is the quarter of the PriorRA TA EventRecord
. Q ACertEventDate

If ( OperatingSuppDataRecordsbyLocation .OpValue MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorRA TA EventRecord .QACertEventDate > 0)

Set PriorRA TA EventRecord .MinOpDaysPriorQuarter =
OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar days in the quarter being checked that are PRIOR to the
PriorRA TAEventRecord QACertEventDate

If ( OperatingSuppDataRecordsby Location .Op Value is less than the number of
calendar days in the quarter being checked that are ON OR AFTER the
Prior RA TAEventRecord Q ACertEventDate)

Set PriorRA TA EventRecord .MaxOpDaysPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

else

Set PriorRA TAEventRecord .MaxOpDaysPriorQuarter = the number of
calendar days in the quarter being checked that are ON OR AFTER the
PriorRA TAEventRecord QACertEventDate.

else

Set PriorRA TAEventRecord .MinOpDaysPriorQuarter =

PriorRA TAEventRecord .MinOpDaysPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

Set PriorRA TA EventRecord .MaxOpDays PriorQuarter =

PriorRA TAEventRecord .MaxOpDaysPriorQuarter +
OperatingSuppDataRecordsby Location .OpValue.

if ( PriorRA TAEventRecord .MinOpDaysPriorQuarter == -1

set CurrentRATAStatus to "Missing Op Data"

else if (PriorRA TAEventRecord MinOpDaysPriorQuarter + Rpt Period Op Days Accumulator
Array for the Location > 90)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else if (PriorRA TAEventRecord MaxOpDaysPriorQuarter + 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".

else

Environmental Protection Agency

Page 880 of 907


-------
Draft Check Specifications

12/16/2015

If (the quarter of the Prior RATAEventRecord .ConditionalBeginDate is equal to the quarter of the
CurrentDateHour)

Count the number of HourlyOpData records for the location where OpTime is greater than 0 and
Date/Hour is ON OR AFTER the Prior RAT AEventRecord .ConditionalBeginDate/Hour and ON OR
BEFORE CurrentDateHour,

If the number > 720,

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else

Set CurrentRATAStatus = "IC-Conditional".

else

if (Prior RAT AEventRecord .MinOpHoursPriorQuarter is null)

Set Prior RAT AEventRecord .MinOpHoursPriorQuarter = 0
Set Prior RAT AEventRecord .MaxOpHoursPriorQuarter = 0

for each quarter beginning with the quarter of the Prior RAT AEventRecord .ConditionalBeginDate
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 OperatingSuppDataRecordsby Location 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

ReportingFrequencyByLocation .ReportingFrequencyCode is equal to "Q"),

Set Prior RAT AEventRecord .MinOpHoursPriorQuarter = -1

Set RA TA 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 PriorRATAEventRecord
. ConditionalBeginDate

Environmental Protection Agency	Page 881 of 907


-------
Draft Check Specifications

12/16/2015

If ( OperatingSuppDataRecordsbyLocation .OpValue MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
PriorRA TA EventRecord .ConditionalBeginDate/Hour > 0)

Set PriorRA TA EventRecord .MinOpHoursPriorQuarter =
OperatingSuppDataRecordsby Location .Op Value MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
PriorRA TAEventRecord. ConditionalBeginDate/Hour

If ( OperatingSuppDataRecordsby Location .Op Value is less than the number of
calendar hours in the quarter begin checked that are ON OR AFTER the
Prior RA TAEventRecord. ConditionalBeginDate/Hour)

Set PriorRA TA EventRecord .MaxOpHoursPriorQuarter =
OperatingSuppDataRecordsbyLocation .OpValue.

else

Set PriorRA TAEventRecord .MaxOpHoursPriorQuarter = the number of
calendar hours in the quarter being checked that are ON OR AFTER the
Prior RA TAEventRecord .ConditionalBeginDate/Hour.

else

Set PriorRA TAEventRecord .MinOpHoursPriorQuarter =
PriorRA TAEventRecord .MinOpHoursPriorQuarter +
OperatingSuppDataRecordsby Location .OpValue.

Set PriorRA TA EventRecord .MaxOpHours PriorQuarter =
PriorRA TAEventRecord .MaxOpHoursPriorQuarter +
OperatingSuppDataRecordsbyLocation .OpValue.

if ( PriorRA TAEventRecord .MinOpHoursPriorQuarter == -1)

set CurrentRATAStatus to "Missing Op Data"

else if (Rpt Period Op Days Accumulator Array for the location == -1)
if ( PriorRA TAEventRecord .MinOpHoursPriorQuarter > 720)

Set CurrentRATAStatus = "OOC-Conditional Period Expired",
if ( CurrentMhvParameter == "FLOW")

Set OverrideRA TABAF =1.0.

else

Set CurrentRATAStatus = "Invalid Op Data".

if ( PriorRA TAEventRecord MinOpHoursPriorQuarter + Rpt Period Op Hours Accumulator
Array for the Location > 720)

Set CurrentRATAStatus = "OOC-Conditional Period Expired".

if ( CurrentMhv Parameter == "FLOW")

Set OverrideRA TABAF =1.0.

else if (PriorEventRecord MaxOpHoursPriorQuarter + Rpt Period Op Hours Accumulator Array

Environmental Protection Agency

Page 882 of 907


-------
Draft Check Specifications

12/16/2015

for the Location > 720)

Set CurrentRATAStatus = "Undetermined-Conditional Data".

else

Set CurrentRATAStatus = "IC-Conditional".

Usage:

1

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Emissions Data Evaluation Report	

	Hg RATA Status Evaluation

5

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 883 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

RATSTAT-6

Check Name:

Evaluate Prior Multi-Level RATA

Related Former Checks:
Applicability:

CEM Check

Specifications:

Set PriorRatalsAlternateSingleLevelRATA = false.

Set ThreeLoadRATAExpirationDate to null.

If ( CurrentMhvParameter == "FLOW" AND Prior RA TA Record is not null AND CurrentRATAStatus is null, starts with "IC",
or starts with "Undetermined")

Set PriorRatalsAlternateSingleLevelRATA = true.

Set PriorMultiLevelRA TARecord = null.

Set InvalidMultiLevelRATARecord = null.

Set PriorMaxLevelRA TA Record = null.

if (the number of levels in PriorRA TA Record .OpLevelCodeList is greater than or equal to the MaxLevelCount)
Set PriorRatalsAlternateSingleLevelRATA = false,
exit check.

else if ( Prior RA TA Record .OpLevelCodeList contains 2 levels)

Set PriorRatalsAlternateSingleLevelRATA = false,
if (MaxLevelCount <> 3)

else if (AnnualReportingRequiremnt == true)

if ( Prior RA TA Record .OpLevelCodeList contains 1 level and PriorRATARecord .TestClaimCode == "SLC")

Set PriorRatalsAlternateSingleLevelRATA = 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 TestResult Code is not equal to "INVALID" and the EndDate/Hour
is prior to the PriorRATARecord .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 PriorMultiLevelRA TA Record = the found record in RATATestRecordsByLocationForQAStatus .

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the PriorRATARecord .SystemID and the EndDate/Hour is prior to the PriorRATARecord
.EndDate/Hour and the EndDate/Hour is greater than the PriorMultiLevelRATARecord .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 .

exit check.

Environmental Protection Agency

Page 884 of 907


-------
Draft Check Specifications

12/16/2015

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the Prior RA TA Record .SystemID and the EndDate/Hour is prior to the Prior RA TA Record
.EndDate/Hour and the TestResult Code 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 .

if ( PriorMultiLevelRA TA Record is not null)

Locate the most recent record in QACertificationEventRecords where the SystemID is equal to the
PriorMultiLevelRATARecord .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 PriorMultiLevelRATARecord .EndDate/Hour OR

b)	QACertEventDate/Hour is equal to the PriorMultiLevelRATARecord .EndDate/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the PriorMultiLevelRATARecord
.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 ( QACertiflcationEventRecords is found)

Set SubsequentRATARecord = PriorMultiLevelRATARecord .

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 (PriorMultiLevelRATARecord .TestResultCode = null or PriorMultiLevelRATARecord
.TestResultCode = "FAILED" ox PriorMultiLevelRATARecord .TestResultCode = "ABORTED")

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

Set OverrideRataBaf = PriorRA TA Record. OverallBiasAdjustmentFactor.

else if (the number of levels in PriorMultiLevelRATARecord .OpLevelCodeList is greater than or equal to
MaxLevelCount)

exit check.

else

Environmental Protection Agency

Page 885 of 907


-------
Draft Check Specifications

12/16/2015

Set CurrentRataStatus = "OOC-Incomplete QA RATA".

Set OverrideRataBaf = PriorRA TA Record. OverallBiasAdjustmentFactor.

if ( CurrentRATAStatus is null, starts with "IC", or starts with "Undetermined" AND RATAEventOperatingLevelCount is
null or less than MaxLevelCount))

Set InvalidMultiLevelRATARecord = null.

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID is
equal to the QaStatusSystemld and the TestResult Code is not equal to "INVALID" and the EndDate/Hour is prior to
the PriorRATARecord .EndDate/Hour and the number of operating levels in the OpLevelCodeList is equal to the
MaxLevelCount.

if (RATATestRecordsByLocationForQAStatus is found)

Set PriorMaxLevelRA TA Record = the found record in RATATestRecordsByLocationForQAStatus .

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the QaStatusSystemld and the EndDate/Hour is prior to the PriorRATARecord .EndDate/Hour and the
EndDate/Hour is greater than the PriorMaxLevelRATARecord .EndDate/Hour and the TestResult Code 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 in RATATestRecordsByLocationForQAStatus .

else

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 PriorRATARecord .EndDate/Hour and the
TestResult Code 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 in RATATestRecordsByLocationForQAStatus .
if (PriorMaxLevelRATARecord is null)

Set CurrentRATAStatus = "OOC-No Prior Maximum Level RATA".

Set OverrideRataIiaf= 1.0.

else

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

b)	equal to both the CurrentDateHour and the ConditionalBeginDate/Hour;

AND either:

Environmental Protection Agency

Page 886 of 907


-------
Draft Check Specifications

12/16/2015

a)	QACertEventDate/Hour is after the PriorM ax LevelRATARecord .EndDate/Hour OR

b)	QACertEventDate/Hour is equal to the PriorM ax LevelRATARecord .EndDate/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the PriorM ax LevelRATARecord
.EndDate/Hour)

if ( QACertificationEventRecords is found)

Set SubsequentRA TA Record = Prior MaxI.eveIRA TA Record .

Set CurrentRataStatus = "OOC-Incomplete Recertification".

Set OverrideRataBaf = 1.0.
else if ( PriorM axLevelRA TA Record .QANeedsEvaluationFlag = "Y")

Set CurrentRATAStatus = "Prior Maximum Level RATA Not Yet Evaluated",
else if ( PriorM axLevelRA TA Record .TestResultCode = null)

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Has Critical Errors".

Set OverrideRataBaf = PriorRA TA Record. OverallBiasAdjustmentFactor.
else if ( PriorM axLevelRA TA Record .TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Failed".

Set OverrideRataBaf = Prior RA TA Record. OverallBiasAdjustmentFactor.
else if ( PriorM axLevelRA TA Record .TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Aborted".

Set OverrideRataBaf = Prior RA TA Record. OverallBiasAdjustmentFactor.

else

if PriorM axLevelRA TA Record .TestReasonCode = "INITIAL",

Locate the latest record in QACertiJicationEventRecords where

1)	SystemID is equal to the QaStatusSystemld

2)	QaCertEventCode is equal to "305"

3)	QACertEventDate/Hour is prior to the CurrentDateHour ;

if ( QACertiJicationEventRecords is found , and the TestCompletionDate in the located record is after
PriorM axLevelRA TA Record EndDate)

Set PriorM axLevelRA TA Record .TestExpirationDate = the end of the quarter twenty quarters after
the TestCompletionDate .

else

Set PriorM axLevelRA TA Record .TestExpirationDate = the end of the quarter twenty quarters after
the PriorM axLevelRA TA Record EndDate.

else

Set PriorM axLevelRA TA Record .TestExpirationDate = the end of the quarter twenty quarters after the
PriorM axLevelRA TA Record EndDate.

Environmental Protection Agency	Page 887 of 907


-------
Draft Check Specifications

12/16/2015

if (the date for CurrentDateHour is after the Prior MaxLevetRA TA Record .TestExpirationDate)
if (Annual Reporting Requirement == false )

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".

Set OverrideRataBaf = PriorRA TA Record. OverallBiasAdjustmentFactor.

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location.

If ( GraceOpHours < 0)

Set CurrentRATAStatus = " Invalid Op Data ".
else if ( GraceOpHours > 720)

Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".
Set OverrideRataBaf = Prior RA TA Record. OverallBiasAdjustmentFactor.

else

For each quarter beginning with the quarter after the PriorMaxLevelRA TA Record
.TestExpirationDate 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 = Prior RA TA Record. OverallBiasAdjustmentFactor.

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

ReportingFrequencyByLocation .ReportingFrequencyCode is equal to "Q"),
Set CurrentRATAStatus = " Missing Op Data ".

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

Usage:

Environmental Protection Agency

Page 888 of 907


-------
Draft Check Specifications

12/16/2015

1

Emissions Data Evaluation Report

2

Emissions Data Evaluation Report

3

Emissions Data Evaluation Report

4

Emissions Data Evaluation Report

5

Emissions Data Evaluation Report

6

Emissions Data Evaluation Report

7

Emissions Data Evaluation Report

8

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

Environmental Protection Agency

Page 889 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

RATSTAT-7

Check Name:

Determine Expiration Dates for Most Recent Prior RATA Test

Related Former Checks:
Applicability:

CEM Check

Specifications:

if ( CurrentRATAStatus is null and Prior RA TA Record is not null and Prior RA TA E ventRecord is null)

Set PriorTestExpirationDate = null

Set PriorTestExpirationDateWithExtension = null

Set MissingOpData = false

Set NumberOfExtensionQuarters = 0

Set PriorTestExpirationDate = Prior RA TA Record .TestExpirationDate.

Set PriorTestExpirationDate WithExtension = Prior RA TA Record .TestExpirationDateWithExtension.
If ( PriorRA TA Record .IgnoreGraceForExtensions is equal to 1)

Set PriorTestlgnoreGraceForExtensions = true

Set PriorTestlgnoreGraceForExtensions = false
if (PriorTestExpirationDate is null)

if (Annual Reporting Requirement == false)

if ( PriorRA TA Record .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 Prior RA TA Record .EndDate.

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 Prior RA TA Record .EndDate.

if (PriorTestExpirationDate is null)

if (PriorRatalsAlternateSingleLevelRATA == true)

Set PriorTestExpirationDate = the end of the quarter one year after the PriorMultiLevelRA TA Record

Else

.EndDate.

if ( PriorMultiLevelRA TA Record .GracePeriodlnd == 1)

Set PriorTestExpirationDate = the end of the quarter prior to the PriorTestExpirationDate.

else

Environmental Protection Agency

Page 890 of 907


-------
Draft Check Specifications

12/16/2015

if ( PriorRA TA Record .RataFrequencyCd in set \{ 4QTRS ,8QTRS\} )

Locate the most recent QACertificationEventRecords for the Prior RA TA Record .SystemID where
RATARequired is equal to "Y" and the BeginDate/Hour is prior to the PriorRATARecord
.BeginDate/Hour.

if ( QACertiflcationEventRecords is found and RATACert Event == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the PriorRATARecord
.EndDate/Hour)

if (PriorRATARecord. SystemTypeCode is in set (HCL, HF, HG, ST))

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is equal to MATS and the
EmissionsRecording BeginDate is ON OR BEFORE the BeginDate of the associated system in
the PriorRA TA EventRecord .

If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecording BeginDate is later than QACertificationEventRecords
.CompletionTestDate)

Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecording BeginDate.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
QACertificationEventRecords .CompletionTestDate.

if (PriorRATARecord .GracePeriodlnd ==1)

Set PriorTestlgnoreGraceForExtensions = true .

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
QACertificationEventRecords .CompletionTestDate.

if (PriorRATARecord .GracePeriodlnd ==1)

Set PriorTestExpirationDate = the end of the quarter prior to the

PriorTestExpirationDate.

else

if (PriorRATARecord. SystemTypeCode is in set (HCL, HF, HG, ST))

Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecording BeginDate where the ProgramCode is equal to MATS and the
EmissionsRecording BeginDate is ON OR BEFORE the BeginDate of the associated system in
the PriorRA TA EventRecord .

If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecording BeginDate is later than PriorRATARecord .EndDate )

Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecording BeginDate.

Else

Set PriorTestExpirationDate = the end of the quarter one year after the
PriorRATARecord EndDate.

Environmental Protection Agency

Page 891 of 907


-------
Draft Check Specifications

12/16/2015

Else

Set PriorTestExpirationDate = the end of the quarter one year after the Prior RA TA Record
.EndDate.

if ( PriorRA TA Record .GracePeriodlnd ==1)

Set PriorTestExpirationDate = the end of the quarter prior to the PriorTestExpirationDate.

else

Locate the most recent QACertiflcationEventRecords for the Prior RA TA Record .SystemID where
RATARequired is equal to "Y" and the BeginDate/Hour is prior to the PriorRATARecord
.BeginDate/Hour.

if ( QACertiflcationEventRecords is found AND RATACert Event == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the PriorRATARecord
.EndDate/Hour)

Set PriorTestExpirationDate = the end of the quarter two quarters after the
QACertiflcationEventRecords .CompletionTestDate.

else

Set PriorTestExpirationDate = the end of the quarter two quarters after the PriorRATARecord
.EndDate.

Set PriorRATARecord .TestExpirationDate = PriorTestExpirationDate .

If (PriorTestlgnoreGraceForExtensions is true)

Set PriorRA TARecord .IgnoreGraceForExtensions = 1

Else

Set PriorRATARecord .IgnoreGraceForExtensions = 0
if ( CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate )

Set CurrentRATAStatus = "IC".
else if (Annual Reporting Requirement == false )

Set CurrentRATAStatus = "OOC-Expired".
if ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = PriorRATARecord. OverallBiasAdjustmentFactor.

else

if (PriorTestExpirationDate WithExtension is null)

if ( CurrentMhvParameter == "FLOW" and PriorRatalsAlternateSingleLevelRATA == true)
if ( PriorMultiLevelRA TA Record .GracePeriodlnd ==1)

StartQuarter = the quarter of the PriorMultiLevelRA TA Record .EndDate

else

StartQuarter = the quarter after the PriorMultiLevelRA TA Record .EndDate
set End Quarter = the quarter two years after the quarter of the PriorMultiLevelRA TA Record .EndDate .

Environmental Protection Agency	Page 892 of 907


-------
Draft Check Specifications

12/16/2015

if ( Prior RA TA Record .GracePeriodlnd == 1) and (PriorTestlgnoreGraceForExtensions is false)
StartQuarter = the quarter of the PriorRA TA Record .EndDate

else

StartQuarter = the quarter after the PriorRA TA Record .EndDate
set End Quarter = the quarter two years after the quarter of the PriorRA TA Record .EndDate .

Set MaximumExtensionDate = the last date of EndQuarter
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 (EarliestLocationReportDate > the last day of the quarter being checked)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one quarter.

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 Ope ratingSuppDataRecordsByLocation
.OpValue < 168)

Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.

Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one quarter.

else if ( QaStatusSystemTypeCode 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 ReportingFrequencyByLocation
.ReportingFrequencyCode is equal to "Q"),

Environmental Protection Agency

Page 893 of 907


-------
Draft Check Specifications

12/16/2015

Set Missing Op Data to true.

Set RA TA MissingOpDatalnfo = "[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 == " P B")

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 ReportingFrequencyByLocation
.ReportingFrequencyCode is equal to "Q"),

Set Missing Op Data to true.

Set RA TA MissingOpDatalnfo = "[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 ReportingFrequencyByLocation
.ReportingFrequencyCode is equal to "Q"),

Set Missing Op Data to true.

Set RA TA MissingOpDatalnfo = "[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 == " P B")

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

Environmental Protection Agency

Page 894 of 907


-------
Draft Check Specifications

12/16/2015

Add NumberOfExtensionQuarters to PriorTestExpirationDateWithExtension.
If PriorTestExpirationDateWithExtension is greater thanMaximumExtensionDate

Set PriorTestExpirationDateWithExtension = MaximumExtensionDate
Set Prior RATA Record .TestExpirationDateWithExtension = PriorTestExpirationDateWithExtension .

else

Set Prior RATA Record .TestExpirationDateWithExtension = PriorTestExpirationDate
If ( CurrentDateHour is ON OR BEFORE the PriorTestExpirationDateWithExtension )

S et CurrentRATAStatus = "IC-Extension".
else i f (Missing Op Data is true )

Set CurrentRATAStatus = " Missing Op Data
Set Prior RATA Record .TestExpirationDateWithExtension = null
else if (RptPeriodOp Time Accumulator Array == -1)

Set CurrentRATAStatus = " Invalid Op Data

else

Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if ( GraceOpHours > 720)

Set CurrentRATAStatus = "OOC-Expired".
if ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = Prior RATARecord. OverallBiasAdjustmentFactor.

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 CurrentRATAStatus = "IC-Grace".

else

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

Set CurrentRATAStatus = "OOC-Expired".

Environmental Protection Agency

Page 895 of 907


-------
Draft Check Specifications

12/16/2015

if ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = Prior RATARecord. OverallBiasAdjustmentFactor.
exit for.

else

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 ReportingFrequencyByLocation
.ReportingFrequencyCode is equal to "Q"),

Set CurrentRATAStatus = " Missing Op Data

Set RA TA 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.

if ( CurrentRATAStatus is null)

Set CurrentRATAStatus = "IC-Grace".

I f (PriorRatalsAlternateSingleLevelRATA == true AND CurrentRATAStatus = "OOC-Expired")
Set CurrentRATAStatus = " OOC - Incomplete QA RATA ".
if ( CurrentMhvParameter == "FLOW")

Set OverrideRATABAF = Prior RAT ARecord. OverallBiasAdjustmentFactor.

Usage:

1

Emissions Data Evaluation Report	

	C02/02 RATA Status Evaluation

2

Emissions Data Evaluation Report	

	H20 RATA Status Evaluation

3

Emissions Data Evaluation Report	

	H20M RATA Status Evaluation

4

Emissions Data Evaluation Report	

	Hg RATA Status Evaluation

5

Emissions Data Evaluation Report	

	NOX RATA Status Evaluation

6

Emissions Data Evaluation Report	

	NOXC RATA Status Evaluation

7

Emissions Data Evaluation Report	

	S02 RATA Status Evaluation

8

Emissions Data Evaluation Report	

	Stack Flow RATA Status Evaluation

Environmental Protection Agency

Page 896 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	RATSTAT-8

Check Name:	Determine Final RATA Status

Related Former Checks:

Applicability:	CEM Check

Specifications:

Set AlternateRA TA Record = null,
if ( CurrentRATAStatus begins with "OOC")

Set InvalidRATATestNumber = null,
if (InvalidMultiLevelRATARecord is not null)

Set Invalid RATA Test Number = InvalidMultiLevelRATARecord .TestNumber
Set CurrentRATAStatus = CurrentRATAStatus &
if ( CurrentMhvParameter == "FLOW")

Set RATA StatusBAF = InvalidMultiLevelRATARecord .OverallBiasAdjustmentFactor .
else if (InvalidRATARecord is not null)

Set InvalidRATATestNumber = Invali dRATARecord TestNumber
Set CurrentRATAStatus = CurrentRATAStatus &
if ( CurrentMhv Parameter == "FLOW")

Set RA TA Status BAF = Invali d RAT ARecord .OverallBiasAdjustmentFactor .
else if ( OverrideRATABAFis not null)

if ( CurrentMhv Parameter == "FLOW")

Set RA TA Status BAF = OverrideRA TABAF
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 .ComponentID to ComponentlDList.

if ( ComponentlDList is not null)

For each record in MonitorSystemComponentRecordsforHourandLocation where the ComponentID is in
ComponentLDList and SysTypeCd in list \{"C02", "02", "NOXC"\} .

Add MonitorSystemComponentRecordsforHourandLocation .SystemID to AlternateSystemlDList.

if (AlternateSystemlDList is not null)

If ( PriorRA TA EventRecord is not null)

Environmental Protection Agency	Page 897 of 907


-------
Draft Check Specifications

12/16/2015

If (Prior RATAEventRecord .ConditionalBeginDate 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 Prior RAT AEventRecord .ConditionalBeginDate/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 AlternateRA TA Record = the found record in RATATestRecordsByLocationForQAStatus.

if (AlternateRATARecord .TestResultCode = null)

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Has Critical Errors".

else if (AlternateRATARecord .TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Failed".

else if (AlternateRATARecord .TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Aborted".

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where
the SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to the CurrentDateHour
and the EndDate/Hour is after the Prior RAT AEventRecord .ConditionalBeginDate/Hour and the
QANeedsEvaluationFlag is equal to "Y".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRATARecord = the found record in RATATestRecordsByLocationForQAStatus.

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

if (AlternateRATARecord .TestResultCode = null)

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Has Critical Errors".

else if (AlternateRATARecord .TestResultCode = "FAILED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Failed".

else if (AlternateRATARecord .TestResultCode = "ABORTED")

Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Aborted".

Environmental Protection Agency

Page 898 of 907


-------
Draft Check Specifications

12/16/2015

else

Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the
SystemID is in AlternateSystemlDList and the EndDate/Hour is prior to the CurrentDateHour and the
EndDate/Hour is after the PriorRATARecord .EndDate/Hour and the QANeedsEvaluationFlag is equal
to "Y".

if (RATATestRecordsByLocationForQAStatus is found)

Set AlternateRA TA Record = the found record in RATATestRecordsByLocationForQAStatus.
Set CurrentRATAStatus = "Prior Alternate System RATA Not Yet Evaluated".

If ( Current RATA Status begins with "IC" or "Undetermined ")

If (PriorRATARecord is null)

Set RA TA Status BAF = 1

else if ( Current RATA Status begins with "IC-Cond", "Undetermined-Cond" or "PendingOOC-Cond" AND

( Prior RA TA Event Record .QACertEventCode 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 TestResult Code is NOT equal to "INVALID" and the EndDate/Hour is
prior to the CurrentDateHour

If found,

Set RATA 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 RATATestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the QaStatusSystemld, the TestResult Code 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 = PriorRATARecord .OverallBiasAdjustmentFactor
If ( CurrentRATAStatus does not begin with "IC")

Return result CurrentRATAStatus.

Results:

Result	Description	Severity

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

Environmental Protection Agency

Page 899 of 907


-------
Draft Check Specifications

12/16/2015

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
QARATA

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*

System record for MonitoringSystemID [system] has a critical error.

The [testtype] status for [key] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or
invalid.

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

The [testtype] status for [key] could not be determined, because a Unit
Program record associated with the initial certification event for
QACertEventCode [code] QACertEventDate [eventdate] either does not exist
or has a UnitMonitorCertificationBeginDate inconsistent with the BeginDate
of the associated Monitor System record.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired.

The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired. An invalid RATA was
ignored.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for SystemID [eventkey], but you did not
indicate the use of conditional data.

You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for SystemID [eventkey], but you did not
indicate the use of conditional data. An invalid [testtype] was ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has
expired.

The prior RATA for [RATASYS] with TestNumber [testnum] has expired.
An invalid prior [testtype] with TestNumber [invtestnum] was ignored.

The prior RATA for FLOW SystemID [RATASYS] with TestNumber
[testnum] was a single-level RATA instead of the required multi-level
RATA. 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].

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

Environmental Protection Agency

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

Page 900 of 907


-------
Draft Check Specifications

12/16/2015

OOC-Prior
Alternate System
RATA Aborted

OOC-Prior
Alternate System
RATA Failed

OOC-Prior
Alternate System
RATA Has Critical
Errors

OOC-Prior
Maximum Level
RATA Aborted

OOC-Prior
Maximum Level
RATA Aborted*

OOC-Prior
Maximum Level
RATA Expired

OOC-Prior
Maximum Level
RATA Expired*

OOC-Prior
Maximum Level
RATA Failed

OOC-Prior
Maximum Level
RATA Failed*

OOC-Prior
Maximum Level
RATA Has Critical
Errors

OOC-Prior
Maximum Level
RATA Has Critical
Errors*

OOC-Prior Test
Aborted

OOC-Prior Test
Aborted*

OOC-Prior Test
Failed

OOC-Prior Test
Failed*

OOC-Prior Test
Has Critical Errors

OOC-Prior Test
Has Critical
Errors*

OOC-

Recertification Test
Aborted

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID	Critical Error Level 1

[altsys] was aborted, so [key], which contains a component that is also in the
former system, is out-of-control.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID	Critical Error Level 1

[altsys] failed, so [key], which contains a component that is also in the former
system, is out-of-control.

A prior RATA with TestNumber [alttestnum] for MonitoringSystemID	Critical Error Level 1

[altsys] has critical errors, so [key], which contains a component that is also
in the former system, is out-of-control.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
was aborted.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
was aborted. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
has expired.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
has expired. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
failed.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
failed. An invalid RATA with TestNumber [invtestnum] was ignored.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1
has critical errors.

The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] Critical Error Level 1

has critical errors. An invalid RATA with TestNumber [invtestnum] was

ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was
aborted.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was
aborted. An invalid prior [testtype] with TestNumber [invtestnum] was
ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum]
failed.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum]
failed. An invalid prior [testtype] with TestNumber [invtestnum] was
ignored.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has
critical errors.

The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has
critical errors. An invalid prior [testtype] with TestNumber [invtestnum] was
ignored.

The subsequent recertiflcation RATA for SystemID [subsys] with
TestNumber [subtestnum] was aborted.

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1
Critical Error Level 1

Critical Error Level 1

Environmental Protection Agency

Page 901 of 907


-------
Draft Check Specifications

12/16/2015

ooc-

Recertification Test
Aborted*

OOC-

Recertification Test
Failed

OOC-

Recertification Test
Failed*

OOC-

Recertification Test
Has Critical Errors

OOC-

Recertification Test
Has Critical
Errors*

Prior Alternate
System RATA Not
Yet Evaluated

Prior Maximum
Level RATA Not
Yet Evaluated

Prior Multi-Level
RATA Not Yet
Evaluated

Prior Test Not Yet
Evaluated

Recertification Test
Not Yet Evaluated

Undetermined-
Conditional Data

Usage:

1

2

3

4

5

6

7

8

The subsequent recertification RATA for SystemID [subsys] with	Critical Error Level 1

TestNumber [subtestnum] was aborted. An invalid [testtype] with
TestNumber [invtestnum] was ignored.

The subsequent recertification RATA for SystemID [subsys] with	Critical Error Level 1

TestNumber [subtestnum] failed.

The subsequent recertification RATA for SystemID [subsys] with	Critical Error Level 1

TestNumber [subtestnum] failed. An invalid [testtype] with TestNumber
[invtestnum] was ignored.

The subsequent recertification RATA for SystemID [subsys] with	Critical Error Level 1

TestNumber [subtestnum] has critical errors.

The subsequent recertification RATA for SystemID [subsys] with	Critical Error Level 1

TestNumber [subtestnum] has critical errors. An invalid [testtype] with
TestNumber [invtestnum] was ignored.

The RATA status for [key] could not be determined, because a prior RATA Critical Error Level 1
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]- Critical Error Level 1
level flow RATA with TestNumber [maxtestnum] has not yet been evaluated.

The RATA status could not be determined, because the prior multi-level flow Critical Error Level 1
RATA for SystemID [RATASYS] with TestNumber [multitestnum] has not
yet been evaluated.

The RATA status could not be determined, because the applicable prior	Critical Error Level 1

RATA for SystemID [RATASYS] with TestNumber [testnum] has not yet
been evaluated.

The RATA status could not be determined, because the subsequent	Critical Error Level 1

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

conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [eventkey].

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

Environmental Protection Agency

Page 902 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

WSISTAT-1

Check Name:

Initialize Status Checking

Related Former Checks:

Applicability:

Specifications:

Set WsiStatus to null.

Usage:

1	Emissions Data Evaluation Report	Hg System Integrity Status Evaluation

Environmental Protection Agency	Page 903 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	WSISTAT-2

Check Name:	Locate Prior Test

Related Former Checks:

Applicability:

Specifications:

For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.
If ( WsiTestDictionary entry exists)

Set WsiPriorTestRecord to WsiTestDictionary .MostRecentTestRecord.

Else

Set WsiPriorTestRecord to null.

Usage:

1	Emissions Data Evaluation Report	Hg System Integrity Status Evaluation

Environmental Protection Agency

Page 904 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:

WSISTAT-3

Check Name:

Check For Intervening Event

Related Former Checks:

Applicability:

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

d)	QaCertEventCode is equal to "110" or "130"

If found

If ( WsiPriorTestRecord .TestResultCode is equal to null)

Set WsiStatus to "OOC-Test Has Critical Errors".

Else if ( WsiPriorTestRecord .TestResultCode is equal to "FAILED")

Set WsiStatus to "OOC-Test Failed".

Else

For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.

If ( WsiTestDictionary .OperatingDateList is not null) AND (the count of days in WsiTestDictionary
.OperatingDateList is greater than 7)

Set WsiStatus to "OOC-Expired".

Else

Set WsilnterveningEventRecord to the located record.

Set WsiStatus to "OOC-Event".

Else

Set WsiStatus to "IC".

Usage:
1

Emissions Data Evaluation Report	Hg System Integrity Status Evaluation

Environmental Protection Agency

Page 905 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	WSISTAT-4

Check Name:	Return the Final Status

Related Former Checks:

Applicability:

Specifications:

If ( WsiStatus does not begin with "IC")
r eturn result WsiStatus .

Results:

Result
OOC-Event

OOC-Expired
OOC-No Prior Test

OOC-Test Failed

OOC-Test Has
Critical Errors

Usage:

1

Description

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

Emissions Data Evaluation Report	Hg System Integrity Status Evaluation

Environmental Protection Agency

Page 906 of 907


-------
Draft Check Specifications

12/16/2015

Check Code:	WSISTAT-5

Check Name:	Check for Intervening Like-Kind Event

Related Former Checks:

Applicability:	General Check

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 WsiPriorTestRecord .TestDateHour.
If found

Set WsilnterveningLinkKindEventRecord to the located record in QACertiflcationEventRecords .
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 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".

Usage:

1	Emissions Data Evaluation Report	Hg System Integrity Status Evaluation

Environmental Protection Agency

Page 907 of 907


-------