ECMPS Emissions
Check Specifications
United States Environmental Protection Agency
Office of Air and Radiation
Clean Air Markets Division
Ariel Rios Building
1200 Pennsylvania Avenue
Washington, DC 20460
March 04, 2020
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Table of Contents
Appendix D and E Status
1
Daily Calibration Status
37
Daily Calibration Test
50
Daily Emissions Data
104
Daily Interference Status
120
Daily Test
127
EM Weekly System Integrity Test
134
EM Weekly Test Summary
146
Flow-to-Load Status
156
Hourly Aggregation
170
Hourly Appendix D
217
Environmental Protection Agency
Page 959 of 959
-------
Hourly Appendix E 279
Hourly Apportionment 295
Hourly Calculated Data 321
Hourly Derived Data 382
Hourly General 450
Hourly Monitor Data 493
Hourly Operating Data 568
Leak Status 644
Linearity Status 653
LME 687
MATS Calculated Hourly Value Checks 741
MATS Derived Hourly Value Checks 769
MATS Hourly GFM Data 791
MATS Monitor Hourly Value Checks 801
MATS Operating Hour Checks 836
MATS Sampling Train Checks 862
MATS Sorbent Trap Data 886
NSPS4T Summary, Compliance Period and 906
Annual Checks 913
RATA Status 953
Weekly System Integrity Status
-------
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Appendix D and E Status
Environmental Protection Agency
Page 1 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: ADESTAT-1
Check Name: Determine Appendix E Status
Related Former Checks:
Applicability:
Description:
Validation Tables:
Fuel Code (Lookup Table)
Specifications:
Set PriorAppendixERecord = null.
Set InvalidAppendixERecord = null.
Set CurrentAppendixEStatus = null.
Set PriorAppendixEEventRecord = null.
Set SubsequentAppendixERecord = null
Set AppendixEMissingOpDatalnfo = null.
If (App E Op Code in set {N, W, X, Y, Z } ) AND AppE NOXE System ID is not null)
Append AppE NOXE System ID to NOXE System ID Array.
Locate the most recent record in AppendixETestRecordsByLocationForQAStatus for the location where the SystemID is equal to
the AppE NOXE System ID and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour.
if (AppendixETestRecordsByLocationForQAStatus is found)
Set Prior AppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.
Locate the most recent record in AppendixETestRecordsByLocationForQAStatus for the location where the SystemID is
equal to the AppENOXESystemID and the TestResultCode is equal to "INVALID" and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour and the EndDate/Hour is greater than the PriorAppendixERecord.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 TestResultCode is equal to "INVALID" and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour.
if (AppendixETestRecordsByLocationForQAStatus is found)
Set InvalidAppendixERecord = the found record in AppendixETestRecordsByLocationForQAStatus.
if {PriorAppendixERecord is not null)
if (Prior A ppendixERecord .Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentAppendixEStatus = "Prior Test Not Yet Evaluated",
else if (Pri or A pp en dixERecord. Tc s t R c s u 11C o dc = null)
Set CurrentAppendixEStatus = "OOC-Prior Test Has Critical Errors".
Environmental Protection Agency
Page 2 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set PriorTestExpirationDate = Prior A ppen dixERecord. Tc s t E \ p i ra t i o n Da tc
if (PriorTestExpirationDate is null)
Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
PriorAppendixERecord ^EndDate/Hour.
if (CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate)
Set CurrentAppendbcEStatus = "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
PriorAppendixERecord.EndDate/Hour
if (QACertificationEventRecords is found)
Set PriorAppendixEEventRecord = the found record in QACertificationEventRecords.
if (the number of calendar days ON OR AFTER the
PriorAppendixEEventRecord.QACertEyentDate and ON OR BEFORE the
CurrentOperatingDate/Hour > 180)
Set CurrentAppendbcEStatus = "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.Q ACertEventDate 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 AppendixEMissingOpDiitalnfo = "[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
Environmental Protection Agency
Page 3 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
PriorAppendixEEventRecord.QACertEveniDate
If (()peratingSuppI)ataRecordsbyL ocation. O p Va 1 lie
MINUS the number of calendar days in the quarter
being checked that are PRIOR to the
PriorAppendixEEventRecord.QACertEventDate > 0)
Set
PriorAppendixEEventRecord.MinOpDaysPrio
rQuarter =
()peratingSuppI)ataRecordsbyL ocation. O p Va 1
ue MINUS the number of calendar days in the
quarter being checked that are PRIOR to the
PriorAppendixEEventRecord. QACertEventDa
te
If (()peratingSuppI)ataRecordsbyLocation.Op Va 1 lie is
less than the number of calendar days in the quarter
being checked that are ON OR AFTER the
PriorAppendixEEventRecord.QACertEventDate)
Set
PriorAppendixEEventRecord.MaxOpDaysPrio
rQuarter =
()peratingSuppl)ataRecordsbyL ocation. O p Va 1
ue.
else
Set
PriorAppendixEEventRecord.MaxOpDaysPrio
rQuarter = the number of calendar days in the
quarter being checked that are ON OR AFTER
the
Prior AppendixEEventRecord. QACertEventDa
te.
Set
PriorAppendixEEventRecord.MinOpDaysPriorQuarter
PriorAppendixEEventRecord.MinOpDaysPriorQuarter
+ ()peratingSuppl)ataRecordsbyL ocation. O p Va 1 lie.
Set PriorAppendixEEventRecord.MaxOpDays,
PriorQuarter =
PriorAppendixEEventRecord.MaxOpDaysPriorQuarte
r + ()peratingSuppl)ataRecordsbyL ocation. O p Va 1 lie.
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.MinOpDaysPnorQuarter == -1)
Environmental Protection Agency
Page 4 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set CurrentAppendixEStatus = 'Missing Op Data"
else if (PriorAppendixEEventRecord.MinOpDaysPriorQuarter + Rpt Period Op Days
Accumulator Array for the Location > 30)
Set CurrentAppendixEStatus = "OOC-Event".
else if (PriorAppendixEEventRecord.MaxOpDaysPriorQuarter + Rpt Period Op Days
Accumulator Array for the Location > 30)
Set CurrentAppendixEStatus = "Undetermined-Event".
else
Set CurrentAppendixEStatus = "IC".
else
Set CurrentAppendixEStatus = "IC".
if (AppEFuelCode is not equal to "MIX")
Locate the earliest record in AppendixETestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the AppENOXESystemID and the TestResultCode is not equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour
if (AppendixETestRecordsByLocationForQAStatus is found)
Set SubsequentAppendixERecord = the found record in
AppendixETestRecordsByLocationForQAStatus.
Locate the earliest record in AppendixETestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the AppENOXESystemID and the TestResultCode is equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour and the EndDate/Hour is before the
SubsequentAppendixERecord.EndDatdHour
if (AppendixETestRecordsByLocationForQAStatus is found)
Set InvalidAppendixERecord = the found record in
AppendixETestRecordsByLocationForQAStatus.
Locate the earliest record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
AppEFuelCode and the OpTypeCode is equal to "OPHOURS"
If OperatingSuppDataRecordsbyLocation is found)
Set FuelOpSuppDataRecord = the found record in OperatingSuppDataRecordsbyLocation
Set DateFuelFirstCombusted = end date of quarter of the FuelOpSuppDataRecord .RptPeriodID
- int((FuelOpSuppDataRecord .OpValue - 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"
Environmental Protection Agency
Page 5 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Locate the record in the FuelCode lookup table where the FuelCode is equal to AppEFuelCode.
Locate the record in FuelRecordsByHourLocation for the hour and location where the FuelCode
is equal to the FuelCode. UnitFuelCode
if (FuelRecordsByHourLocation is not found OR more than one FuelRecordsByHourLocation
is found)
Set CurrentAppendbcEStatus = "Invalid Location Fuel"
else if (FuelRecordsByHourLocation. IndicatorCodc is equal to "S",
if (SubsequentA ppendbcERecord. Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentAppendbcEStatus = "Subsequent Test Not Yet Evaluated",
else if (SubsequentAppendixERecord.TestResultCode = null)
Set CurrentAppendbcEStatus = "OOC-Subsequent Test Has Critical Errors".
else
Set CurrentAppendbcEStatus = "IC"
Set PriorAppendbcERecord = SubsequentAppendbcERecord
else
Set CurrentAppendbcEStatus = "OOC-No Prior Test"
else
Set CurrentAppendbcEStatus = "OOC-No Prior Test"
Locate the earliest record in AppendixETestRecordsByLocationForQAStatus for the location where the
SystemID is equal to the AppENOXESystemID and the TestResultCode is equal to "INVALID" and the
EndDate/Hour is on or after the CurrentOperatingDate/Hour
if (AppendbcETestRecordsByLocationForQAStatus is found)
Set InvalidAppendixERecord = the found record in
AppendbcETestRecordsByLocationForQAStatus.
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.
Environmental Protection Agency
Page 6 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Invalid Location
Fuel
Invalid Monitor
System
Invalid Op Data
Missing Fuel Op
Data
Missing Op Data
OOC-Event
OOC-Event*
OOC-Expired
OOC-Expired*
OOC-No Prior
Test
OOC-No Prior
Test*
OOC-Prior Test
Has Critical
Errors
OOC-Prior Test
Has Critical
Errors*
OOC-Subsequent
Test Has Critical
Errors
OOC-Subsequent
Test Has Critical
Errors*
Prior Test Not Yet
Evaluated
Subsequent Test
Not Yet
Evaluated
Undetermined-Ev
ent
Response
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because you did not report a single, valid unit fuel record for FuelCode [unitfuel] that
was active during the current hour.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Monitor System record for the NOXE system has a critical error.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the OperatingTime in at least one Hourly Operating Data records was missing
or invalid.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Op Supp Data record for OPHOURS for FuelCode [fuel] is missing for one
or more previous reporting periods. If you have submitted emissions data for prior
quarters, you should be able to retrieve these records by logging on to the EPA host.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the Op Supp Data record for OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for MonitoringSystemID [ID], but you did not perform a
subsequent Appendix E test within the specified timeframe.
You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for MonitoringSystemID [ID], but you did not perform a
subsequent Appendix E test within the specified timeframe. An invalid Appendix E
test was ignored.
The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
expired.
The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
expired. An invalid prior Appendix E test TestNumber [invtestnum] was ignored.
You did not report a prior Appendix E test for MonitoringSystemID [ID],
You did not report a prior Appendix E test for MonitoringSystemID [ID]. An invalid
prior Appendix E test Test Number [invtestnum] was ignored.
The applicable prior Appendix E test TestNumber [testnum] for MonitoringSystemID
[ID] has critical errors.
The prior Appendix E test TestNumber [testnum] for MonitoringSystemID [ID] has
critical errors. An invalid prior Appendix E test TestNumber [invtestnum] was
ignored.
The subsequent recertification Appendix E test TestNumber [subtestnum] for
MonitoringSystemID [ID] has critical errors.
The subsequent recertification Appendix E test TestNumber [subtestnum] for
MonitoringSystemID [ID] has critical errors. An invalid Appendix E test TestNumber
[invtestnum] was ignored.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the applicable prior Appendix E test TestNumber [testnum] for the system has
not yet been evaluated.
The Appendix E test status for MonitoringSystemID [ID] could not be determined,
because the subsequent certification test TestNumber [subtestnum] for the system has
not yet been evaluated.
The software could not determine if the current hour was within the 30-operating day
window required to conduct another Appendix E test following QACertEventCode
[code] QACertEventDate [eventdate] for MonitoringSystemID [ID],
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 7 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report — Hourly Configuration Evaluation
Conditions:
App E Checks Needed Equals true
2
Process/Category:
Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Conditions:
App E Constant Fuel Mix Equals true
3
Process/Category:
Emissions Data Evaluation Report Hourly Fuel Flow
Conditions:
App E Constant Fuel Mix Equals false
Environmental Protection Agency
Page 8 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: ADESTAT-2
Check Name: Locate Most Recent Prior Accuracy Test
Related Former Checks:
Applicability:
Description: Determines if there is an applicable prior accuracy test.
Specifications:
Set Current Accuracy Status = null.
Set PriorAccuracyRecord = null.
Set InvalidAccuracyRecord = null.
Set Inappropriate Transmitter Transilucer Test to false.
Locate the most recent record in Accuracy TestRecordsByLocationForQAStatus for the location where the ComponentID is equal to the
Fu el Flo i vCompon entRecord ToCh eck. C o m po n c n 11D and the TestResult is not equal to "INVALID" and the EndDate/Hour is prior to the
CurrentOperatingDate/Hour
if (A ecu racy Test Records By L ocation ForQAStatus i s found)
Set PriorAccuracyRecord = the found record in Accuracy TestRecordsByLocationForQAStatus.
if (PriorAccuracyRecord.TcstTypcCodc is equal to "FFACCTT" AND
FuelFlowComponentRecordToCheck.SampleAcquisitiovMethod is NOT equal to "ORF", "NOZ", or "VEN")
Set Inappropriate Transmitter Transilucer Test to true.
Locate the most recent record in Accuracy TestRecordsByLocationForQAStatus for the location where the ComponentID is equal
to the Fu el Flo i vCompon ent Record ToCh eck .ComponentID and the EndDate/Hour is prior to the CurrentOperatingDate/Hour
and the EndDate/Hour is greater than the Prior Accuracy Record.EndDatdHour and the TestResult is equal to "INVALID".
if (A ecu racy Test Records By L ocation ForQAStatus i s found)
Set InvalidAccuracyRecord = the found record in Accuracy TestRecordsByLocationForQAStatus.
if (Prior A ccuracy Record Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentAccuracyStatus = "Accuracy Test Not Yet Evaluated".
else if (Prior A ccuracyRecord. Te s t Re s u 11C ode is null)
Set CurrentAccuracyStatus = "OOC-Accuracy Test Has Critical Errors".
else if (PriorAccuracy Record.7estRssultCode = "FAILED")
Set CurrentAccuracyStatus = "OOC-Accuracy Test Failed".
else if (PriorAccuracy Record.7QstRssultCode = "ABORTED")
Set CurrentAccuracyStatus = "OOC-Accuracy Test Aborted".
else
Set CurrentAccuracyStatus = "OOC-No Prior Accuracy Test"
Locate the most recent record in Accuracy TestRecordsByLocationForQAStatus for the location where the ComponentID is equal
to the Fu el Flo i vCompon ent Record ToCh eck .ComponentID and the TestResult is equal to "INVALID" and the EndDate/Hour is
prior to the CurrentOperatingDate/Hour.
Environmental Protection Agency
Page 9 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
if (.Accuracy TestRecordsByLocationForQAStatus is found)
Set InvalidAccuracyRecord = the found record in Accuracy TestRecordsByLocationForQAStatus.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 10 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-3
Check Name:
Related Former Checks:
Locate Most Recent Prior Accuracy Event
Applicability:
Description:
Determines if there is a applicable prior event requiring an Accuracy test.
Specifications:
Set PriorAccuracyEventRecord = null.
If (CurrentAccuracy Status is null)
Locate the most recent record in QACertiflcationEventRecords WHERE
a) the ComponentID is equal to the Fu el Flo i vCompon entRecord ToCh eck. C o m po n c n 11D 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.EndDi\\dY\oux and the
Prior Accuracy Record Rc\\\s{'c\W'c\{\o\\r)'c\{clHoyu.
if (QACertiflcationEventRecords is found)
Set PriorAccuracyEventRecord = the found record in QACertiflcationEventRecords.
Set CurrentA ccuracyStatus = "OOC-Event".
else
Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
Prior Accuracy Record .E\\Ar>'c\{clHom.
if (CurrentOperatingDate/Hour is AFTER the PriorTestExpirationDate)
Set CurrentAccu racy Status = "OOC-Accuracy Test Expired".
else
Set PriorTestExpirationDate = 4 quarters after the end of the quarter of the later of the
Prior A ccuracyRecord. E nd D a tc/ H o u r and the /Vmv4«.'w/y/cv7?6'«;/y/. Reinstallation Date/Hour.
Set Prior A ccuracyRecord.TcsiE x p i ra t i o n Da tc = PriorTestExpirationDate.
If (CurrentOperatingDate/Hour is ON OR BEFORE the PriorTestExpirationDate)
Set CurrentA ccuracyStatus = "IC".
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 11 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-4
Check Name:
Related Former Checks:
Determine Eligibility for Fuel Flow to Load Testing (Accuracy)
Applicability:
Description:
Determines if this component is eligible to extend their accuracy text expiration date using fuel flow to load
testing.
Specifications:
Set FF2LAccuracyEligible = null.
Set FF2LAccuracyCheckDate = null.
if (CurrentA ecu racy Status is null)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystQvalD and the TestResult is equal to "PASSED", "EXC168H", "INPROG", or
"FAILED" and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the
later of the Prior A ccuracy Record. E ndDa tc and the Reinstallation Date.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set ValidFuelFlowTestExistsForEachComponent = true.
Set CertificationCheckDate = the later of the Prior A ccuracy Record. E ndDa tc and the
Prior Accuracy Record Rc\\\s{'c\W'c\{\o\\r)'c\{c.
for each ComponentRecord in FuelFlowComponentRecords
Locate the latest AccuracyTestRecord for the location in AccuracyTestRecordsByLocationForQAStatus where:
1) ComponentID is equal to the ('omponeniRecord. Component ID.
2) The quarter of the later of the EndDate and the ReinstallationDate is before the quarter of
CurrentOperatingDate.
if (AccuracyTestRecord was NOT found)
Set ValidFuelFlowTestExistsForEachComponent = false.
else if (AccuracyTestRecord AQStRasaMCodQ does NOT equal "PASSED")
Set ValidFuelFlowTestExistsForEachComponent = false.
else if (the later of A cciirac vTesiRecord. E ndDa tc and the A ccuracyTestRecord^R&im,\dl\?AiovtD?AQ is on or after
CurrentFuelFlowRecord. SystemBeginDate)
Set ValidFuelFlowTestExistsForEachComponent = false.
else
Set CertificationCheckDate = the later of CertificationCheckDate AND AccuracyTestRecord.EndDate
AND A6'67/ra6;i 7£'.v;/^£'6r;«/.ReinstallationDate.
if (AccuracyTestRecord.TestTypeCode == "FFACCTT")
Locate the latest PeiTestRecord for the location in PEITestRecordsByLocationForQAStatus where:
1) ComponentID is equal to the ('omponeniRecord. Component ID.
2) The quarter of the EndDate is before the quarter of CurrentOperatingDate.
Environmental Protection Agency
Page 12 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (PeiTestRecord was NOT found)
Set ValidFuelFlowTestExistsForEachComponent = false,
else if ( Peil'esiReconl.TcslRcsullCodc does NOT equal "PASSED")
Set ValidFuelFlowTestExistsForEachComponent = false,
else if (PeiTestRecord.EndDate is on or after CurrentFuelFlowRecord. SystemBeginDate)
Set ValidFuelFlowTestExistsForEachComponent = false.
else
Set CertificationCheckDate = the later of CertificationCheckDate AND PeiTestRecord.EndDate.
if ( ValidFuelFlowTestExistsForEachComponent is equal to true ) AND ( CertificationCheckDate is NOT null)
Set FF2LAccuracyEligible = true.
Set FF2LAccuracyCheckDate = CertificationCheckDate.
Set FF2LAccuracyEligible = true.
Set FF2LAccuracyCheckDate = the later of the Prior A ccuracy Record. E ndDa tc and the
Prior Accuracy Record.Rcms\a\\a\\onDa\c.
for each record in FuelFlowComponentRecords
if (FuelFloivComponentRecords. Componcn11D is not equal to
Fu el Flo i vCompon en tRecord ToCh eck. C o m po n c n 11D)
Locate the latest record in Accuracy TestRecordsByLocationForQAStatus for the location where
the ComponentID is equal to the FuelFlowComponentRecords. ComponentID and the TestResult
is equal to "PASSED" and the quarter of the later of the EndDate and the ReinstallationDate is in
the same or adjacent quarter of the later of the Prior A ccuracy Record. E ndDa tc and the
Prior Accuracy Record.Rcms\a\\a\\onDa\c.
if (Accuracy TestRecordsByLocationForQAStatus is not found)
Set FF2LAccuracyEligible = false, and exit this check.
else
Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
Accuracy TestRecordsByLocationForQAStatus.EndDate and the
Accuracy TestRecordsByLocationForQAStatus.ReinstallationDate.
if (Accuracy TestRecords/iyLocationForOAStatus.TcslTypcCodc is equal to
"FFACCTT")
Locate the latest record in PEITestRecordsByLocationForQAStatus for the
location where the ComponentID is equal to the
FuelFlowComponentRecords. ComponentID and the TestResult is equal to
"PASSED" and the quarter is in the same or adjacent quarter of the later of the
Prior A ccuracy Record. E ndDa tc and the
Environmental Protection Agency
Page 13 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Prior Accuracy Record Rc'm^WMionD'M.c.
if (PEITestRecordsByLocationForQAStatus is not found)
Set FF2LAccuracyEligible = false, and exit this check.
else
Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate
and the PEITestRecords/iy Location ForOAStatus.EndDMc.
else if (PriorAccuracyTestRecord .7cs[7xpcCodc is equal to "FFACCTT")
Locate the latest record in PEITestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the FuelFIowComponentRecords. Component ID and the TestResult is
equal to "PASSED" and the quarter is in the same or adjacent quarter of the
Prior A ccuracy Record. E ndDa tc.
if (PEITestRecordsByLocationForQAStatus is not found)
Set FF2LAccuracyEligible = false, and exit this check.
else
Set FF2LAccuracyCheckDate = the later of FF2LAccuracyCheckDate and the
PEITestRecords/iy Location ForOAStatus.EndDMc.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 14 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-5
Check Name:
Related Former Checks:
Evaluate Fuel Flow to Load Tests (Accuracy)
Applicability:
Description:
Evaluates the Fuel flow to load tests for a flow meter that is eligible to use fuel flow to load tests.
Specifications:
Set FF2LAccuracyBeginYearQuarter = null.
Set FF2LAccuracyEndYearQuarter = null.
Set InvalidFF2LTestNumber = null.
Set MissingFF2LYearQuarter = null.
if (FF2LAccuracyEligible == true)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Syslcm ID and the TestResult is equal to "FAILED" and the quarter is prior to the quarter of
the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the Prior A ccuracy Record. E ndDa tc and the
PriorAccuratyRecord.ReinstallationDate.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentAccuracyStatus = "OOC-Fuel Flow to Load Test Failed",
exit check.
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Syslcm ID and the TestResult is NULL and the quarter is prior to the quarter of the
CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the Prior A ccuracy Record. E ndDa tc and the
Prior Accuracy Record.Rcms\a\\a\\onDa\c.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentAccuracyStatus = "OOC-Fuel Flow to Load Test Has Critical Errors",
exit check.
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Sxsicm ID 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
Prior A ccuracy Record. E ndDa tc and the Prior Accuracy Record.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentAccuracyStatus = "Fuel Flow to Load Test Has Not Yet Been Evaluated",
exit check.
Locate the earliest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SysicmID and the TestResult is equal to "PASSED", "FEW168H", or "EXC168H" and the
quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the
Prior A ccuracy Record. E ndDa tc and the Prior Accuracy Record.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set FF2LAccuracyBeginYearQuarter = FF2 L Test Records By L ocation ForOAStatus. Yea r &
FF2L TestRecordsByLocationForQAStatus. Quarter.
Environmental Protection Agency Page 15 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Set FF2LAccuracyBeginYearQuarter = null
Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Syslcm ID and the TestResult is equal to "INPROG" and the quarter is prior to the quarter
of the CurrentOperatingDate and the quarter is subsequent to the quarter of the later of the Prior A ccuracy Record. E ndDa tc and
t lie Prior A ccuracy Record. Re i nsta 1 lat ion Date.
if (FF2LTestRecordsByLocationForQAStatus is found)
if (FF2LAccuracyBeginYearQuarter is not null AND FF2LTestRecords/iy Location ForOAStatus.Yciu/Quavlcr >
FF2LAccuracyBegin YearQuarter)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentAccuracyStatus = "OOC-Invalid Fuel Flow to Load Test",
exit check.
else if (FF2LTestRecordsByLocationForQAStatus. Year/Quarter is more than 4 quarters after the quarter of the
FF2LAccuracyCheckDate)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentAccuracyStatus = "Undetermined-Baseline Period Expired",
exit check.
Set FF2LAccuracyBeginYearQuarter = the quarter after the quarter of the FF2LAccuracyCheckDate.
Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystQvalD and the TestResult is equal to "PASSED", "EXC168H", "INPROG", or
"FEW168H", and the quarter is prior to the quarter of the CurrentOperatingDate and the quarter is subsequent to the quarter of
the later of the Prior A ccuracy Record. E ndDa tc and the Prior Accuracy Record.Rcms\i\\\i\\\onDi\\c.
Set FF2LAccuracyEndYearQuarter = FF2 L Test Records By L ocation ForQAStatus. Yea r &
FF2L TestRecordsByLocationForQAStatus. Quarter.
for each quarter between the FF2LAccuracyBeginYearQuarter and the FF2LAccuracyEndYearQuarter (inclusive)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Sxsicm ID and the quarter is equal to the quarter to check.
if (FF2LTestRecordsByLocationForQAStatus is found)
if (FF2LTestRecordsByLocationForQAStatus.TestResult = "FEW168H")
Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
Current Fuel FlowRecord.FudCodc and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and
the quarter is equal to the quarter to check and the Op Value >= 168.
if (OperatingSuppDataRecordsbyLocation is found)
Locate any record in FF2LBaselineRecordsByLocationForQAStatus for the location where the
SystemID is equal to the FuelFlowComponentRecordToCheck.SxsicmID. and the EndDate is
within the quarter being checked.
If not found,
Set LnvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Environmental Protection Agency
Page 16 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set CurrentAccu racy Status = "OOC-Invalid Fuel Flow to Load Test".
Exit check.
else
Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
Current Fuel FlowRecord.FudCodc and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and the
quarter is equal to the quarter to check and the Op Value >= 168.
if (OperatingSuppDataRecordsbyLocation is found)
Set MissingFF2LYearQuarter equal to the year/quarter to check.
Set CurrentAccuracyStatus = "Undetermined-Missing Fuel Flow to Load Test".
Exit check.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 17 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-6
Check Name:
Related Former Checks:
Determine Accuracy Test Expiration Date
Applicability:
Description:
Determines the expiration date for the prior applicable Accuracy Test.
Specifications:
Set AccuracyMissingOpDatalnfo = null,
if (CurrentAccuracy Status is null)
Set PriorTestExpirationDate = Prior A ecu racy Record. Tc s t E \ p i ra t i o n Da tc.
for each quarter subsequent to the quarter of the later of the Prior Accuracy Record ^EMDntdYlom and the
/Vmv4«.'w/y/cv7?6'«;/y/. Reinstallation Date/Hour and prior to the quarter of the CurrentOperatingDate/Hour
Set OSO Reporter to false.
Locate a LocationReportingFrequency record for the test location where ReportingFrequencyCode = "OS", the
BeginQuarter is on or before the quarter being checked, and the EndQuarter is null or is on or after the quarter being
checked.
If found,
Set OSO Reporter to true.
if (OSOReporter == false or the quarter to check is the 3rd quarter)
if (FF2LAccuracyEligible == true and the quarter to check is between the FF2LAccuracyBeginYearQuarter and
the FF2LAccuracyEndYearQuarter (inclusive))
Add 1 quarter to the PriorTestExpirationDate.
else
if (EarliestLocationReportDate > the last day of the quarter being checked)
Add 1 quarter to the PriorTestExpirationDate.
else
Locate the record in OperatingSuppDataRecordsbyLocation where the OpTypeCode is equal to
"OPHOURS" and the reporting period is equal to the quarter to check and the FuelCode is equal
to CurrentFuelFlowRecord.FuQlCodQ.
if (OperatingSuppDataRecordsbyLocation is not found)
Locate the record in OperatingSuppDataRecordsbyLocation where the OpTypeCode is
equal to "OPHOURS" and the reporting period is equal to the quarter to check and the
FuelCode is null.
if (OperatingSuppDataRecordsbyLocation is not found)
Set AccuracyMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the
year of the quarter being checked and [QTR] is the number of the quarter being
checked).
Environmental Protection Agency
Page 18 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Add 1 quarter to the PriorTestExpirationDate.
else if (()peratingSuppI)ataRecordsbyLocation.Op Va 1 lie <= 168)
Add 1 quarter to the PriorTestExpirationDate.
else
Locate a record in TestExtensionExemptionRecords for the location where the
ComponentID is equal to the FuelFlowComponentRecordToCheck. Component ID. the
reporting period is equal to the quarter to check, AND the ExtensionExemptionCode is
equal to "NONQADB".
if (TestExtensionExemptionRecords is found)
Add 1 quarter to the PriorTestExpirationDate.
else if (OSO Reporter == true and the quarter to check is the 2nd quarter)
if (FF21. Accuracy Eligible == true and the quarter to check is between the FF2LAccuracyBeginYearQuarter and
the FF2LAccuracyEndYearQuarter (inclusive))
Add 1 quarter to the PriorTestExpirationDate.
else
Locate a record in TestExtensionExemptionRecords for the location where the reporting period is equal
to the quarter to check, AND the ExtensionExemptionCode is equal to "NONQAOS" and the FuelCode
is equal to the CurrentFuelFlowRecord.FuelCode.
if (TestExtensionExemptionRecords is found)
Add 1 quarter to the PriorTestExpirationDate.
else
Locate a record in TestExtensionExemptionRecords for the location where the ComponentID is
equal to the FuelFlowComponentRecordToCheck.Com$oncn\\D. the reporting period is equal
to the quarter to check, AND the ExtensionExemptionCode is equal to "NONQADB".
if (TestExtensionExemptionRecords is found)
Add 1 quarter to the PriorTestExpirationDate.
else if (OSO Reporter == true and the quarter to check is the 1 st or 4th quarter)
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
Environmental Protection Agency
Page 19 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
is equal to the CurrentFuelFlowRecord.FuelCode.
if (TestExtensionExemptionRecords is found)
Add 1 quarter to the PriorTestExpirationDate.
else
Locate a record in TestExtensionExemptionRecords for the location where the ComponentID is
equal to the FuelFlou'ComponentRecordToCheck ComponcnllD. the reporting period is equal
to the quarter to check, AND the ExtensionExemptionCode is equal to "NONQADB".
if (TestExtensionExemptionRecords is found)
Add 1 quarter to the PriorTestExpirationDate.
if (CurrentOperatingDate/Hour > PriorTestExpirationDate)
if (AccuracyMissingOpDatalnfo is not null)
Set CurrentAccuracyStatus = 'Missing Op Data"
Return result CurrentAccuracyStatus.
else if (FF21. Accuracy Eligible == false)
Set CurrentAccuracyStatus = "OOC-Accuracy Test Expired-Fuel Flow To Load Test Ignored".
Return result CurrentAccuracyStatus.
else
Set CurrentAccuracyStatus = "OOC-Accuracy Test Expired"
else
Set CurrentAccuracyStatus = "IC-Extension"
If (CurrentAccuracyStatus does not begin with "IC" and is not null)
if (CurrentAccuracyStatus starts with "OOC" or "Undetermined" AND InvalidAccuracyRecord is not null)
Set CurrentA ecu racy Status = CurrentAccuracyStatus &
Return result CurrentAccuracyStatus.
else if (Inapprorpriate Transmitter Transducer Test == true)
Return result "Inappropriate Transmitter Transducer Test" // do NOT set current accuracy status
Environmental Protection Agency
Page 20 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Accuracy Test
Not Yet
Evaluated
Fuel Flow to
Load Test Has
Not Yet Been
Evaluated
Inappropriate
Transmitter
Transducer Test
Missing Op Data
OOC-Accuracy
Test Aborted
OOC-Accuracy
Test Aborted*
OOC-Accuracy
Test Expired
OOC-Accuracy
Test Expired*
OOC-Accuracy
Test Expired-Fuel
Flow To Load
Test Ignored
OOC-Accuracy
Test Expired-Fuel
Flow To Load
Test Ignored*
OOC-Accuracy
Test Failed
OOC-Accuracy
Test Failed*
OOC-Accuracy
Test Has Critical
Errors
OOC-Accuracy
Test Has Critical
Errors*
OOC-Event
OOC-Event*
OOC-Fuel Flow
to Load Test
Failed
OOC-Fuel Flow
to Load Test
Failed*
Response Severity
The [testtype] status for [key] could not be determined, because the applicable prior Critical Error Level 1
[testtype] with TestNumber [testnum] has not yet been evaluated.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [lF21testnum] has
not yet been evaluated.
The prior [testtype] for [key] with TestNumber [testnum] is a transmitter/transducer Critical Error Level 2
test], but this type of test is inappropriate for the Sample AcquisitionMethodCode for
the fuel flowmeter. A transmitter/transducer test can only be performed on a NOZ,
VEN, and ORF fuel flowmeter.
The [testtype] status for [key] could not be determined, because the Op Supp Data Critical Error Level 1
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The applicable prior [testtype] for [key] with TestNumber [testnum] was aborted. Critical Error Level 1
The prior [testtype] for [key] with TestNumber [testnum] was aborted. An invalid prior Critical Error Level 1
[testtype] with TestNumber [invtestnum] was ignored.
The prior [testtype] for [key] with TestNumber [testnum] has expired. Critical Error Level 1
The prior [testtype] for [key] with TestNumber [testnum] has expired. An invalid prior Critical Error Level 1
[testtype] with TestNumber [invtestnum] was ignored.
The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] was ignored.
The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] was ignored. An invalid prior
[testtype] with TestNumber [invtestnum] was also ignored.
The applicable prior [testtype] for [key] with TestNumber [testnum] failed. Critical Error Level 1
The prior [testtype] for [key] with TestNumber [testnum] failed. An invalid prior Critical Error Level 1
[testtype] with TestNumber [invtestnum] was ignored.
The applicable prior [testtype] for [key] with TestNumber [testnum] has critical errors. Critical Error Level 1
The prior [testtype] for [key] with TestNumber [testnum] has critical errors. An Critical Error Level 1
invalid prior [testtype] with TestNumber [invtestnum] was ignored.
You reported a QA Certification Event record for QACertEventCode [code] Critical Error Level 1
QACertEventDate [eventdate] for [key], but you did not perform a subsequent
[testtype].
You reported a QA Certification Event record for QACertEventCode [code] Critical Error Level 1
QACertEventDate [eventdate] for [key], but you did not perform a subsequent
[testtype]. An invalid [testtype] was ignored.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
failed.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
Environmental Protection Agency
Page 21 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OOC-Fuel Flow
to Load Test Has
Critical Errors
OOC-Fuel Flow
to Load Test Has
Critical Errors*
OOC-Invalid
Fuel Flow to
Load Test
OOC-Invalid
Fuel Flow to
Load Test*
OOC-No Prior
Accuracy Test
OOC-No Prior
Accuracy Test*
Undetermined-Ba
seline Period
Expired
Undetermined-M
issing Fuel Flow
to Load Test
The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
critical errors.
The [testtype] status for [key] could not be determined, because a prior
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
critical errors. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The [testtype] status for [key] could not be determined, because one or more prior
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you reported a
prior test indicating that baseline data collection was completed; or (2) the
TestResultCode indicates that there were fewer than 168 fuel QA operating hours in
the quarter, yet your emissions data for that quarter indicates otherwise.
The [testtype] status for [key] could not be determined, because one or more prior
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you reported a
prior test indicating that baseline data collection was completed; or (2) the
TestResultCode indicates that there were fewer than 168 fuel QA operating hours in
the quarter, yet your emissions data for that quarter indicates otherwise. An invalid
[testtype] with TestNumber [invtestnum] was ignored.
You did not report a prior [testtype] for [key].
You did not report a valid prior [testtype] for [key]. An invalid [testtype] with
TestNumber [invtestnum] was ignored.
The [testtype] status for [key] could not be determined, because, according to the
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [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 [missinglf21].
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 22 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-7
Check Name:
Related Former Checks:
Determine if Component Requires a PEI Test
Applicability:
Description:
Determines a if an Appendix D fuel flow meter requires a PEI test.
Specifications:
Set PEIRequired = false.
if {PriorAccuracyRecord is not null and Prior Accuracy Record.Jcs{J\\~>cCoAc is equal to "FFACCTT")
Set PEIRequired = true.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 23 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: ADESTAT-8
Check Name: Locate Most Recent Prior PEI Test
Related Former Checks:
Applicability:
Description: Determines if there is an applicable prior PEI test.
Specifications:
Set CurrentPEIStatus = null.
Set PriorPEIRecord = null.
if (PEIRequired == true)
Locate the most recent record in PEITestRecordsByLocationForQAStatus for the location where the ComponentID is equal to the
Fu el Flo i vCompon en tRecord ToCh eck. C o m po n c n 11D and the EndDate/Hour is prior to the CurrentOperatingDate/Hour
if (PEITestRecordsByLocationForQAStatus is found)
Set PriorPEIRecord = the found record in PEITestRecordsByLocationForQAStatus.
if (Pmw,P£77te£w
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 25 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
ADESTAT-9
Check Name:
Related Former Checks:
Locate Most Recent Prior PEI Event
Applicability:
Description:
Determines if there is a applicable prior event requiring an PEI test.
Specifications:
Set PriorPEIEventRecord = null.
If (PEIRequired == true AND CurrentPEIStatus is null)
Locate the most recent record in QACertiflcationEventRecords WHERE
a) the ComponentID is equal to the Fu el Flo i vCompon en tRecord ToCh eck. C o m po n c n 11D AND
b) PEIRequired is equal to "Y" AND
c) the QACertEventDate/Hour is prior to the CurrentOperatingDate/Hour AND
d) the QACertEventDate/Hour is after the PriorPEIRecord.EndDate/Hour.
if (QACertiflcationEventRecords is found)
Set PriorPEIEventRecord = the found record in QACertiflcationEventRecords.
Set CurrentPEIStatus = "OOC-Event".
else
Set PriorTestExpirationDate = 5 years (20 calendar quarters) after the end of the quarter of the
PriorPEIRecord. E ndDa tc.
if (CurrentOperatingDate is AFTER the PriorTestExpirationDate)
Set CurrentPEIStatus = "OOC-PEI Test Expired".
else
Set PriorTestExpirationDate = 12 quarters after the end of the quarter of the PriorPEIRecord. E ndDa tc.
Set PriorPEIRecord.TestE\pi rationDate = PriorTestExpirationDate.
If {CurrentOperatingDate is ON OR BEFORE the PriorTestExpirationDate)
Set CurrentPEIStatus = "IC".
If (CurrentPEIStatus starts with "OOC")
Return result CurrentPEIStatus.
Results:
Result
OOC-Event
Response
You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [key], but you did not perform a subsequent
[testtype].
The prior [testtype] for [key] with TestNumber [testnum] has expired.
Severity
Critical Error Level 1
OOC-PEI Test
Expired
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 26 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Name:
Related Former Checks:
Check Code:
ADESTAT-10
Determine Eligibility for Fuel Flow to Load Testing (PEI)
Applicability:
Description:
Specifications:
Determines if this component is eligible to extend their PEI text expiration date using fuel flow to load testing.
Set FF2LPEIEligible = null
Set FF2LPEICheckDate = null.
if (PEIRequired == true AND CurrentPEIStatus is null)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystQvalD and the CalculatedTestResult is equal to "PASSED", "FEW168H", "EXC168H",
"INPROG", or "FAILED" and the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is
subsequent to the quarter of the Prior PEI Record. E ndDa tc.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set ValidFuelFlowTestExistsForEachComponent = true.
Set CertificationCheckDate = the later of the Prior A ccuracy Record. E ndDa tc and the
Prior Accuracy Record.Rc\ns\i\\\i\{\onDi\\c.
for each ComponentRecord in FuelFlowComponentRecords
Locate the latest AccuracyTestRecord for the location in AccuracyTestRecordsByLocationForQAStatus where:
1) ComponentID is equal to the ('omponeniRecord. Component ID.
2) The quarter of the later of the EndDate and the ReinstallationDate is before the quarter of
CurrentOperatingDate.
if (AccuracyTestRecord was NOT found)
Set ValidFuelFlowTestExistsForEachComponent = false.
else if (AccuracyTestRecordAestRssultCode does NOT equal "PASSED")
Set ValidFuelFlowTestExistsForEachComponent = false.
else if (the later of A cciirac vTesiRecord. E ndDa tc and the A ccuracyTestRecord^R&im,\dl\?AiovtD?AQ is on or after
CurrentFuelFlowRecord. SystemBeginDate)
Set ValidFuelFlowTestExistsForEachComponent = false.
else
Set CertificationCheckDate = the later of CertificationCheckDate AND AccuracyTestRecord.EndDate
AND A6'67/ra6;i 7£'.v;/^£'6r;«/.ReinstallationDate.
if (AccuracyTestRecord.TestTypeCode == "FFACCTT")
Locate the latest PeiTestRecord for the location in PEITestRecordsByLocationForQAStatus where:
1) ComponentID is equal to the ('omponeniRecord. Component ID.
2) The quarter of the EndDate is before the quarter of CurrentOperatingDate.
Environmental Protection Agency
Page 27 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (PeiTestRecord was NOT found)
Set ValidFuelFlowTestExistsForEachComponent = false,
else if ( Peil'esiReconl.TcslRcsullCodc does NOT equal "PASSED")
Set ValidFuelFlowTestExistsForEachComponent = false,
else if (PeiTestRecord.EndDate is on or after CurrentFuelFlowRecord. SystemBeginDate)
Set ValidFuelFlowTestExistsForEachComponent = false.
else
Set CertificationCheckDate = the later of CertificationCheckDate AND PeiTestRecord.EndDate.
if ( ValidFuelFlowTestExistsForEachComponent is equal to true ) AND ( CertificationCheckDate is NOT null)
Set FF2LPEIEligible = true.
Set FF2LPEICheckDate = CertificationCheckDate.
Set FF2LPEIEligible = true.
Set FF2LPEICheckDate = Prior PEI Record. E ndDa tc.
for each record in FuelFlowComponentRecords
Locate the latest record in Accuracy TestRecordsByLocationForQAStatus for the location where the
ComponentID is equal to the FuelFlowComponentRecords. Component ID and the TestResult is equal to
"PASSED" and the Year/Quarter of the later of the EndDate and Reinstallation Date is in the same or
adjacent quarter of the Prior PEIRecord. E ndDa tc.
if (A ecu racy Test Records By L ocation ForQAStatus i s not found)
Set FF2LPEIEligible = false, and exit check.
else
Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
Accuracy TestRecordsByLocationForQAStatus.EndDate and the
Accuracy TestRecordsByLocationForQAStatus.ReinstallationDate.
if (FuelFloivComponentRecords. ComponentID is not equal to
Fu el Flo i vCompon en tRecord ToCh eck ComponentID AND
AccuracyTestRecords/iy Location ForOAStatus.TcslTypcCodc is equal to "FFACCTT")
Locate the latest record in PEITestRecordsByLocationForQAStatus for the location
where the ComponentID is equal to the FuelFlowComponentRecords. ComponentID
and the TestResult is equal to "PASSED" and the Year/Quarter is in the same or adjacent
quarter of the Prior PEI Record. E ndDa tc.
if (PEITestRecordsByLocationForQAStatus is not found)
Set FF2LPEIEligible = false, and exit check.
else
Set FF2LPEICheckDate = the later of FF2LPEICheckDate and the
PEFLestRecords/iy Location ForOAStatus.EndDMc.
Environmental Protection Agency
Page 28 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 29 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Name:
Related Former Checks:
Check Code:
ADESTAT-11
Evaluate Fuel Flow to Load Tests (PEI)
Applicability:
Description:
Evaluates the Fuel flow to load tests for a flow meter that is eligible to use fuel flow to load tests.
Specifications:
Set FF2LPEIBeginYearQuarter = null.
Set FF2LPEIEndYearQuarter = null.
if (FF2LPEIEligible == true)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Syslcm ID and the TestResultCode is equal to "FAILED" and the Year/Quarter is prior to the
quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the Prior PEI Record. E ndDa tc.
if (FF2LTestRecordsByLocationForQAStatus is found)
Locate a record in QACertiflcationEventRecords WHERE
a) the ComponentID is equal to the Fu el Flo i vCompon en tRecord ToCh eck. C o m po n c n 11D AND
b) the QACertEventCode is equal to "410"
c) the RequiredTestCode is equal to "53"AND
d) the QACertEventDate/Hour is after the EndDate/Hour and of the located failed
FF2L TestRecordsByLocationForQAStatus record.
e) the QACertEventDate/Hour is prior to the CurrentOperatingDate/Hour
if (QACertiflcationEventRecords is not found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "OOC-Fuel Flow to Load Test Failed".
Return result CurrentPEIStatus.
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Sxsicm ID and the TestResultCode is NULL and the Year/Quarter is prior to the quarter of
the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the Prior PEI Record. E ndDa tc.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "OOC-Fuel Flow to Load Test Has Critical Errors".
Return result CurrentPEIStatus.
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Sxsicm ID 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 PEI Record. E ndDa tc.
if (FF2L TestRecordsByLocationForQAStatus is found)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "Fuel Flow to Load Test Has Not Yet Been Evaluated".
Return result CurrentPEIStatus.
Locate the earliest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SysicmID and the TestResultCode is equal to "PASSED", "FEW168H", or "EXC168H" and
the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the
Environmental Protection Agency
Page 30 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
PriorPEI Record. E ndDa tc.
if (FF2LTestRecordsByLocationForQAStatus is found)
Set FF2LPEIBegin Year Quarter = FF2 L TestRecordsIiyL ocation ForQAStatus. Yea r &
FF2L TestRecordsByLocationForQAStatus. Quarter.
else
Set FF2LPEIBeginYearQuarter = null
Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Syslcm ID and the TestResultCode is equal to "INPROG" and the Year/Quarter is prior to
the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the Prior PEIRecord. E ndDa tc.
if (FF2LTestRecordsByLocationForQAStatus is found)
if (Set FF2LPEIBegin Year Quarter is not null AND FF2LTestRecordsByLocationForQAStatus.Year/Quarter >
FF2LPEIBegin YearQuarter)
Set InvalidFF2LTestNumber = FF2LTestRecordsIiy Location ForQAStatus.TcsiNumbcr
Set CurrentPEIStatus = "OOC-Invalid Fuel Flow to Load Test".
Return result CurrentPEIStatus.
else if (FF2LTestRecordsBy Location ForQAStatus.Year/Quarter is more than 4 quarters after the quarter of the
FF2LPEICheckDate)
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForQAStatus.TcslNumbcr
Set CurrentPEIStatus = "Undetermined-Baseline Period Expired".
Return result CurrentPEIStatus.
Set FF2LPEIBegin Year Quarter to the quarter after the quarter of the FF2LPEICheckDate.
Locate the latest record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.SystQvalD and the TestResultCode is equal to "PASSED", "FEW168H", or "EXC168H" and
the Year/Quarter is prior to the quarter of the CurrentOperatingDate and the Year/Quarter is subsequent to the quarter of the
Prior PEI Record. E ndDa tc.
Set FF2LPEIEndYearQuarter = FF2 L TestRecordsIiyL ocation ForQAStatus. Yea r &
FF2L TestRecordsByLocationForQAStatus. Quarter.
for each quarter between the FF2LPEIBeginYearQuarter and the FF2LPEIEndYearQuarter (inclusive)
Locate any record in FF2LTestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
FuelFlowComponentRecordToCheck.Sxsicm ID and the Year/Quarter is equal to the year/quarter to check.
if (FF2LTestRecordsByLocationForQAStatus is found)
if (FF2LTestRecordsHy Location ForQAStatus.C'dlculdicdTcsiRcsuh = "FEW168H")
Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
Current Fuel FlowRecord.FudCodc and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and
the Year/Quarter is equal to the year/quarter to check and the Op Value >= 168.
if (OperatingSuppDataRecordsbyLocation is found)
Locate any record in FF2LBaselineRecordsByLocationForQAStatus for the location where the
SystemID is equal to the FuelFlowComponentRecordToCheck.SxsicmID. and the EndDate is
Environmental Protection Agency
Page 31 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
within the quarter being checked.
If not found,
Set InvalidFF2LTestNumber = FF2LTestRecords/iy Location ForOAStatus.TcslNumbcr
Set CurrentPEIStatus = "OOC-Invalid Fuel Flow to Load Test".
Return result CurrentPEIStatus.
else
Locate a record in OperatingSuppDataRecordsbyLocation where the FuelCode is equal to
Current Fuel FlowRecord.FudCodc and the OpTypeCode is equal to "OPHOURS" or "OSHOURS" and the
Year/Quarter is equal to the year/quarter to check and the Op Value >= 168.
if (OperatingSuppDataRecordsbyLocation is found)
Set MissingFF2LYearQuarter equal to the year/quarter to check.
Set CurrentPEIStatus = "Undetermined-Missing Fuel Flow to Load Test".
Return result CurrentPEIStatus.
Results:
Result
Fuel Flow to
Load Test Has
Not Yet Been
Evaluated
OOC-Fuel Flow
to Load Test
Failed
OOC-Fuel Flow
to Load Test Has
Critical Errors
OOC-Invalid
Fuel Flow to
Load Test
Undetermined-Ba
seline Period
Expired
Undetermined-M
issing Fuel Flow
to Load Test
Usage:
1 Process/Category: Emissions Data Evaluation Report Fuel Flowmeter QA Status Evaluation
Response Seventy
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [lF21testnum] has
not yet been evaluated.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
failed.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum] has
critical errors.
The [testtype] status for [key] could not be determined, because one or more prior Critical Error Level 1
fuel-flow-to-load tests, including the test for MonitoringSystemID [ID] with
TestNumber [fF21testnum], are invalid. These tests may be invaild because (1) the
TestResultCode indicates that baseline data collection is ongoing, yet you reported a
prior test indicating that baseline data collection was completed; or (2) the
TestResultCode indicates that there were fewer than 168 fuel QA operating hours in
the quarter, yet your emissions data for that quarter indicates otherwise.
The [testtype] status for [key] could not be determined, because, according to the Critical Error Level 2
fuel-flow-to-load test for MonitoringSystemID [ID] with TestNumber [fF21testnum],
baseline data was still being collected after the deadline.
The [testtype] status for [key] could not be determined, because a prior Critical Error Level 1
fuel-flow-to-load test for MonitoringSystemID [ID] was missing for [missinglf21].
Environmental Protection Agency
Page 32 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Name:
Related Former Checks:
Check Code:
ADESTAT-12
Determine PEI Test Expiration Date
Applicability:
Description:
Determines the expiration date for the prior applicable PEITest.
Specifications:
Set PEIMissingOpDatalnfo = null.
if (PEIRequired == true AND CurrentPEIStatus is null)
Set PriorTestExpirationDate = Prior PEI Record. Test E \ p i ra t i o n Da tc.
for each quarter subsequent to the quarter of the Prior PEI Record. E ndDa tc and prior to the quarter of the CurrentOperatingDate
Set OSO Reporter to false.
Locate a LocationReportingFrequency record for the test location where ReportingFrequencyCode = "OS", the
BeginQuarter is on or before the quarter being checked, and the EndQuarter is null or is on or after the quarter being
checked.
If found,
Set OSO Reporter to true.
if (OSOReporter == false or the quarter to check is the 3rd quarter)
if (FF2LPEIEligible == true and the quarter to check is between the FF2LPEIBeginYearQuarter and the
FF2LPEIEndYearQuarter (inclusive))
else if {OSO Reporter == true and the quarter to check is the 2nd quarter)
if (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 CurrentPEIStatus = 'Missing Op Data"
else if (FF2LPEIEligible == false)
Set CurrentPEIStatus = "OOC-PEI Test Expired-Fuel Flow To Load Test Ignored"
else
Set CurrentPEIStatus = "OOC-PEI Test Expired"
Return result CurrentPEIStatus.
Add 1 quarter to the PriorTestExpirationDate.
else
Environmental Protection Agency
Page 33 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set CurrentPEIStatus = "IC-Extension"
Results:
Result
Missing Op Data
OOC-PEI Test
Expired
OOC-PEI Test
Expired-Fuel
Flow To Load
Test Ignored
Usage:
1
Response
The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The prior [testtype] for [key] with TestNumber [testnum] has expired.
The prior [testtype] for [key] with TestNumber [testnum] has expired. A prior
fuel-flow-to-load test for MonitoringSystemID [ID] was ignored.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 34 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: ADESTAT-13
Check Name: Determine System Appendix D Status
Related Former Checks:
Applicability:
Description: Determines the Appendix D status for the system based on current system status and the current component
accuracy and/or PEI status.
Specifications:
if (CurrentAppendixDStatus == "OOC-Multiple Reasons" OR (CurrentAppendixDStatus starts with "OOC" and CurrentAccuracyStatus
starts with "OOC" and CurrentAppendixDStatus <> CurrentAccuracyStatus))
Set CurrentAppendixDStatus = "OOC-Multiple Reasons"
else if (CurrentAppendixDStatus starts with "OOC")
-do nothing
else if (CurrentAccuracyStatus starts with "OOC")
Set CurrentAppendixDStatus = CurrentAccuracyStatus.
else if ((CurrentAppendixDStatus is not null and does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does not end
with "Not Yet Evaluated") and (CurrentAccuracyStatus does not start with "IC" or "Undetermined" and CurrentAccuracyStatus does
not end with "Not Yet Evaluated") and CurrentAppendixDStatus <> CurrentAccuracyStatus)
Set CurrentAppendixDStatus = "Invalid Data".
else if (CurrentAppendixDStatus does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does not end with "Not Yet
Evaluated" AND CurrentAppendixDStatus is not null)
-- do nothing
else if (CurrentAccuracyStatus does not start with "IC" or "Undetermined" and CurrentAccuracyStatus does not end with "Not Yet
Evaluated")
Set CurrentAppendixDStatus = CurrentAccuracyStatus.
else if (CurrentAppendixDStatus ends with "Not Yet Evaluated" or CurrentAccuracyStatus ends with "Not Yet Evaluated")
Set CurrentAppendixDStatus = "Test Not Yet Evaluated"
else if (CurrentAppendixDStatus starts with "Undetermined" or CurrentAccuracyStatus starts with "Undetermined")
Set CurrentAppendixDStatus = "Undetermined"
else if (CurrentAppendixDStatus == "IC-Extension" or CurrentAccuracyStatus == "IC-Extension")
Set CurrentAppendixDStatus = "IC-Extension"
else
Set CurrentAppendixDStatus = "IC"
if (PEIRequired == true)
if (CurrentAppendixDStatus == "OOC-Multiple Reasons" OR (CurrentAppendixDStatus starts with "OOC" and
Environmental Protection Agency
Page 35 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
CurrentPEIStatus starts with "OOC" and CurrentAppendixDStatus <> CurrentPEIStatus))
Set CurrentAppendixDStatus = "OOC-Multiple Reasons"
else if (CurrentAppendixDStatus starts with "OOC")
-- do nothing
else if (CurrentPEIStatus starts with "OOC")
Set CurrentAppendixDStatus = CurrentPEIStatus.
else if ((CurrentAppendixDStatus is not null and does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does
not end with "Not Yet Evaluated") and (CurrentPEIStatus does not start with "IC" or "Undetermined" and CurrentPEIStatus
does not end with "Not Yet Evaluated") and CurrentAppendixDStatus <> CurrentPEIStatus)
Set CurrentAppendixDStatus = "Invalid Data".
else if (CurrentAppendixDStatus does not start with "IC" or "Undetermined" and CurrentAppendixDStatus does not end with
"Not Yet Evaluated" AND CurrentAppendixDStatus is not null)
-- do nothing
else if (CurrentPEIStatus does not start with "IC" or "Undetermined" and CurrentPEIStatus does not end with "Not Yet
Evaluated")
Set CurrentAppendixDStatus = CurrentPEIStatus.
else if (CurrentAppendixDStatus ends with "Not Yet Evaluated" or CurrentPEIStatus ends with "Not Yet Evaluated")
Set CurrentAppendixDStatus = "Test Not Yet Evaluated"
else if (CurrentAppendixDStatus starts with "Undetermined" or CurrentPEIStatus starts with "Undetermined")
Set CurrentAppendixDStatus = "Undetermined"
else if (CurrentAppendixDStatus == "IC-Extension" or CurrentPEIStatus == "IC-Extension")
Set CurrentAppendixDStatus = "IC-Extension"
else
Set CurrentAppendixDStatus = "IC"
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report
Fuel Flowmeter QA Status Evaluation
Environmental Protection Agency
Page 36 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Daily Calibration Status
Environmental Protection Agency
Page 37 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DC STAT-1
Check Name:
Related Former Checks:
Locate Most Recent Prior Daily Calibration Test
Applicability:
Description:
CEM Check
Determines if there is an applicable prior Daily Calibration Test
Specifications:
Set PriorDailyCalRecord = null.
Set PriorDailyCalLastCoveredNonOpHour = null.
Set PriorDailyCalFirstOpHourAfterLastNonOpHour = null.
Set InvalidDailyCalRecord = null.
Locate the most recent record in MostRecentDailyCalibrationTestObject for the location where:
a) ComponentID is equal to the ApplicableComponentID AND
b) ValidFlag is equal to "Y" AND
c) the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (MostRecentDailyCalibrationTestObject is found)
Set PriorDailyCalRecord = the DailyCalibrationRecord for the found MostRecentDailyCalibrationTestObject.
if ( QaStatusPrimary Or Primary IlypassSystemld is null)
Set PriorDailyCalLastCoveredNonOpHour = the LastCoveredNonOpHour for the found
MostRecentDailyCalibrationTestObject.
Set PriorDailyCalFirstOpHourAfterLastNonOpHour = the FirstOpHourAfterLastCoveredNonOpHour for the found
MostRecentDailyCalibrationTestObject.
else if ( SystemDictionary for the found MostRecentDailyCalibrationTestObject contains
QaStatusPrimaryOrPrimaryBypassSystemld))
Set PriorDailyCalLastCoveredNonOpHour = the LastCoveredNonOpHour for the
QaStatusPrimaryOrPrimaryBypassSystemld entry in SystemDictionary for the found
MostRecentDailyCalibrationTestObject.
Set PriorDailyCalFirstOpHourAfterLastNonOpHour = the FirstOpHourAfterLastCoveredNonOpHour for the
QaStatusPrimaryOrPrimaryBypassSystemld entry in SystemDictionary for the found
MostRecentDailyCalibrationTestObject.
Locate the most recent record in MostRecentDailyCalibrationTestObject for the location where:
a) the ComponentID is equal to the ApplicableComponentID AND
b) ValidFlag is equal to "N" AND
c) the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (MostRecentDailyCalibrationTestObject is found AND MostRecentDailyCalibrationTestObject.EndDatc/Hour/IVIin is greater
than the PriorDailyCalRecord.EndDate/How/Mm)
Set InvalidDailyCalRecord = the DailyCalibrationRecord for the found MostRecentDailyCalibrationTestObject.
else
Locate the most recent record in MostRecentDailyCalibrationTestObject for the location where:
Environmental Protection Agency
Page 38 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
a) the ComponentID is equal to the ApplicableComponentID AND
b) ValidFlag is equal to "N" AND
c) the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (MostRecentDailyCalibrationTestObject is found )
Set InvalidDailyCalRecord = the DailyCalibrationRecord for the found MostRecentDailyCalibrationTestObject.
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Daily Calibration Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
FLOW Daily Calibration Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
Hg Daily Calibration Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
NOX Daily Calibration Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Daily Calibr
6
Process/Category:
Emissions Data Evaluation Report
02 Dry Daily Calibration Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
02 Wet Daily Calibration Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 Daily Calibration Status Evaluation
Environmental Protection Agency
Page 39 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DCSTAT-2
Check Name:
Related Former Checks:
Locate Most Recent Prior Event
Applicability:
Description:
CEM Check
Determines if there is an applicable prior event.
Specifications:
Set PriorDailyCalEventRecord = 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) PriorDailyCalRecord is null AND the QACertEventDate/Hour is in the CurrentReportingPeriod OR
b) QACertEventDate/Hour is after the PriorDailyCalRecord.EndDate/How
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 PriorDailyCalEventRecord = the found record in QACertiflcationEventRecords
If (PriorDailyCalEventRecord is null)
if (PriorDailyCalRecord is null)
if (the number of clock hours between the First Day of Operation/First Hour of Operation and the CurrentDateHour is
less than 25)
Set CurrentDailyCalStatus = "IC-Undetermined".
else if (OaStatusSystemTypeCode is equal to "HG" or "HCL", AND the number of clock hours between the
QaStatusComponentBeginDateHour and the CurrentDateHour is less than 25)
Set CurrentDailyCalStatus = "IC-Undetermined".
else if (QaStatusSystemTypeCode is equal to "HG" or "HCL", AND MatsDailyCalRequiredDate is NOT null, AND
CurrentDateHour is before MatsDailyCalRequiredDate)
Set CurrentDailyCalStatus = "IC-Undetermined".
else (QaStatusSystemTypeCode is equal to "HG" or "HCL", QaStatusMatsErbDate is not null, AND the number of clock
hours between the QaStatusMatsErbDate hour 0 and the CurrentDateHour is less than 25)
Set CurrentDailyCalStatus = "IC-Undetermined".
Environmental Protection Agency
Page 40 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (QaStatusSystemTypeCode is equal to "S02", So2cIsOnlyForMats is true, AND MatsDailyCalRequiredDate is
NOT null, AND CurrentDateHour is before MatsDailyCalRequiredDate)
Set CurrentDailyCalStatus = "IC-Undetermined".
else
Locate the latest record in HourlyOpData where the Date/Hour is ON OR PRIOR to the 24th clock hour
following the First Day of Operation/First Hour of Operation and OpTime is equal to zero.
if (HourlyOpData is found)
Locate the first record in HourlyOpData where the Date/Hour is after the Date/Hour in the
HourlyOpData record found above and ON OR PRIOR to the CurrentDateHour and the OpTime is
greater than zero.
if (not found OR the number of clock hours from HourlyOpData.Date/How to the CurrentDateHour is
less than 8)
Set CurrentDailyCalStatus = "IC-Undetermined".
else
Set CurrentDailyCalStatus = "OOC-No Prior Test".
else
Set CurrentDailyCalStatus = "OOC-No Prior Test".
else
if (PriorDailyCalRecord .TestResultCode = null)
Set CurrentDailyCalStatus = "OOC-Test Has Critical Errors",
else if (PriorDailyCalRecord .TestResultCode = "FAILED")
Set CurrentDailyCalStatus = "OOC-Test Failed",
else if (PriorDailyCalRecord .TestResultCode = "ABORTED")
Set CurrentDailyCalStatus = "OOC-Test Aborted".
else
Set CurrentDailyCalStatus = "OOC-Event".
if (InvalidDailyCalRecord is not null and InvalidDailyCalRecord.EndDate/How is BEFORE the
PriorDailyCalEventRecord.QACertEyentDate/How)
Set InvalidDailyCalRecord = null.
Results:
Result Response Severity
Environmental Protection Agency
Page 41 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
8
Process/Category:
Emissions Data Evaluation Report
C02 Daily Calibration Status Evaluation
FLOW Daily Calibration Status Evaluation
Hg Daily Calibration Status Evaluation
NOX Daily Calibration Status Evaluation
NOXR Unused P-PB C02C, NOXC or 02C Daily Calibr
02 Dry Daily Calibration Status Evaluation
02 Wet Daily Calibration Status Evaluation
S02 Daily Calibration Status Evaluation
Environmental Protection Agency
Page 42 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DCSTAT-3
Check Name: Determine Test Expiration Date for Most Recent Prior Daily Calibration Test
Related Former Checks:
Applicability: CEM Check
Description: Determines the expiration dates for the Applicable Prior Daily Calibration test.
Specifications:
Set OnlineDailyCalRecord to null,
if (CurrentDailyCalStatus is null)
if (Prior Daily Cat Record. O n 1 i lie I ndicator == 1)
if (the number of clock hours between the PriorDailyCalRecord Date/Hour and the CurrentDateHour is less than 26)
Set CurrentDailyCalStatus = "IC".
else
if ( PriorDailyCalLastCoveredNonOpHour is NOT null)
if (PriorDailyCalFirstOpHourAfterLastNonOpHour is NOT null) AND (the number of clock hours
between the PriorDailyCalFirstOpHourAfterLastNonOpHour 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 MostRecentDailyCalibrationTestObject for the location where:
a) ComponentID is equal to the ApplicableComponentID AND
b) ValidFlag is equal to "Y" AND
c) the Onlinelndicator = 1 AND
d) the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (MostRecentDailyCalibrationTestObject is found )
Set OnlineDailyCalRecord = the DailyCalibrationRecord for the found MostRecentDailyCalibrationTestObject.
if ( QaStatusPrimaryOrPrimaryBypassSystemld is null)
Set OnlineDailyCalOpHourCount = the OperatingHourCount for the found
MostRecentDailyCalibrationTestObject.
Set OnlineDailyCalLastCoveredNonOpHour = the LastCoveredNonOpHour for the found
MostRecentDailyCalibrationTestObject.
Set OnlineDailyCalFirstOpHourAfterLastNonOpHour = the FirstOpHourAfterLastCoveredNonOpHour
Environmental Protection Agency
Page 43 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
for the found MostRecentDailyCalibrationTestObject.
else if ( SystemDictionary for the found MostRecentDailyCalibrationTestObject contains
QaStatusPrimaryOrPrimaryBypassSystemld))
Set OnlineDailyCalOpHourCount = the OperatingHourCount for the
QaStatusPrimaryOrPrimaryBypassSystemld entry in SystemDictionary for the found
MostRecentDailyCalibrationTestObject.
Set OnlineDailyCalLastCoveredNonOpHour = the LastCoveredNonOpHour for the
QaStatusPrimaryOrPrimaryBypassSystemld entry in SystemDictionary for the found
MostRecentDailyCalibrationTestObject.
Set OnlineDailyCalFirstOpHourAfterLastNonOpHour = the FirstOpHourAfterLastCoveredNonOpHour
for the QaStatusPrimaryOrPrimaryBypassSystemld entry in SystemDictionary for the found
MostRecentDailyCalibrationTestObject.
else
Set OnlineDailyCalOpHourCount = null.
Set OnlineDailyCalLastCoveredNonOpHour = null.
Set OnlineDailyCalFirstOpHourAfterLastNonOpHour = null.
if (InvalidDailyCalRecord is null)
Locate the record in MostRecentDailyCalibrationTestObject for the location where:
a) the ComponentID is equal to the ApplicableComponentID AND
b) ValidFlag is equal to "N" AND
c) the Onlinelndicator = 1 AND
d) the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed
if (MostRecentDailyCalibrationTestObject is found AND the
MostRecentDailyCalibrationTestObject.EndD'Mc/Hour is after the OnlineDailyCalRecord.EndDate/Hom
AND is equal to or prior to the PriorDailyCalRecord Date/Hour)
set InvalidDailyCalRecord = the DailyCalibrationRecord for the found
MostRecentDailyCalibrationTestObject.
if (OnlineDailyCalRecord .TestResultCode = null)
Set CurrentDailyCalStatus = "OOC-Prior Online Test Has Critical Errors".
else if (OnlineDailyCalRecord .TestResultCode = "FAILED")
Set CurrentDailyCalStatus = "OOC-Prior Online Test Failed".
else if {OnlineDailyCalRecord.TestResultCode = "ABORTED")
Set CurrentDailyCalStatus = "OOC-Prior Online Test Aborted".
else if ( OnlineDailyCalOpHourCount is not null AND OnlineDailyCalOpHourCount is less than or equal to 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
Environmental Protection Agency
Page 44 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
less than 26)
Set CurrentDailyCalStatus = "IC".
else
if ( OnlineDailyCalLastCoveredNonOpHour is NOT null)
if ( OnlineDailyCalFirstOpHourAfterLastNonOpHour is NOT null) AND (the number of
clock hours between the OnlineDailyCalFirstOpHourAfterLastNonOpHour 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)
Set CurrentDailyCalStatus = "IC-Undetermined".
else
Set CurrentDailyCalStatus = "OOC-Expired".
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Daily Calibration Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
FLOW Daily Calibration Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
Hg Daily Calibration Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
NOX Daily Calibration Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Daily Calibr
6
Process/Category:
Emissions Data Evaluation Report
02 Dry Daily Calibration Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
02 Wet Daily Calibration Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 Daily Calibration Status Evaluation
Environmental Protection Agency
Page 45 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DCSTAT-4
Check Name: Determine Final Daily Calibration Status
Related Former Checks:
Applicability: CEM Check
Description: Evaluates the determined Daily Calibration Status and changes it if needed based on an ignored test or the
status of the alternate range.
Specifications:
Set AlternateDailyCalRecord = null.
if {CurrentDailyCalStatus begins with "OOC")
if (InvalidDailyCalRecord is not null)
Set CurrentDailyCalStatus = CurrentDailyCalStatus &
Return result CurrentDailyCalStatus.
else if (DualRangeStatus = true and CurrentDailyCalStatus begins with "IC")
if (CurrentAnalyzerRangeUsed = "H")
Set AlternateAnalyzerRange = "L".
Set AlternateComponentID= LowRangeComponentlD.
else
Set AlternateAnalyzerRange = "H".
Set AlternateComponentID= HighRangeComponentlD.
Locate the most recent record in DailyCalTestRecordsByLocationForQAStatus for the location where:
a) ComponentID is equal to the .1 hernalei 'omponenil!) AND
b) ValidFlag = "Y" AND
c) SpanScaleCode is equal to the AlternateAnalyzerRange
if (DailyCalTestRecordsByLocationForQAStatus is found)
Set AlternateDailyCalRecord = the found record in DailyCalTestRecordsByLocationForQAStatus.
if {AlternateDailyCalRecord is not null)
if (AlternateDailyCalRecord.TestResultCode = null)
Set CurrentDailyCalStatus = "OOC-Alternate Range Test Has Critical Errors",
else if (AlternateDailyCalRecord.TQStResultCode= "FAILED")
Set CurrentDailyCalStatus = "OOC-Alternate Range Test Failed".
else if (AlternateDailyCalRecord.7cs[Rcsu\[Codc = "ABORTED")
Set CurrentDailyCalStatus = "OOC-Alternate Range Test Aborted".
else
Environmental Protection Agency
Page 46 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate the latest record in DailyCalTestRecordsByLocationForQAStatus for the location where:
a) ComponentID is equal to the .1 hernaiei 'oniponenil!) AND
b) the SpanScaleCode is equal to the AlternateAnalyzerRange
c) the TestResultCode is equal to "FAILED" or "ABORTED"
if (DailyCalTestRecordsByLocationForQAStatus is found AND (either the PriorDailyCalRecord is null or
EndDate/Hour/Minute is after the Prior/)ai7jCa/7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
OOC-Alternate
Range Test
Aborted
OOC-Alternate
Range Test
Aborted*
OOC-Alternate
Range Test Failed
OOC-Alternate
Range Test
Failed*
OOC-Alternate
Range Test Has
Critical Errors
OOC-Alternate
Range Test Has
Critical Errors*
OOC-Event
OOC-Event*
OOC-Expired
OOC-Expired*
OOC-No Passing
Alternate Range
Test After Failed
Test
OOC-No Passing
Alternate Range
Test After Failed
Test*
OOC-No Passing
Test After
Alternate Range
Failed Test
OOC-No Passing
Test After
Alternate Range
Failed Test*
OOC-No Prior
Test
OOC-No Prior
Test*
OOC-No
Probationary
Calibration Test
Response
The prior daily calibration test for the alternate range [altscale] of [compkey], which
was completed on [altdate], was aborted.
The prior daily calibration
was completed on [altdate]
on [invdate] was ignored.
The prior daily calibration
was completed on [altdate]
The prior daily calibration
was completed on [altdate]
[invdate] was ignored.
The prior daily calibration
was completed on [altdate]
test for the alternate range [altscale] of [compkey], which
was aborted. An invalid daily calibration test completed
test for the alternate range [altscale] of [compkey], which
failed.
test for the alternate range [altscale] of [compkey], which
failed. An invalid daily calibration test completed on
test for the alternate range [altscale] of [compkey], which
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 a prior reporting
period has expired. An invalid daily calibration test completed on [invdate] was
ignored.
This check result is obsolete.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
No Errors
Environmental Protection Agency
Page 48 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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*
This check result is obsolete.
The prior online daily calibration test for [compkey] completed on [ondate] was
aborted.
The prior online daily calibration test for [compkey] completed on [ondate] was
aborted. An invalid daily calibration test completed on [invdate] was ignored.
The prior online daily calibration test for [compkey] completed on [ondate] has
expired.
The prior online daily calibration test for [compkey] completed on [ondate] has
expired. An invalid daily calibration test completed on [invdate] was 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.
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
The prior online daily calibration test for [compkey] completed on [ondate] has critical Critical Error Level 1
errors.
The prior online daily calibration test for [compkey] completed on [ondate] has critical Critical Error Level 1
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.
OOC-Test Failed The prior daily calibration test for [compkey] completed on [date] failed.
OOC-Test
Failed*
OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*
The prior daily calibration test for [compkey] completed on [date] failed. An invalid
daily calibration test completed on [invdate] was ignored.
The prior daily calibration test for [compkey] completed on [date] has critical errors.
The prior daily calibration test for [compkey] completed on [date] has critical errors.
An invalid daily calibration test completed on [invdate] was ignored.
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Daily Calibration Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
FLOW Daily Calibration Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
Hg Daily Calibration Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
NOX Daily Calibration Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Daily Calibr
6
Process/Category:
Emissions Data Evaluation Report
02 Dry Daily Calibration Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
02 Wet Daily Calibration Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 Daily Calibration Status Evaluation
Environmental Protection Agency
Page 49 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Daily Calibration Test
Environmental Protection Agency
Page 50 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-1
Check Name: Daily Calibration Test Component Type Check
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the component type reported is appropriate for an Daily Calibration test.
Specifications:
For the daily calibration test:
Set Daily Cal Calc Result to null.
Set Daily Cal Fail Date and Daily Cal Fail Hour to null.
If the ComponentID is null,
set Daily Cal Component Type Valid to false,
return result A.
Otherwise,
If the ComponentTypeCode of the associated component is equal to "S02", "NOX", "C02", "02", or "FLOW",
set Daily Cal Component Type Valid to true.
Else if the ComponentTypeCode of the associated component is equal to "HG" or "HCL",
If (OnlineOfflinelndicator is equal to 1)
set Daily Cal Component Type Valid to true.
Else
set Daily Cal Component Type Valid to false,
return result C.
Otherwise,
set Daily Cal Component Type Valid to false,
return result B.
If component is invalid, do not perform injection-based checks. Set the calculated values to null.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Fatal
B The ComponentTypeCode in the monitoring plan is [comptype]. This type of Critical Error Level 1
component does not require a calibration test. Only component types 'S02', 'NOX'.
'C02', '02', "HG", or 'FLOW' may have a daily calibration test.
C For Hg and or HC1 CEMS, all calibrations must be done while unit is online. Critical Error Level 1
Environmental Protection Agency Page 51 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 52 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-2
Check Name: Aborted and Incomplete Daily Calibration Test Check
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily calibration test:
Set Evaluate Upscale Injection AND Evaluate Zero Injection to false.
If Daily Cal Component Type Valid is equal to true,
If the TestResultCode is equal to "ABORTED",
set Daily Cal Calc Result to "ABORTED", and return result A.
If the TestResultCode is equal to "INC",
set Daily Cal Calc Result to "INC".
If ZeroInjectionDate, ZeroInjectionHour, and ZeroMeasuredValue are not null,
set Evaluate Zero Injection to true.
If UpscalelnjectionDate, UpscalelnjectionHour, and UpscaleMeasuredValue are not null,
set Evaluate Upscale Injection to true.
Otherwise,
set Evaluate Upscale Injection AND Evaluate Zero Injection to true.
Results:
Result Response Severity
A The TestResultCode indicates that the [type] test for [key] was aborted. If the test was Informational Message
aborted for a reason not related to monitor performance, you should not report the test.
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 53 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-3
Check Name: Online Offline Indicator Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For a daily calibration test:
Set Daily Cal Calc Online Ind to null.
If ZeroOpTime is equal to 0 OR UpscaleOpTime is equal to 0
set Daily Cal Calc Online Ind to 0
else if ZeroOpTime is equal to 1 AND UpscaleOpTime is equal to 1
set Daily Cal Calc Online Ind to 1
else
set Daily Cal Calc Online Ind to the OnlineOfflinelndicator.
If (OnlineOfflinelndicator is null)
return result A.
else if (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 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
Environmental Protection Agency
Page 54 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OR
c) SpanScaleCode in the current test == "L" andQACertEventCode<>35or 171
If found,
return result D.
Results:
Result
A
B
C
D
Response
You did not provide [fieldname], which is required for [key].
The OnlineOfflinelndicator in the daily calibration test indicates that the test was
performed on-line, but OperatingTime in the Hourly Operating Data record is 0.
This check result is obsolete.
The test was peformed while the unit was not operating, but this is not valid, because
you reported an QA Certification Event record indicating that you needed to perform
an online-offline calibration demonstration allowing you to conduct off -line daily
calibration tests. However, you have not reported an online-offline calibration
demonstration subsequent to the EventDate and EventHour in the QA Certification
Event record.
For Hg and or HC1 CEMS, all calibrations must be done while unit is online.
Severity
Critical Error Level 1
Critical Error Level 1
No Errors
Critical Error Level 2
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 55 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-4
Check Name: Test Span Scale Valid
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the reported span scale is valid and consistent with the current analyzer range
of the component.
Specifications:
For a daily calibration test with a valid component:
Set Daily Cal Span Scale Valid to true.
If the ComponentTypeCode of the associated component is not equal to "FLOW", not equal to "HG", or not equal to "HCL",
If the SpanScaleCode is null,
set Daily Cal Span Scale Valid to false, and return result A.
If the SpanScaleCode is not equal to "H" or "L",
set Daily Cal Span Scale Valid to false, and return result B.
If the EM Test Date Valid AND EM Test Hour Valid are true,
If the SpanScaleCode is equal to "H"
Locate an Analyzer Range record for the component where the AnalyzerRangeCode is equal to "L", the
BeginDate and BeginHour is on or before the Date and Hour in the current test, and the EndDate is null
or the EndDate and EndHour is on or after the Date and Hour of the current test.
If found,
set Daily Cal Span Scale Valid to false, and return result C.
If the SpanScaleCode is equal to "L"
Locate an Analyzer Range record for the component where the AnalyzerRangeCode is equal to "H", the
BeginDate and BeginHour is on or before the Date and Hour of the current test, and the EndDate is null
or the EndDate and EndHour is on or after the Date and Hour of the current test.
If found,
set Daily Cal Span Scale Valid to false, and return result C.
Else, if the ComponentTypeCode of the associated component is equal to "HG" or "HCL",
If the SpanScaleCode is null,
set Daily Cal Span Scale Valid to false, and return result A.
Else if the SpanScaleCode is not equal to "H",
set Daily Cal Span Scale Valid to false, and return result B.
Otherwise,
If the SpanScaleCode is not null,
set Daily Cal Span Scale Valid to false, and return result D.
Environmental Protection Agency
Page 56 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
B You reported the value [value], which is not in the list of valid values, in the field Critical Error Level 1
[fieldname] for [key].
C The active analyzer range for the component is inconsistent with the span scale [value] Critical Error Level 1
reported for the [type] test for [key].
D You reported a SpanScaleCode in the [type] test for [key], but this is not appropriate Critical Error Level 1
for flow component.
Usage:
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 57 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-5
Check Name: Determine Span Value
Related Former Checks:
Applicability: CEM Check
Description: This check determines the span value for the test:
Specifications:
For a daily calibration test:
Set Daily Cal Span Value to null.
If EM Test Date Valid, EM Test Hour Valid, and Daily Cal Span Scale Value are all true,
Locate the System Component records for the associated component with the earliest Begin Date.
If found,
If the BeginDate in the retrieved record is not null, the BeginHour in the retrieved record is between 0 and 23,
and the BeginDate and BeginHour is later than the Date and Hour of the test.
Locate a Span Record for the location where the ComponentTypeCode equal to the ComponentTypeCode
of the associated component, the SpanScaleCode is equal to the SpanScaleCode in the test, the Span
Value is greater than 0, the BeginDate and BeginHour is on or before the BeginDate and BeginHour of
the retrieved record, and the EndDate is null or the EndDate and EndHour is after the BeginDate and
BeginHour of the retrieved record.
Otherwise,
Locate a Span Record for the location where the ComponentTypeCode equal to the ComponentTypeCode
of the associated component, the SpanScaleCode is equal to the SpanScaleCode in the test, the Span
Value is greater than 0, the BeginDate and BeginHour is on or before the Date and Hour of the test, and
the EndDate is null or the EndDate and EndHour is after the Date and Hour of the test.
If not found,
return result A.
If more than one record is found,
return result B.
If one record is found,
set Daily Cal Span Value to the Span Value in the retrieved span record.
else
return result C.
Environmental Protection Agency
Page 58 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
You have not reported a valid monitoring plan span record that was active during the
test for [key].
You reported more than one monitoring plan span record that was active during the
test for [key].
The component reported for [key] is not part of any monitoring system.
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 59 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-6
Check Name: Daily Calibration Test Upscale Gas Level Code Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Upscale Gas Level Code is valid.
Specifications:
For the daily calibration test with an upscale injection:
If the UpscaleGasCode is null,
set Daily Cal Upscale Gas Level Valid to false, and return result A.
If the UpscaleGasCode is not equal to "MID" or "HIGH",
set Daily Cal Upscale Gas Level Valid to false, and return result B.
If the ComponentTypeCode of the associated component is equal to "FLOW", and the UpscaleGasLevelCode is equal to "MID",
set Daily Cal Upscale Gas Level Valid to false, and return result C.
Otherwise,
set Daily Cal Upscale Gas Level Valid to true.
Results:
Result
A
B
C
Usage:
1
Response
You did not provide [fieldname], which is required for [key].
You reported the value [value], which is not in the list of valid values, in the field
[fieldname] for [key].
You have reported a value of "MID" as the UpscaleGasCode. This value is not
appropriate for flow components.
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 60 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-7
Check Name:
Related Former Checks:
Reference Values Consistent with Calibration Gas Levels
Applicability:
Description:
CEM Check
This check is to identify reference values which are not correct relative to the calibration gas levels indicated.
Specifications:
For the daily calibration test with an upscale and zero injection:
If ZeroReferenceValue greater than or equal to 0, UpscaleReferenceValue greater than 0, AND ZeroReferenceValue is greater than
or equal to UpscaleReferenceValue,
set Daily Cal Calc Result to "INVALID", and return result A.
Results:
Result
A
Response
The reference value is not consistent with the reported calibration gas levels in the
daily calibration test for [key]. The reference values of zero-level gas injection or
reference signals must be less than that of the upscale gas injection.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 61 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-8
Check Name: Zero Measured Value Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Zero Measured Value is reported.
Specifications:
For the daily calibration test with a zero injection:
If ZeroMeasuredValue is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 62 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-9
Check Name: Zero Reference Value Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Zero Reference Value is reported.
Specifications:
For the daily calibration test with a zero injection:
If ZeroReferenceValue is null,
return result A.
If ZeroReference Value is less than 0,
return result B.
Results:
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Result Response
A You did not provide [fieldname], which is required for [key].
B The value [value] in the field [fieldname] for [key] is not within the range of valid
values. This value must be greater than or equal to zero.
Environmental Protection Agency
Page 63 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-10
Check Name: Zero Calibration Error Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Zero Calibration Error is reported.
Specifications:
For the daily calibration test with a zero injection:
If the ZeroCalibrationError is null,
return result A.
If the ZeroCalibrationError is less than 0,
return result B.
Results:
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Result Response
A You did not provide [fieldname], which is required for [key].
B The value [value] in the field [fieldname] for [key] is not within the range of valid
values. This value must be greater than or equal to zero.
Environmental Protection Agency
Page 64 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-11
Check Name: Zero APS Indicator Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily calibration test with a zero injection:
If ZeroAPSIndicator is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 65 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-12
Check Name: Upscale Measured Value Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Upscale Measured Value is reported.
Specifications:
For the daily calibration test with an upscale injection:
If UpscaleMeasuredValue is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 66 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-13
Check Name: Upscale Reference Value Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Upscale Reference Value is reported.
Specifications:
For the daily calibration test with an upscale injection:
If UpscaleReferenceValue is null,
return result A.
If UpscaleReference Value is less than or equal to 0,
return result B.
Results:
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Result Response
A You did not provide [fieldname], which is required for [key].
B The value [value] in the field [fieldname] for [key] is not within the range of valid
values. This value must be greater than zero.
Environmental Protection Agency
Page 67 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-14
Check Name: Upscale Calibration Error Valid
Related Former Checks:
Applicability: CEM Check
Description: This check is to make sure that the Upscale Calibration Error is reported.
Specifications:
For the daily calibration test with an upscale injection:
If the UpscaleCalibrationError is null,
return result A.
If the UpscaleCalibrationError is less than 0,
return result B.
Results:
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Result Response
A You did not provide [fieldname], which is required for [key].
B The value [value] in the field [fieldname] for [key] is not within the range of valid
values. This value must be greater than or equal to zero.
Environmental Protection Agency
Page 68 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-15
Check Name: Upscale APS Indicator Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily calibration test with an upscale injection:
If UpscaleAPSIndicator is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 69 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-16
Check Name: Upscale Injection Time Valid
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the Injection Date and Hour reported in the Injection Element is valid.
Specifications:
For the daily calibration test with an upscale injection:
If the UpscalelnjectionHour is not between 0 and 23, or the UpscalelnjectionMinute is null and Legacy Data Evaluation == false,
or the UpscalelnjectionMinute is not between 0 and 59,
set Daily Cal Upscale Injection Time Valid to false, and return result A.
Otherwise,
set Daily Cal Upscale Injection Time Valid to true.
Results:
Result Response
A The [type] date, hour, and/or minute for [key] is invalid.
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Seventy
Critical Error Level 1
Environmental Protection Agency
Page 70 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAYCAL-17
Check Name:
Related Former Checks:
Zero Injection Time Valid
Applicability:
Description:
CEM Check
This check determines whether the Injection Date and Hour reported in the Injection Element is valid.
Specifications:
For the daily calibration test with a zero injection:
If the ZeroInjectionHour is not between 0 and 23, or the ZeroInjectionMinute is null and Legacy Data Evaluation == false, or the
ZeroInjectionMinute is not between 0 and 59,
set Daily Cal Injection Times Valid to false, and return result A.
else if Legacy Data Evaluation == false, the UpscalelnjectionDate is not null, the UpscalelnjectionHour is between 0 and 23, the
UpscalelnjectionMinute is between 0 and 59, and the UpscalelnjectionDate, UpscalelnjectionHour, and UpscalelnjectionMinute
are equal to the ZeroIniectionDate, ZeroIniectionHour, and ZeroIniectionMinute, and the associated ComponentTypeCode is not
equal to "FLOW"
set Daily Cal Injection Times Valid to false, and return result B.
set Daily Cal Injection Times Valid to Daily Cal Upscale Injection Time Valid.
Locate another Daily Calibration Test Record for the location where the ComponentID and SpanScale are equal to the
ComponentID and SpanScale in the current record, TestResultCode is not equal to "INC", and the EndDate/Hour/Minute
is between the UpscalelnjectionDate/Hour/Minute and ZeroInjectionDate/Hour/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.
Otherwise,
Results:
Result
A
B
Response
The [type] date, hour, and/or minute for [key] is invalid.
You reported that the zero injection and upscale injection for [key] were performed at
the same time. This is invalid.
This [testtype] was conducted at the same time as another [testtype] for the same
component and range.
The zero and upscale injections for [key] were not performed in the same or adjacent
clock hours.
Severity
Critical Error Level 1
Critical Error Level 1
C
Critical Error Level 1
D
Critical Error Level 2
Environmental Protection Agency
Page 71 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 72 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-18
Check Name: Zero Reference Value Consistent with Span
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the calibration gas or reference signal is appropriate for span and gas level.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with a Daily Cal Span Value that is not null and a ZeroReference Value greater than or equal to 0:
If the ComponentTypeCode of the associated component is not equal to "HG",
Calculate Zero Reference Percent of Span = ZeroReference Value / Daily Cal Span Value * 100, and round to result to
one decimal place.
If Zero Reference Percent of Span is greater than 20.0,
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7D AY" and the
FieldDescription is equal to "GasPercentOfSpan".
If Zero Reference Percent of Span is greater than 20.0 + Tolerance in the cross-check record,
return result A.
Otherwise,
return result B.
Results:
Result
A
B
Response
The tag value of at least one Zero level reference signal or calibration gas for [key] is
[percent]%, which does not meet the performance specifications of 40 CFRPart 75.
The concentration of the zero reference signal or calibration gas must be less than or
equal to 20.0% of the span value. The test is invalid.
The tag value of at least one zero level reference signal or calibration gas for [key] is
[percent]%, which does not meet the performance specifications of 40 CFRPart 75.
The concentration of the zero reference signal or calibration gas must be less than or
equal to 20.0% of the span value.
Severity
Critical Error Level 2
Non-Critical Error
Usage:
1
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 73 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-19
Check Name: Upscale Reference Value Consistent with Span
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the calibration gas or reference signal is appropriate for span and gas level.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with a Daily Cal Span Value that is not null and an UpscaleReferenceValue greater than 0:
Calculate Upscale Reference Percent of Span = UpscaleReference Value / Daily Cal Span Value * 100, and round to result to one
decimal place.
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and the FieldDescription is equal to
" GasPercentOfSpan".
If UpscaleGasLevelCode is equal to "MID", and the ComponentTypeCode of the associated component is not equal to "FLOW",
If Upscale Reference Percent of Span is less than 50.0 or greater than 60.0,
If Upscale Reference Percent of Span is less than 50.0 - Tolerance in the cross-check record or Upscale
Reference Percent of Span greater than 60.0 + Tolerance in the cross-check record,
return result A.
Otherwise,
return result B.
If UpscaleGasLevelCode is equal to "HIGH",
If the ComponentTypeCode of the associated component is equal to "FLOW",
If Upscale Reference Percent of Span is less than 50.0 or greater than 70.0,
If Upscale Reference Percent of Span is less than 50.0 - Tolerance in the cross-check record or Upscale
Reference Percent of Span greater than 70.0 + Tolerance in the cross-check record,
return result C.
Otherwise,
return result D.
Otherwise,
If Upscale Reference Percent of Span is greater than 100.0,
return result E
If Upscale Reference Percent of Span is less than 80.0,
If Upscale Reference Percent of Span is less than 80.0 - Tolerance in the cross-check record,
return result E.
Otherwise,
return result F.
Environmental Protection Agency
Page 74 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
The tag value of at least one Mid level reference signal or calibration gas for [key] is
[percent] %, which does not meet the 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.
The tag value of at least one High level reference signal for [key] is [percent] %, which
does not meet the performance specifications of 40 CFR Part 75. The value of the high
reference signal for a flow component must be between 50.0% and 70.0% of the span
value. The test is invalid.
The tag value of at least one High level reference signal for [key] is [percent] %, which
does not meet the performance specifications of 40 CFR Part 75. The value of the
'high' reference signal for a flow component must be between 50.0% and 70.0% of the
span value.
The tag value of at least one High level reference calibration gas for [key] is
[percent] %, which does not meet the applicable performance specifications. The
concentration of the high reference calibration gas must be between 80.0% and 100.0%
of the span value. The test is invalid.
The tag value of at least one High level reference calibration gas for [key] is
[percent] %, 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.
Severity
Critical Error Level 2
Non-Critical Error
Critical Error Level 2
Non-Critical Error
Critical Error Level 2
Non-Critical Error
Usage:
1
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 75 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-20
Check Name: Calculate Zero Gas Injection or Reference Signal Results
Related Former Checks:
Applicability: CEM Check
Description: This check is to calculate calibration errors.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with a zero injection:
If (Daily Cal Span Value is null, or ZeroReference Value 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 - ZeroReference Value)
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 "DififerencePCT".
If (the absolute value of the difference between diff and ZeroCalibrationError is less than
or equal to the Tolerance in the cross-check record)
if {Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSED".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater than
ZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
Environmental Protection Agency Page 76 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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( rounds//// I 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".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
Environmental Protection Agency
Page 77 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 CalcResult is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSAPS".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than ZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanZeroInjectionDate/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 I 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")
Environmental Protection Agency
Page 78 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set Daily Cal Calc Result to "PASSAPS".
Otherwise,
If {Daily Cal Zero Injection Calc Result is greater than 6 .0)
If {Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")
If (ZeroAPSIndicator is NOT equal to 1 and ZeroCalibrationError is greater than or
equal to 0 and less than or equal to 6.0)
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "CalibrationError".
If (the absolute value of the difference between Daily Cal Zero Injection Calc
Result and ZeroCalibrationError is less than or equal to the Tolerance in the
cross-check record)
If {Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")
set Daily Cal Calc Result to "PASSED".
Otherwise,
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
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
"DififerenceINH20".
If (the absolute value of the difference between diff and
ZeroCalibrationError is less than or equal to the Tolerance
cross-check record)
If {Daily Cal Calc Result is not equal to "INC" or
set Daily Cal Calc Result to "PASSAPS".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
in the
"FAILED")
Environmental Protection Agency
Page 79 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
greater than ZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
else
set Daily Cal CalcResult to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
Otherwise,
If {Daily Cal Calc Result is not equal to "INC" or "FAILED", or "PASSAPS" or "IGNORED")
set Daily Cal Calc Result to "PASSED".
If (ComponentTypeCode of the associated component is equal to "HG")
Calculate Daily Cal Zero Injection Calc Result = min( rounds//// I 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 Times Valid == true)
If {Daily Cal Fail Date is null)
Environmental Protection Agency
Page 80 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
thanZeroInjectionDate/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
cross-check record)
If {Daily Cal Calc Result is not equal to "INC" or
set Daily Cal Calc Result to "PASSAPS".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than ZeroInjectionDate/ZeroInjectionHour)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour.
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to ZeroInjectionDate.
set Daily Cal Fail Hour to Zerolnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanZeroInjectionDate/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".
in the
"FAILED")
Results:
Result Response Severity
A The software could not evaluate the [test] calculations reported for [key], because of the Informational Message
errors listed above.
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 81 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-21
Check Name: Calculate Upscale Gas Injection or Reference Signal Results
Related Former Checks:
Applicability: CEM Check
Description: This check is to calculate calibration errors.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with an upscale injection:
If {Daily Cal Span Value is null, or Daily Cal Upscale Gas Level Valid is false, or UpscaleReference Value of the test is null or is
less than or equal to zero, or UpscaleMeasuredValue of the test is null)
Set Daily Cal Calc Result to "INVALID", Daily Cal Upscale Injection Calc Result to null, Daily Cal Upscale Injection
Cale APS Indicator to null, and return result A.
Otherwise,
Calculate 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 "DififerencePCT".
If (the absolute value of the difference between diff and UpscaleCalibrationError is less
than or equal to the Tolerance in the cross-check record)
if {Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSED".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater than
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".
Environmental Protection Agency
Page 82 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater than
UpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.
else if {Daily Cal Calc Result is not equal to "INC" or "FAILED" or "IGNORED")
set Daily Cal Calc Result to "PASSED".
If (ComponentTypeCode of the associated component is equal to "S02" or "NOX")
Calculate Daily Cal Upscalelnjection Calc Result = min( rounds//// / 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 Upscalelnjection
Calc Result and UpscaleCalibrationError is less than or equal to the Tolerance
in the cross-check record)
If {Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")
set Daily Cal Calc Result to "PASSED".
Otherwise,
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.
Environmental Protection Agency
Page 83 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 CalcResult is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSAPS".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than
UpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/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 Upscalelnjection Calc Result = min(round(diif / Daily Cal Span Value * 100, 1), 9999.9).
Round diff to 2 decimal places.
Environmental Protection Agency
Page 84 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (Daily Cal Upscale Injection Calc Result is greater than 6.0, the SampleAcquisitionMethodCode of the
associated component is equal to "DP", and diff is less than or equal to 0.02)
set Daily Cal Upscale Injection Calc Result to diff.
set Daily Cal Upscale Injection Calc APS Indicator to 1.
If {Daily Cal Calc Result is not equal to "INVALID" or "FAILED" or "INC" or "IGNORED")
set Daily Cal Calc Result to "PASSAPS".
Otherwise,
If {Daily Cal Upscale Injection Calc Result is greater than 6 .0)
If {Daily Cal Calc Result is not equal to "INVALID" or "IGNORED")
If (UpscaleAPSIndicator is NOT equal to 1 and UpscaleCalibrationError is greater than
or equal to 0 and less than or equal to 6.0)
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "CalibrationError".
If (the absolute value of the difference betw een Daily Cal Upscale Injection
Calc Result and UpscaleCalibrationError is less than or equal to the Tolerance
in the cross-check record)
If {Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")
set Daily Cal Calc Result to "PASSED".
Otherwise,
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.
Otherwise,
If (UpscaleAPSIndicator is equal to 1, the SampleAcquisitionMethodCode of the
associated component is equal to "DP", and UpscaleCalibrationError is greater
than or equal to 0 and less than or equal to 0.02)
Locate the Test Tolerance cross-check record where the TestTypeCode is
equal to "7DAY" and the FieldDescription is equal to
"DififerenceINH20".
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
Environmental Protection Agency
Page 85 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set Daily Cal CalcResult to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than
UpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/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")
Calculate Daily Cal Upscalelnjection Calc Result = min( rounds//// / 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".
Environmental Protection Agency
Page 86 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (the absolute value of the difference betw een Daily Cal Upscale Injection
Calc Result and UpscaleCalibrationError is less than or equal to the Tolerance
in the cross-check record)
If (Daily Cal Calc Result is not equal to "PASSAPS" or "INC" or
"FAILED")
set Daily Cal Calc Result to "PASSED".
Otherwise,
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/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
"DififerenceUGSCM".
If (the absolute value of the difference between diff and
UpscaleCalibrationError is less than or equal to the Tolerance in the
cross-check record)
If {Daily Cal Calc Result is not equal to "INC" or "FAILED")
set Daily Cal Calc Result to "PASSAPS".
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else if {Daily Cal Fail Date/Daily Cal Fail Hour is
greater than
UpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to
UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection
Hour.
else
set Daily Cal Calc Result to "FAILED".
If {Daily Cal Injection Times Valid == true)
If {Daily Cal Fail Date is null)
Environmental Protection Agency
Page 87 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour,
else if {Daily Cal Fail Date/Daily Cal Fail Hour is greater
thanUpscalelnjectionDate/UpscalelnjectionHour)
set Daily Cal Fail Date to UpscalelnjectionDate.
set Daily Cal Fail Hour to Upscalelnjection Hour.
Otherwise,
If (Daily Cal CalcResult is not equal to "FAILED" or "INC", or "PASSAPS" or "IGNORED")
set Daily Cal Calc Result to "PASSED".
Results:
Result Response Severity
A The software could not evaluate the [test] calculations reported for [key], because of the Informational Message
errors listed above.
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 88 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-22
Check Name:
Related Former Checks:
Daily Calibration Test End Time Valid
Applicability:
Description:
CEM Check
This check indicates if the reported test end date, hour, minute is consistent with the injection times.
Specifications:
For the daily calibration test with upscale and zero injections and a valid date, hour, and minute and injection times:
If Date, Hour, and Minute of the test does not equal the later of the ZeroInjectionDate, Hour, and Minute (if not null) and the
UpscalelnjectionDate, Hour, and Minute (if non-null),
return result A.
Results:
Result
A
You reported a test Date, Hour, and Minute that is not the same as the Date, Hour, and Critical Error Level 1
Minute of the last injection in the daily calibration test for [key].
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 89 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-23
Check Name:
Related Former Checks:
Reported Zero Injection Results Consistent with Recalculated Values
Applicability:
Description:
CEM Check
This check is to compare reported and recalculated results for each gas injection.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with a zero injection:
If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "FLOW", and the
SampleAcquisitionMethodCode of the associated component is not equal to "DP",
return result A.
If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "S02" or "NOX", and the
Daily Cal Span Value is greater than or equal to 200,
return result B.
If the ZeroAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "C02" or "02",
return result C.
Otherwise,
If Daily Cal Zero Injection Calc Result is not null,
If the ZeroAPSIndicator in the current record is not equal to 1 and the Daily Cal Zero Injection Calc APS
Indicator is equal to 1,
return result D.
If the ZeroCalibrationError is greater than or equal to 0,
If the ComponentTypeCode of the associated component is equal to "C02" or "02"
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and
the FieldDescription is equal to "DilferencePCT".
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 "DififerenceINH20".
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
Environmental Protection Agency
Page 90 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
"7DAY" and the FieldDescription is equal to "DifferenceUGSCM".
If the absolute value of the difference between the Daily CalZero Injection Calc Result
and the ZeroCalibrationError is greater than the Tolerance in the cross-check record,
return result E.
Otherwise,
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DilferencePPM".
If the absolute value of the difference between the Daily CalZero Injection Calc Result
and the ZeroCalibrationError is greater than the Tolerance in the cross-check record,
return result E.
else if ZeroAPSIndicator is equal to 0,
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and
the FieldDescription is equal to "CalibrationError".
If the absolute value of the difference between the Daily CalZero Injection Calc Result and the
ZeroCalibrationError is greater than the Tolerance in the cross-check record,
return result F.
Results:
Result
A
B
C
D
Usage:
1
Response
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance criteria for non-differential pressure flow monitors.
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance specification criteria for S02 and NOX components when the
instrument span is greater than or equal to 200.
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance specification criteria for C02 and 02 components.
You did not report a value of " 1" in the [level] APS Indicator for [key], although EPA
applied the alternative performance specification to determine that the injection passed
the applicable performance specification.
The absolute difference reported as the [level] Calibration Error for [key] is
inconsistent with the recalculated absolute difference for the gas injection or reference
signal.
The [level] Calibration Error reported for [key] is inconsistent with the recalculated
calibration error for the gas injection or reference signal.
Process/Category: 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 91 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-24
Check Name:
Related Former Checks:
Reported Upscale Injection Results Consistent with Recalculated Values
Applicability:
Description:
CEM Check
This check is to compare reported and recalculated results for each gas injection.
Validation Tables:
Test Tolerances (Cross Check Table)
Specifications:
For the daily calibration test with an upscale injection:
If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "FLOW", and the
SampleAcquisitionMethodCode of the associated component is not equal to "DP",
return result A.
If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "S02" or "NOX", and
the Daily Cal Span Value is greater than or equal to 200,
return result B.
If the UpscaleAPSIndicator is equal to 1, the ComponentTypeCode of the associated component is equal to "C02" or "02",
return result C.
Otherwise,
If Daily Cal Upscale Injection Calc Result is not null,
If the UpscaleAPSIndicator in the current record is not equal to 1 and the Daily Cal Upscale Injection Calc APS
Indicator is equal to 1,
return result D.
If the UpscaleCalibrationError is greater than or equal to 0,
If the ComponentTypeCode of the associated component is equal to "C02" or "02"
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and
the FieldDescription is equal to "DilferencePCT".
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 "DififerenceINH20".
If the absolute value of the difference between the Daily Cal Upscale Injection Calc
Result and the UpscaleCalibrationError is greater than the Tolerance in the cross-check
record,
return result E.
Else, if the ComponentTypeCode of the associated component is equal to "HG",
Environmental Protection Agency
Page 92 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DifferenceUGSCM".
If the absolute value of the difference between the Daily Cal Upscale Injection Calc
Result and the UpscaleCalibrationError is greater than the Tolerance in the cross-check
record,
return result E.
Otherwise,
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to
"7DAY" and the FieldDescription is equal to "DilferencePPM".
If the absolute value of the difference between the Daily Cal Upscale Injection Calc
Result and the UpscaleCalibrationError is greater than the Tolerance in the cross-check
record,
return result E.
else if UpscaleAPSIndicator is equal to 0,
Locate the Test Tolerance cross-check record where the TestTypeCode is equal to "7DAY" and
the FieldDescription is equal to "CalibrationError".
If the absolute value of the difference between the Daily Cal Upscale Injection Calc Result and
the UpscaleCalibrationError is greater than the Tolerance in the cross-check record,
return result F.
Results:
Result
A
B
C
D
Usage:
1
Response
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance criteria for non-differential pressure flow monitors.
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance specification criteria for S02 and NOX components when the
instrument span is greater than or equal to 200.
You reported a value of "1" as the [level] APS Indicator for [key], but you must use the
standard performance specification criteria for C02 and 02 components.
You did not report a value of " 1" in the [level] APS Indicator for [key], although EPA
applied the alternative performance specification to determine that the injection passed
the applicable performance specification.
The absolute difference reported as the [level] Calibration Error for [key] is
inconsistent with the recalculated absolute difference for the gas injection or reference
signal.
The [level] Calibration Error reported for [key] is inconsistent with the recalculated
calibration error for the gas injection or reference signal.
Process/Category: 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 93 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-25
Check Name: Determination of Overall Daily Calibration Test Result
Related Former Checks:
Applicability: CEM Check
Description: This check is to calculate daily calibration test results.
Specifications:
For the daily calibration test:
If Daily Cal CalcResult 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
Response
You did not provide [fieldname], which is required for [key].
You reported the value [value], which is not in the list of valid values for this test type,
in the field [fieldname] for [key].
The TestResultCode for [key] indicates a passing test, but the recalculated results
indicate a failing test.
The TestResultCode for [key] indicates an incomplete test, but the recalculated results
indicate a failing test. A test is considered to have failed if it fails to meet the
performance criteria for any injection.
You reported a TestResultCode of "FAILED" for [key], but the results recalculated or
determined from the other reported values indicate that the test passed.
Process/Category: 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 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-26
Check Name:
Related Former Checks:
Upscale Gas Type Code Valid
Applicability:
Description:
CEM Check
This check determines whether the Upscale Gas Type Code is valid (PGVP).
Validation Tables:
Gas Type Code (Lookup Table)
Vw System Parameter (Lookup Table)
Specifications:
For the daily calibration test with an upscale injection:
UpscaleGasTypeValid = true.
Locate System Parameter lookup table record where Sys Param Name = 'PGVPAETBRULEDATE.
Set Daily Cal PGVP Rule Date to System Parameter. Pa ramVa 1 lie 1.
If UpscaleGasTypeCode is null,
If the ComponentTypeCode of the associated component is equal to "S02", "NOX", "C02", or "02", and the Date of the
test is on or after 9/26/2011,
UpscaleGasTypeValid = false,
return result A.
If the ComponentTypeCode of the associated component is equal to "FLOW", "HCL", or "HG",
UpscaleGasTypeValid = false
return result B.
else if the UpscaleGasTypeCode is not equal to "GMIS", "PRM", "RGM", or "SRM",
if the UpscaleGasTypeCode is not in the GasTypeCode lookup table.
UpscaleGasTypeValid = false
return result C.
else if the UpscaleGasTypeCode == "ZERO" or "ZAM"
UpscaleGasTypeValid = false
return result C
else if the UpscaleGasTypeCode == "APPVD"
return result D
else if the ComponentTypeCode == "S02", "NOX", "C02" or "02",
Locate Protocol Gas Parameter To Type Cross Reference records where ProtocolGasParameter is equal
to ComponentTypeCode in the current Daily Calibration record, and GasTypeList contains the
UpscaleGasTypeCode in the current Daily Calibration record.
If not found,
UpscaleGasTypeValid = false
return result E.
else if ComponentTypeCode == "02", UpscaleGasTypeCode == "AIR", and the UpscaleGasCode is not
Otherwise,
Environmental Protection Agency
Page 95 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
Usage:
1
equal to "HIGH",
UpscaleGasTypeValid = false
return result F.
Response
You did not report a UpscaleGasTypeCode for [key]. This information is required by
the Protocol Gas Verification Program reporting rule.
You reported a value in the UpscaleGasTypeCode field for [key]. This value should not
be reported for a FLOW, HC1, or HG component.
You reported the value [value], which is not in the list of valid values, in the field
[fieldname] for [key].
You reported "APPVD" as the [fieldname] for [key]. This code indicates that you
received approval from EPA for a new type of Protocol Gas. If you have not received
approval from EPA, please contact ECMPS support. If you have already received
approval, you should log in to the ECMPS host, so that the ECMPS program can
obtain the necessary information to override this error.
You reported an UpscaleGasTypeCode that is not appropriate for a [comptype]
component for [key].
You reported an [fieldname] of "AIR" for [key], which indicates the use of purified air
material, but this material can only be used for a high-level calibration.
Process/Category: 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 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAY CAL-27
Check Name:
Related Former Checks:
Cylinder ID Valid
Applicability:
Description:
CEM Check
This check determines whether the Cylinder ID is valid.
Specifications:
For the daily calibration test with an upscale injection:
If CylinderlD is null,
If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR",
return result A.
Otherwise,
If the UpscaleGasTypeCode is equal to "AIR",
return result B.
else if UpscaleGasTypeValid is true, and the UpscaleGasTypeCd is null,
return result C.
else if Cylinderldentifer contains characters that are not capital letters, numbers, hyphens, ampersands or periods,
If InvalidCylinderldList does not contain CylinderlD,
Add CylinderlD to InvalidCylinderldList.
Results:
Result
A
B
Response
You did not provide [fieldname], which is required for [key].
You indicated that you used purified air material or zero air material instead of a
cylinder gas, but you reported a Cylinderldentifier.
You reported a [fieldname] for [key], but you did not report an UpscaleGasTypeCode.
Severity
Critical Error Level 1
Critical Error Level 1
C
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 97 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-28
Check Name: Vendor ID Valid
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the Vendor ID is valid.
Validation Tables:
Protocol Gas Vendor (Lookup Table)
Specifications:
For the daily calibration test with an upscale injection:
If VendorlD is null,
If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR", "SRM", "NTRM",
"GMIS", "RGM", or "PRM",
return result A.
else if the VendorlD is not in the Protocol Gas Vendor lookup table,
return result B.
Otherwise,
If the UpscaleGasTypeCode is equal to "AIR", "SRM", "NTRM", "GMIS", "RGM", or "PRM",
return result C.
else if the DeactivationDate in the Protocol Gas Vendor record is not null and the Date of the current test is on or after the
January 1 after DeactivationDate + 8 years,
return result F.
else if the ActivationDate in the Protocol Gas Vendor record is after the Date of the current test,
return result G.
else if the VendorlD is equal to "NONPGVP", and the Date of the test is on or after the Daily CalPGVPRule 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
E
F
Response
You did not provide [fieldname], which is required for [key].
You reported a Vendorldentifier of [value], which is not in the list of Protocol Gas
Vendors, for [key]. Please visit the ECMPS Support Website for the list of Protocol
Gas Vendors.
You reported a [fieldname] for [key], but this value should only be reported for an EPA
Protocol Gas Type. The cylinder gas type of [gastype] indicates the use of a non-EPA
Protocol Gas Type.
You reported a Vendorldentifier of "NONPGVP" for [key], indicating the use of a EPA
Protocol Gas Type purchased from a vendor not participating in the Protocol Gas
Vendor Program (PGVP). You cannot use a gas purchased from a non-participating
vendor that was acquired more than 60 days after the PGVP Effective Date.
You reported a [fieldname] for [key], but you did not report an UpscaleGasTypeCode.
You have reported a Vendorldentifier for [key] of a vendor who is no longer
participating in the Protocol Gas Verification Program.
You have reported a vendor for [key], but this vendor was not active at the time of this
test.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Non-Critical Error
Critical Error Level 2
Critical Error Level 1
Environmental Protection Agency
Page 98 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 99 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-29
Check Name: Cylinder Expiration Date Valid
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the Expiration Date of the cylinder is valid.
Specifications:
For the daily calibration test with an upscale injection:
If ExpirationDate is null,
If UpscaleGasTypeValid is true, and the UpscaleGasTypeCode is not null and not equal to "AIR",
return result A.
Otherwise,
If the UpscaleGasTypeCode is equal to "AIR",
return result B.
else if the ExpirationDate is prior to the Date of the test,
return result C.
else if the ExpirationDate is more than 8 years after the Date of the test,
return result D.
else if UpscaleGasTypeValid is true, and the UpscaleGasTypeCd is null,
return result E.
Results:
Result
A
B
C
D
E
Severity
Critical Error Level 1
Critical Error Level 1
Response
You did not provide [fieldname], which is required for [key].
You reported a [fieldname] for [key], but this value should only be reported for an EPA
Protocol Gas Type. The cylinder gas type of [gastype] indicates the use of a non-EPA
Protocol Gas Type.
You reported an ExpirationDate for the cylinder that is prior to the date of the test for
[key].
You reported an ExpirationDate for the cylinder that is more than eight years after the
date of the test for [key]. Gas cylinders expire in less than eight years.
You reported a [fieldname] for [key], but you did not report an UpscaleGasTypeCode. Non-Critical Error
Critical Error Level 2
Critical Error Level 2
Usage:
1
Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 100 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAYCAL-30
Check Name: Upscale Gas Type Code Components Valid
Related Former Checks: 2013 Q1 replacement for DAYCAL-26
Applicability: CEM Check
Description: This check determines whether the Gas Components in the Upscale Gas Type Code are valid (PGVP).
Validation Tables:
Vw System Parameter (Lookup Table)
Specifications:
For the daily calibration test with an upscale injection:
UpscaleGasTypeValid = true.
Locate System Parameter lookup table record where Sys Param Name = 'PGVP AETB RULE DATE.
Set Daily Cal PGVP Rule Date to System Parameter. Pa ramVa 1 lie 1.
If UpscaleGasTypeCode is null,
If the ComponentTypeCode of the associated component is equal to "S02", "NOX", "C02", or "02", and the Date of the
test is on or after 9/26/2011,
UpscaleGasTypeValid = false,
return result A.
Otherwise,
If the ComponentTypeCode of the associated component is equal to "FLOW", "HCL", or "HG",
UpscaleGasTypeValid = false
return result B.
Else
Set Protocol Gas Invalid Component List to null.
Set Protocol Gas Exclusive Component List to null.
Set Protocol Gas Balance Component List to null.
Set Protocol Gas Duplicate Component List to null.
Set Protocol Gas Component List to null.
Set Protocol Gas Approval Requested = true.
Set Protocol Gas Component Count to 0.
Set Balance Component Count to 0.
For each GasComponentCode in UpscaleGasTypeCode,
Locate a record in the GasComponentCodeLookupTable where GasComponentCode is equal to the
GasComponentCode in the UpscaleGasTypeCode .
If not found, or GasComponentCode is equal to "ZERO",
Add GasComponentCode to Protocol Gas Invalid Component List.
Else
If CanCombinelndicator is equal to 0,
Add GasComponentCode to Protocol Gas Exclusive Component List.
Environmental Protection Agency
Page 101 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If BalanceComponentlndicator is equal to 1,
Add GasComponentCode to Protocol Gas Balance Component List.
Increament Balance Component Count by 1.
If the GasComponentCode is equal to "APPVD",
Set Protocol Gas Approval Requested = true.
If GasComponentCode is not in Protocol Gas Component List,
add GasComponentCode to Protocol Gas Component List.
Else if GasComponentCode is not in Protocol Gas Duplicate Component List,
add GasComponentCode to Protocol Gas Duplicate Component List.
Increament Protocol Gas Component Count by 1.
If Protocol Gas Invalid Component List is not null,
UpscaleGasTypeValid = false
return result C.
Else if Protocol Gas Duplicate Component List is not null,
set Protocol Gas Component List Valid = false,
return result L.
Else if Protocol Gas Exclusive Component List is not null, and Protocol Gas Component Count is greater than
1,
UpscaleGasTypeValid = false
return result D.
Else if Protocol Gas Approval Requested is equal to true,
return result E.
Else if Protocol Gas Exclusive Component List is null, and Balance Component Count is equal to 0,
set UpscaleGasTypeValid = false,
return result J.
Else if Protocol Gas Exclusive Component List is null, and Balance Component Count is greater than 1,
set UpscaleGasTypeValid = false,
return result K.
Else if the UpscaleGasTypeCode is not equal to "GMIS", "NTRM", "PRM", "RGM", or "SRM",
If the ComponentTypeCode is equal to "S02" or "C02",
If no GasComponentCode in UpscaleGasTypeCode is equal to ComponentTypeCode,
UpscaleGasTypeValid = false
return result F.
Else if the ComponentTypeCode is equal to "02",
If UpscaleGasTypeCode is not equal to "AIR", and no GasComponentCode in
UpscaleGasTypeCode is equal to "02",
UpscaleGasTypeValid = false
return result G.
Else if UpscaleGasTypeCode is equal to "AIR", and the UpscaleGasCode is not equal to "HIGH",
UpscaleGasTypeValid = false
Environmental Protection Agency
Page 102 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result H.
Else if the ComponentTypeCode is equal to "NOX",
If no GasComponentCode in GasTypeCode is equal to "NO", "N02", or "NOX",
UpscaleGasTypeValid = false
return result I.
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Usage:
1
Response
You did not report a UpscaleGasTypeCode for [key]. This information is required by
the Protocol Gas Verification Program reporting rule.
You reported a value in the UpscaleGasTypeCode field for [key]. This value should not
be reported for a FLOW, 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.
Process/Category: 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
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 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Daily Emissions Data
Environmental Protection Agency
Page 104 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-1
Check Name:
Determine Need for Daily C02 Emissions Record
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
Current C02 Mass Daily Record = null
Daily Op Time = null
if {Daily Op Time Accumulator Array for the location >= 0)
Daily Op Time = Daily Op Time Accumulator Array for the location
Daily Op Time Accumulator Array for the location = 0.
C02 Method Count = Active records in MonitoringMethodData for the location and date where
ParameterCode begins with "C02"
FSA Method Count = Active records in MonitoringMethodData for the location and date where
ParameterCode = "C02M" and MethodCode = "FSA"
if (FSA Method Count > 0 AND C02 Method Count >1)
return result A
if (FSA Method Count > 0)
Expected Summary Value for C02 Array for the location = true
CO2 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
else
If (Daily Op Time == 0)
return result E
Environmental Protection Agency
Page 105 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Response
You have reported more than one active method to determine C02 emissions in your
monitoring plan for this date.
You reported more than one Daily Emissions record for [param] for the day.
You reported a Daily Emissions record for C02M, but you did not report an active
C02M FSA method record in your monitoring plan for the day.
You did not report a Daily Emissions record for C02M for the day.
You reported a Daily Emissions record for C02M, but this is not appropriate for a
non-operating day.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 106 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAILY-2
Check Name: Check Total Daily Emissions Value
Related Former Checks:
Applicability:
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Set Calc TDE to null.
If (Current C02 Mass Daily Record is not null)
If (Current C02 Mass Daily . To t a 1D a i ly E m i s s i o n s >= 0 AND Rpt Period C02 Mass Reported Accumulator Array for the
location >= 0)
Rpt Period C02 Mass Reported Accumulator Array for the location = Rpt Period C02 Mass Reported Accumulator
Array for the location + Current C02 Mass Daily Tota 1Da i ly E m i ssions
if (Current C02 Mass Daily /?6'cw= 0)
Calc TDE = Calc TDE + Current C02 Mass Daily /?6'ewY/.SorbcntRclatcdIVIassEmissions
else
Set Calc TDE to null.
else if (Current C02 Mass Daily /?6'cw= 0)
Calc TDE = Current C02 Mass Daily /?6'cmy/. To t a 1D a i ly E m i s s i o n s
If (Calc TDE is null)
Rpt Period C02 Mass Calculated Accumulator Array for the location = -1
else
If {Rpt Period C02 Mass Calculated Accumulator Array for the location >= 0)
Rpt Period C02 Mass Calculated Accumulator Array for the location = Rpt Period C02 Mass Calculated
Accumulator Array for the location + Calc TDE
If (Current C02 Mass Daily /?6'cmy/.Tota 1Da i ly E m i ssions >= 0)
Environmental Protection Agency
Page 107 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 .Tota 1DailyEmissions - 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
Response
The [fieldname] reported in the Daily Emissions record for [param] is inconsistent
with the recalculated value.
The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.
The TotalDailyEmissions in the Daily Emissions record for [param] could not be
recalculated due to other errors listed in this report.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 108 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAILY-3
Check Name: Check Adjusted Daily Emissions Value
Related Former Checks:
Applicability:
Description:
Specifications:
if (Current C02 Mass Daily Record is not null),
if (Current C02 Mass Daily Record. AdjustcdDaily Emissions is not null),
If (Current C02 Mass Daily /fec-wrf. AdjustcdDaily Emissions is less than 0),
return result A
else
If (Current C02 Mass Daily /?6'ew
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-4
Check Name:
Check Sorbent Related Emissions
Related Former Checks:
Applicability:
Description:
Specifications:
if (Current C02 Mass Daily Record is not null),
if (Current C02 Mass Daily Record. SorbcntRclatcdMassEmissions is not null AND is less than 0),
return result A
Results:
Result
A
Response
The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 110 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-5
Check Name:
Validate Presence of Adjusted Daily Emissions
Related Former Checks:
Applicability:
Description:
Specifications:
if (Current C02 Mass Daily Record) is not null
if (Current C02 Mass Daily Record. AdjustcdDailyEmissions is not null)
Locate a Monitor Formula record for the location and hour where the ParameterCode is equal to 'C02M" and the
FormulaCode is equal to "G-2" or "G-3".
If not found,
return result A.
Results:
Result
A
Response
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
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 111 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-6
Check Name:
Validate Presence of Sorbent Related Emissions
Related Former Checks:
Applicability:
Description:
Specifications:
if (Current C02 Mass Daily Record) is not null
if (Current C02 Mass Daily Record. SorbcntRclatcdMassEmissions is not null),
Missing C02M Formula = null
Locate a Monitor Formula record for the location and hour where the ParameterCode is equal to 'C02M" and the
FormulaCode is equal to "G-5" or "G-6".
If not found,
Set Missing 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
A
You reported SorbentRelatedMassEmissions in the Daily Emissions record for C02M, Critical Error Level 1
but you did not report [code] formula(s) in your monitoring plan.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 112 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-7
Check Name:
Check Unadjusted Daily Emissions Value
Related Former Checks:
Applicability:
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Set Calc C02 Unadj to null.
if (Current C02 Mass Daily Record is not null)
if (Calc Total Carbon Burned is greater than 0)
Calculate Calc C02 Unadj = Calc Total Carbon Burned * 44 / 24,000, and round the result to 1 decimal place.
if (Current C02 Mass Daily /?6'ew= 0)
Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02M DAILY" AND
UOM = "TON"
if (ABS(Current C02 Mass Daily /?6'ew Tolerance)
return result B
else if (Current C02 Mass Daily /?6'ew
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAILY-8
Check Name: Check Fuel in Daily Fuel Record
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Locate UnitFuel record for the location and day
where FuelCd = Current Daily Fuel Record.UnitFuelCd
If not found,
return result A
Severity
Critical Error Level 1
Results:
Result Response
A You did not report an active Unit Fuel record for FuelCode [fueled] in your monitoring
plan.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions Fuel
Environmental Protection Agency
Page 114 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-9
Check Name:
Check Daily Fuel Feed
Related Former Checks:
Applicability:
Description:
Specifications:
if {Current Daily Fuel Record.DailyFuelFeed is null)
return result A.
else if {Current Daily Fuel Record .DailyFuelFeed is less than or equal to 0)
return result A.
Results:
Result
A
The [fieldname] reported in the Daily Fuel record for [key] is missing or invalid. The Critical Error Level 1
value must be greater than 0.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions Fuel
Environmental Protection Agency
Page 115 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-10
Check Name:
Check Carbon Content Used
Related Former Checks:
Applicability:
Description:
Specifications:
if {Current Daily Fuel Record. Ca rbonCon tcn t Uscd 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
A
Response
The CarbonContentUsed
be greater than 0 and less
Severity
in the Daily Fuel record for [key] is invalid. The value must Critical Error Level 1
than or equal to 100.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions Fuel
Environmental Protection Agency
Page 116 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAILY-11
Check Name: Check Fuel Carbon Burned
Related Former Checks:
Applicability:
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Calc Fuel Carbon Burned = null
if {Current Daily Fuel Record.DailyFuelFeed is greater than 0 and Current Daily Fuel Record. Ca rbonCon tcn t Uscd is greater than 0 and
less than or equal to 100)
Calculate Calc Fuel Carbon Burned = Current Daily Fuel /?6'cwy/. Dai ly Fuel Feed * Current Daily Fuel
Record. Ca rbo n Co n t c n t U scd /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 Fu el Record .Fuel C a rbo n B u r n cd is null)
return result A.
else if {Current Daily Fuel Ttecon/.FuelCarbonBurned is less than or equal to 0)
return result A.
else if {Calc Fuel Carbon Burned is not null ANDCurrent Daily Fuel Record. FuelCarbonBurued <> Calc Fuel Carbon Burned)
Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "CARBON" AND
UOM = "LB"
if (A B S( Current Daily Fu el Record .Fuel C a rbo n B u rncd - Calc Fuel Carbon Burned ) > Tolerance)
return result B.
Results:
Result Response Severity
A The [fieldname] reported in the Daily Fuel record for [key] is missing or invalid. The Critical Error Level 1
value must be greater than 0.
B The [fieldname] in the Daily Fuel record for [key] is inconsistent with the recalculated Critical Error Level 1
value.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions Fuel
Environmental Protection Agency
Page 117 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: DAILY-12
Check Name: Intialize Daily Emissions
Related Former Checks:
Applicability:
Description:
Specifications:
Set Calc Total Carbon Burned to 0.
Daily Op Time Accumulator Array for the location = 0.
Results:
Result Response
Usage:
1 Process/Category: Emissions Data Evaluation Report
Severity
C02 Daily Emissions Initialization
Environmental Protection Agency
Page 118 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
DAILY-13
Check Name:
Check Total Carbon Burned
Related Former Checks:
Applicability:
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Set Calculate C02M TDE to true.
if (Current C02 Mass Daily Total Carbon Burned is null)
if (Calc Total Carbon Burned is not equal to 0)
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 = "CARBON" 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.
return result A.
else if (Current C02 Mass Daily Record. TotalCarbonBurned is less than 0)
return result B.
else
Results:
Result
A
Response
You did not report TotalCarbonBurned in the Daily Emission record for C02M. You
must report this value if you report Daily Fuel records.
The [fieldname] reported in the Daily Emissions record for [param] is invalid. The
value must be greater than or equal to 0.
The [fieldname] reported in the Daily Emissions record for [param] is inconsistent
with the recalculated value.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Daily Emissions
Environmental Protection Agency
Page 119 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Daily Interference Status
Environmental Protection Agency
Page 120 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: INTSTAT-1
Check Name: Determine the Online Daily Interference Check
Related Former Checks:
Applicability: CEM Check
Description: This check locates the most recent prior daily interference check for the FLOW monitor used during the
current hour.
Specifications:
Set OnlineDailylntRecord = null
Set OfflineDailylntRecord = null.
Set DailylntStatusResult = null
Locate the latest record in DailyIntCheckRecordsByLocationForQAStatus for the location:
a) Date/Hour is on or prior to the Current MHVRecord.Date/Hour
b) ComponentID is equal to the Current MHV Record. Component ID AND
c) TestResultCd is not equal to "IGNORED" //Ignored indicates an offline test
if (DailyIntCheckRecordsByLocationForQAStatus is found)
Set OnlineDailylntRecord = the found record in DailylntCheckRecordsByLocationForQAStatus.
If (OnlineDailylntRecord.TestResaltCd = "PASSED")
If (the number of clock hours between the OnlineDailylntRecord. EndDMc/Hour and the CurrentMHVRecord.Date/Hour
is less than 26)
Set DailylntStatusResult = "IC"
else if (OnlineDailylntRecord.7cs[Rcsu\[Cd = "FAILED")
Set DailylntStatusResult = "OOC-Test Failed"
else if (OnlineDailylntRecord.7cs[Rcsu\[Cd = "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 DailyIntCheckRecordsByLocationForQAStatus for the location where:
a) Date/Hour is on or prior to the CurrentMHVRecord.Date/Hour
b) Date/Hour/Min is after the OnlineDailylntRecord.EndD'Mc/Hour/Min
c) The ComponentID is equal to the Current MH V Record .ComponentID AND
d) TestResultCd is equal to "IGNORED"
if (DailyIntCheckRecordsByLocationForQAStatus is found
Set OfflineDailylntRecord = the found record in DailylntCheckRecordsByLocationForQAStatus.
If {DailylntStatusResult is not null)
Set DailylntStatusResult = DailylntStatusResult &
Results:
Result Response Severity
Environmental Protection Agency
Page 121 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Interference Check Status Evaluation
Environmental Protection Agency
Page 122 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: INTSTAT-2
Check Name: Determine Daily Interference Status for No Prior Check
Related Former Checks:
Applicability: CEM Check
Description: This check determines the daily inteference check status when there is no prior check.
Specifications:
If (DailyIntStatusResult is null) and (OnlineDailylntRecord is null)
/ Determine whether check in previous quarter is possibly effective for current hour.
If (the number of clock hours between the First Day of Operation/First Hour of Operation and the
CurrentMHVRecord.Date/Hour is less than 25)
Set Daily IntStatusResult = "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. Datc/Hour
c) OpTime is greater than zero.
if (HourlyOpData is found) and (the number of clock hours starting at HourlyOpData. D a tc/Hou r and up to the
hour before CurrentMHVRecord.Date/Hour is greater than 7)
Set Daily IntStatusResult = "OOC-No Prior Test".
else
Set Daily IntStatusResult = "IC-Undetermined".
else
Set Daily IntStatusResult = "OOC-No Prior Test".
If (DailyIntStatusResult begins with "OOC")
Locate the record in DailyIntCheckRecordsByLocationForQAStatus for the location where:
a) Date/Hour is on or prior to the CurrentMHVRecord.Date/Hour
b) the ComponentID is equal to the Current MH VRecord. Componcn11D AND
c) TestResultCd is equal to "IGNORED"
if (DailylntCheckRecordsByLocationForQAStatus is found)
Set OfflineDailylntRecord = the found record in DailylntCheckRecordsByLocationForQAStatus.
Set Daily IntStatusResult = Daily IntStatusResult &
Environmental Protection Agency
Page 123 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Interference Check Status Evaluation
Environmental Protection Agency
Page 124 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: INTSTAT-3
Check Name: Determine Expiration Status for Prior Daily Interference Check
Related Former Checks:
Applicability: CEM Check
Description: This check determines the daily interference status if the prior check is more than 26 hours prior to current
hour.
Specifications:
If (DailyIntStatusResult 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 OnlineDailyCalRecordDate/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. Datc/Hour and up to the hour
before CurrentMHVRecord.Date/Hour is greater than 7)
Set Daily IntStatusResult = "OOC-Expired".
else
Set Daily IntStatusResult = "IC-Grace".
else
Set Daily IntStatusResult = "OOC-Expired".
If (DailyIntStatusResult begins with "OOC" and OfflineDailylntRecord is not null)
Set Daily IntStatusResult = Daily IntStatusResult &
If (DailyIntStatusResult does not begin with "IC")
Return Daily IntStatusResult.
Environmental Protection Agency
Page 125 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
OOC-Expired
OOC-Expired*
OOC-No Prior
Test
OOC-No Prior
Test*
OOC-Test
Aborted
OOC-Test
Aborted*
OOC-Test Failed
OOC-Test
Failed*
OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*
Response
The prior daily interference check for [compkey] completed on [date] expired.
The prior daily interference check for [compkey] completed on [date] expired. A daily
interference check completed on [invdate] was ignored because it was completed while
the unit was offline.
You did not report a prior daily interference check for [compkey] during the reporting
period. Any daily interference check that may have been completed in a prior
reporting period has expired.
You did not report a prior daily interference check for [compkey] during the reporting
period. Any daily interference check that may have been completed in a prior
reporting period has expired. A daily interference check completed on [invdate] was
ignored because it was completed while the unit was offline.
The prior daily interference check for [compkey] completed on [date] was aborted.
The prior daily interference check for [compkey] completed on [date] was aborted. An
daily interference check completed on [invdate] was ignored because it was performed
while the unit was offline.
The prior daily interference check for [compkey] completed on [date] failed.
The prior daily interference check for [compkey] completed on [date] failed. An daily
interference check completed on [invdate] was ignored because it was performed while
the unit was offline.
The prior daily interference check for [compkey] completed on [date] has critical
errors.
The prior daily interference check for [compkey] completed on [date] has critical
errors. An daily interference check completed on [invdate] was ignored because it was
performed while the unit was offline.
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
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Daily Interference Check Status Evaluation
Environmental Protection Agency
Page 126 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Daily Test
Environmental Protection Agency
Page 127 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMTEST-1
Check Name: Daily Test Date Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily emission test:
Set EM Test Date Valid to true.
If Date is null,
set EM Test Date Valid to false, and return result A.
If Date is before 01/01/1993 or after the end of the Current Reporting Period,
set EM Test Date Valid to false, and return result B.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Fatal
B You reported a [Fieldname] of [Date], which is outside the range of acceptable values Critical Error Level 1
for this date for [key].
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
2 Process/Category: Emissions Data Evaluation Report Miscellaneous Emission File Test
Environmental Protection Agency
Page 128 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMTEST-2
Check Name: Daily Test Hour Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily emission test:
Set EM Test Hour Valid to true.
If Hour is null,
Set EM Test Hour Valid to false, and return result A.
If Hour is not between 0 and 23,
Set EM Test Hour Valid to false, and return result B.
Results:
Result
A
B
Usage:
1
Response Severity
You did not provide [fieldname], which is required for [key]. Fatal
You reported a [Fieldname] of [Hour], which is outside the range of acceptable values Critical Error Level 1
for this hour for [key].
Process/Category:
Process/Category:
Emissions Data Evaluation Report ¦
Emissions Data Evaluation Report ¦
¦ Daily Calibration Test
¦ Miscellaneous Emission File Test
Environmental Protection Agency
Page 129 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMTEST-3
Check Name: Daily Test Minute Valid
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
For the daily emission test:
Set EM Test Minute Valid to true.
If Minute is null,
If (Legacy Data Evaluation == false)
set EM Test Minute Valid to false, and return result A.
Otherwise,
return result B.
If Minute is not between 0 and 59,
set EM Test Minute Valid to false, and return result C.
Results:
Severity
Fatal
Informational Message
Critical Error Level 1
2 Process/Category: Emissions Data Evaluation Report Miscellaneous Emission File Test
Result Response
A You did not provide [fieldname], which is required for [key].
B You did not provide [fieldname] for [key]. This information will be required for
ECMPS submissions.
C You reported a [Fieldname] of [Minute] for [key], which is outside the range of
acceptable values.
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
Environmental Protection Agency
Page 130 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
EMTEST-4
Check Name:
Daily Test System or Component Valid
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
For the daily test:
If both the MonitoringSystemID and ComponentID are not null,
return result A.
If TestTypeCode is equal to "INTCHK",
If ComponentID is null,
return result B.
If the ComponentTypeCode of the associated component is not equal to "FLOW",
return result C.
If TestTypeCode is equal to "PEMSCAL",
If MonitoringSystemID is null,
return result D.
If the SystemTypeCode of the associated system is not equal to "NOXP",
return result E.
Results:
Result
A
Response
You have reported both a MonitoringSystemID and a ComponentID for [key]. This is
invalid.
You did not provide [fieldname], which is required for [key].
The ComponentTypeCode for [key] is not appropriate for this type of test.
You did not provide a MonitoringSystemID for [key], which is required for this test
type.
The SystemTypeCode of the system for [key] is not appropriate for this type of test.
Severity
Critical Error Level 1
B
C
D
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
E
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Daily Calibration Test
2 Process/Category: Emissions Data Evaluation Report Miscellaneous Emission File Test
Environmental Protection Agency
Page 131 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMTEST-5
Check Name: Daily Test Span Scale Valid
Related Former Checks:
Applicability: CEM Check
Description: This check determines whether the reported span scale is valid and consistent with the current analyzer range
of the component.
Specifications:
For the daily test:
If the SpanScaleCode is not null,
return result A.
Results:
Result Response Severity
A You reported [fieldname] for [key], which is not appropriate for this test type. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Miscellaneous Emission File Test
Environmental Protection Agency
Page 132 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMTEST-6
Check Name: Daily Test Result Code Valid
Related Former Checks:
Applicability: General Check
Description:
Specifications:
For the daily test:
Set EM Test Calc Result to null.
If TestResultCode is null,
return result A.
else if TestResultCode is not equal to "ABORTED", "PASSED", or "FAILED",
return result B.
else
Set EM Test Calc Result to TestResultCode.
if TestTypeCode is equal to "INTCHK" and EM Test Date Valid and EM Test Hour Valid and OpTime is equal to 0,
Set Ignored Daily Interference Tests to true.
Set EM Test Calc Result to "IGNORED".
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
B You reported the value [value], which is not in the list of valid values for this test type, Critical Error Level 1
in the field [fieldname] for [key].
Usage:
1 Process/Category: Emissions Data Evaluation Report Miscellaneous Emission File Test
Environmental Protection Agency
Page 133 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
EM Weekly System Integrity Test
Environmental Protection Agency
Page 134 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-1
Check Name: Check Hg Converter Indicator of the Component
Related Former Checks:
Applicability:
Description: Ensures that the Hg Convert Indicator of the component associated with the test is set to 1.
Specifications:
If (Current Weekly System Integrity Test .HgConverterlndicator is NOT equal to 1)
Set Weekly TestSummary Valid to false,
return result A.
Results:
Result Response Severity
A For [key] you reported a HgConverterlndicator that is not equal to I, which indicates Critical Error Level 1
that a Weekly System Integrity Test is not necessary.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 135 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-2
Check Name: Check Gas Level
Related Former Checks:
Applicability:
Description: Ensure that the Gas Level was reported and with a valid value.
Specifications:
For CurrentWeeklySystemlntegrifyTest
If (GasLevelCode is null)
Set Weekly TestSummary 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
A
B
C
Usage:
1
Response
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
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 136 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-3
Check Name: Check Weekly System Integrity Reference Value
Related Former Checks:
Applicability:
Description: Ensure that the Weekly System Integrity Test Reference Value was reported and with a valid value.
Specifications:
For CurrentWeeklySystemlntegrifyTest
Set InjectionReferenceValueValid to false.
If (ReferenceValue is null)
Set Weekly TestSummary 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 Response
A You did not provide a [fieldname], which is required, for [key].
B The [fieldname] value for [key] should be reported to one decimal place.
C Your reported CEM Value and/or Reference Value for [key] is less than or equal to
zero.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity T<
Seventy
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
est Evaluation
Environmental Protection Agency
Page 137 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-4
Check Name: Check Weekly System Integrity Measured Value
Related Former Checks:
Applicability:
Description: Ensure that the Weekly System Integrity Test Measured Value was reported and with a valid value.
Specifications:
For CurrentWeeklySystemlntegrifyTest
Set 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 Response
A You did not provide a [fieldname], which is required, for [key].
B The [fieldname] value for [key] should be reported to one decimal place.
C Your reported CEM Value and/or Reference Value for [key] is less than or equal to
zero.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity T<
Seventy
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
est Evaluation
Environmental Protection Agency
Page 138 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-5
Check Name: Calculate System Integrity Error and Alternate Performance Spec Indicator
Related Former Checks:
Applicability:
Description: Use the Reference and Measured Values to calculate the System Integrity Error and the Alternate Performance
Spec. Also updates the calculated Weekly Test Summary Test Result.
Specifications:
For CurrentWeeklySystemlntegrifyTest
Set CalculatedSystemlntegrityApsIndicator to null.
Set CalculatedSystemlntegrityError to null.
If (InjectionReferenceValueValid AND InjectionMeasuredValueValid)
Set PercentError to (100 * ABS(Reference Value - MeasuredValue) / Reference Value), rounded to 1 decimal place.
If (PercentError is less than or equal to 10)
Set CalculatedSystemlntegrityApsIndicator to 0.
Set CalculatedSystemlntegrityError to PercentError.
Set CalculatedWeekly TestSummaryResult to "PASSED".
Else
Set AbsoluteError to ABS(ReferenceValue - MeasuredValue), rounded to 2 decimal places.
If (AbsoluteError is less than or equal to 0.8)
Set CalculatedSystemlntegrityApsIndicator to 1.
Set CalculatedSystemlntegrityError to AbsoluteError.
Set CalculatedWeeklyTestSummaryResult to "PASSAPS".
Else
Set CalculatedSystemlntegrityApsIndicator to 0.
Set CalculatedSystemlntegrityError to PercentError.
Set CalculatedWeeklyTestSummaryResult to "FAILED".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 139 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-6
Check Name: Check Weekly System Integrity Alternative Performance Spec
Related Former Checks:
Applicability:
Description: Ensures that the APS indicator is a valid value and matches the calculate APS indicator.
Specifications:
For CurrentWeeklySystemlntegrifyTest
Set WeeklySystemlntegrityApsIsValid to false.
If (InjectionReferenceValueValid and InjectionMeasuredValueValid)
If (Apslndicator is null)
Set Weekly TestSummary Valid to false,
return result A.
Else if (Apslndicator is NOT equal to 0 OR 1)
Set Weekly TestSummary Valid to false,
return result B.
Else if (Apslndicator is NOT equal to CalculatedSystemlntegrityApsIndicator)
Set Weekly TestSummary Valid to false,
return result C.
Else
Set WeeklySystemlntegrityApsIsValid to true.
Results:
Result Response Severity
A You did not provide a [fieldname], which is required, for [key]. Critical Error Level 1
B You did not report an APSIndicator of "0" or " 1" for [key]. Critical Error Level 1
C The APSIndicator reported for [key] is inconsistent with the APSIndicator recalculated Critical Error Level 1
from the reported reference and measured values.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 140 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-7
Check Name: Check Weekly System Integrity Error
Related Former Checks:
Applicability:
Description: Ensure that the Weekly System Integrity Error was reported, has a valid value, and matches the calculated
value.
Specifications:
For CurrentWeeklySystemlntegrifyTest
Set WeeklySystemlntegrityErrorlsValid to false.
If (InjectionReferenceValueValid and InjectionMeasuredValueValid)
If (SystemlntegrityError is null)
Set Weekly TestSummary Valid to false,
return result A.
Else if (WeeklySystemlntegrityApsIsValid)
If (SystemlntegrityError is NOT rounded to one decimal place)
Set Weekly TestSummary Valid to false,
return result B.
Else if (SystemlntegrityError is NOT equal to CalculatedSystemlntegrityError)
Set Weekly TestSummary Valid to false,
return result C.
Else
Set WeeklySystemlntegrityErrorlsValid to true.
Results:
Result Response
A You did not provide a [fieldname], which is required, for [key].
B The [testtype] status for [key] could not be determined, because the OperatingTime in
at least one Hourly Operating Data records was missing or invalid.
C The [fieldname] value for [key] is inconsistent with the value of [value], recalculated
from the reported [testtype] records.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 141 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
EMWSI-8
Check Name:
Related Former Checks:
Check Weekly Test Summary Result Against Calculated Value
Applicability:
Description:
Compares the calculated test result to the reported test result.
Specifications:
If (CalculatedWeeklyTestSummaryResult is NOT null) and (Current Weekly TestSummary. Te s t Re s u 11C ode is NOT equal to
CalculatedWeeklyTestSummaryResult)
Set CalculatedWeeklyTestSummaryResult to null.
Set Weekly TestSummary Valid to false,
return result A.
Results:
Result
A
Response
For [key], the [fieldname] is not consistent with the test result recalculated from the
reported records.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 142 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-9
Check Name: Update Weekly System Integrity Dictionary Component Entry
Related Former Checks:
Applicability:
Description: Initializes a WsiTestDictionary entry for the CurrentWeeklySystemlntegrityTest Component Id if it does not
already exist.
If the LastEvaluatedTestRecord is not null and its TestDateHour is before the current hour, assign it as the
MostRecentTestRecord, and clear the operating date list and last operating date.
Finally always set the LastEvaluatedTestRecord to the CurrentWeeklySystemlntegrityTest.
Specifications:
If (WsiTestDictionary does NOT contain a key equal to Current Weekly System Integrity Test. Com po nc n t Id)
Add an entry to WsiTestDictionary for Current Weekly System Integrity Test.Com po nc n 11 d with the following fields:
a) MostRecentTestRecord
b) OperatingDateList initialized as an empty list.
For the WsiTestDictionary entry where the key is equal to Current Weekly System Integrity Test.Com po nc n t Id:
Set MostRecentTestRecord to CurrentWeeklySystemlntegrityTest.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 143 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-10
Check Name: Update Weekly System Integrity Dictionary Operating Date Information
Related Former Checks:
Applicability:
Description: Updates the OperatingDateList with the current date if it is not in the list and the current hour is an operating
hour.
Specifications:
If (CurrentOperatingUme is greater than 0)
For each entry in WsiTestDictionary:
If (MostRecentTestRecord is NOT null) AND (MostRecentTestRecord .LocationKey is equal to
CurrentMonitorLocationld)
If (MostRecentTestRecord .TestDateHour is equal to CurrentDateHour)
Set OperatingDateList to an empty list.
If (MostRecentTestRecord.TestDate is prior to CurrentDateHour) AND (OperatingDateList does NOT contain
CurrentOperatingDate)
Add CurrentOperatingDate to OperatingDateList
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Operating Dates
Environmental Protection Agency
Page 144 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWSI-11
Check Name: Ensure that Weekly System Integrity Test Occurred During an Operating Hour
Related Former Checks:
Applicability: General Check
Description: This check ensures that the Weekly System Integrity test occurred during an operating hour.
Specifications:
For CurrentWeeklySystemlntegrifyTest
If (CurrentOperatingTime is equal to 0)
Return result A
Results:
Result Response Severity
A Test [key] was performed while the unit was not operating even though [type] test are Critical Error Level 1
only allowed during operating hours.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 145 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
EM Weekly Test Summary
Environmental Protection Agency
Page 146 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-1
Check Name: Initialize Parameters
Related Former Checks:
Applicability:
Description: Initializes the updatable parameters used in weekly test summary evaluations.
Specifications:
Set Weekly TestSummary Valid to true.
Set CalculatedWeeklyTestSummaryResult to null.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 147 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-2
Check Name: Check Weekly Test Type
Related Former Checks:
Applicability:
Description: Ensures that the test type is for a weekly test.
Specifications:
For CurrentWeeklyTestSummary
If (TestTypeCode is not equal to "HGSI1"),
Set Weekly TestSummary Valid to false,
return result A.
Results:
Result Response Severity
A You reported a [testtype] in [key] that is not a valid TestTypeCode for a weekly test. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 148 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-3
Check Name: Check Weekly Test System
Related Former Checks:
Applicability:
Description: Ensures that the system identifer is either reported or not reported when expected, and if it is and should have
been reporte, that it was reported with the correct system type.
Specifications:
For CurrentWeeklyTestSummary
If (TestTypeCode is equal to "HGSI1"),
If (Systemld is NOT null),
Set Weekly TestSummary Valid to false,
return result A.
Results:
Result Response Severity
A You reported a MonitoringSystemID for [key], which is not valid for a [testtype]. Only Critical Error Level 1
a ComponentID is reported for a [testtype].
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 149 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-4
Check Name: Check Weekly Test Component
Related Former Checks:
Applicability:
Description: Ensures that the system identifer is either reported or not reported when expected, and if it is and should have
been reporte, that it was reported with the correct system type.
Specifications:
For CurrentWeeklyTestSummary
If (TestTypeCode is equal to "HGSI1")
If (Componentld is null)
Set Weekly TestSummary Valid to false,
return result A.
Else if (ComponentTypeCode is NOT equal to "HG")
Set Weekly TestSummary Valid to false,
return result B.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Critical Error Level 1
B The ComponentTypeCode for [key] is not appropriate for this type of test. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 150 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
EMWTS-5
Check Name:
Related Former Checks:
Check Weekly Test Date
Applicability:
Description:
Ensures that an date was reported for the weekly test and that the value reported is valid.
Specifications:
For CurrentWeeklyTestSummary
Set TestDateValid to false.
If (TestDate is null)
Set Weekly TestSummary 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
A
B
Response
You did not provide a [fieldname], which is required, for [key].
You reported a [Fieldname] of [Date], which is outside the range of acceptable values
for this date for [key].
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 151 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-6
Check Name: Check Weekly Test Hour
Related Former Checks:
Applicability:
Description: Ensures that an hour was reported for the weekly test and that the value reported is valid.
Specifications:
For CurrentWeeklyTestSummary
Set TestHourValid to false.
If (TestHour is null)
Set Weekly TestSummary 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 Response
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].
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Seventy
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 152 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-7
Check Name: Check Weekly Test Minute
Related Former Checks:
Applicability:
Description: Ensures that a minute was reported for the weekly test and that the value reported is valid.
Specifications:
For CurrentWeeklyTestSummary
Set TestDateTimeValid to false.
If (TestMinute is null)
Set Weekly TestSummary 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 (TestHour Valid)
Set TestDateTimeValid to true.
Results:
Result Response
A You did not provide a [fieldname], which is required, for [key].
B You reported a [Fieldname] of [Minute] for [key], which is outside the range of
acceptable values.
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Seventy
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 153 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: EMWTS-8
Check Name: Check Weekly Test Span Scale
Related Former Checks:
Applicability:
Description: Ensure that the Weekly Test Gas Level was reported and with a valid value.
Specifications:
For CurrentWeeklyTestSummary
If (SpanScaleCode is null)
Set Weekly TestSummary 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
A
B
C
Response
You did not provide a [fieldname], which is required, for [key].
For [key], you reported a SpanScaleCode that in not an appropriate code for a
[testtype].
For [key], you reported a SpanScaleCode that in not an appropriate code for a
[testtype].
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 154 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
EMWTS-9
Check Name:
Related Former Checks:
Check Weekly Test Result
Applicability:
Description:
Ensure that the Weekly Test Result was reported and with a valid value.
Specifications:
For CurrentWeeklyTestSummary
Set TestResultValid = false.
If (TestResultCode is null)
Set Weekly TestSummary 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
A
B
Response
You did not provide a [fieldname], which is required, for [key].
You reported the value [value], which is not in the list of valid values for this test type,
in the field [fieldname] for [key].
You reported the value [value], which is not in the list of valid values for this test type,
in the field [fieldname] for [key].
Severity
Critical Error Level 1
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Weekly System Integrity Test Evaluation
Environmental Protection Agency
Page 155 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Flow-to-Load Status
Environmental Protection Agency
Page 156 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: F2LSTAT-1
Check Name: Determine Most Recent Flow-to-Load QA Operating Quarter
Related Former Checks:
Applicability:
Description: This check finds the most recent QA operating quarter for flow-to-load checks.
Specifications:
Set F2LStatusPriorTestRequiredQuarter = null.
Set F2LStatusPriorTestRequiredQuarterMissingOpData = null.
If F2LStatusSystemResultDictionary does not contain lookup value for CurrentMh vRecord. System ID
Locate the most recent record in RataTestRecordsByLocationForOaStatus w here the SystemID is equal to
CurrentMh v Record. System ID. 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 OperatingSuppDataRecordsBy Location where OpTypeCode is equal to
"OSHOURS", FuelCode is null, and reporting period equals the quarter being checked
If OperatingSuppDataRecordsByLocation record is found
If F2LStatusPriorTestRequiredQuarter does not equal -1
If ()peratingSuppl)ataRecordsIiyLocation.OpVa 1 lie >= 168
Locate a record in F2LCheckRecordsForQaStatus where SystemID is equal to
CurrentMh v Record. System ID. the quarter is equal to the quarter being checked,
and TestResultCode is equal to "EXC168H" or "FEW168H"
If not found
Set F2LStatusPriorTestRequiredQuarter.Year = The year value of the
quarter being checked.
Set F2LStatusPriorTestRequiredQuarter:Quarter = The quarter value
of the quarter being checked.
Exit the check.
Else
Set F2LStatusPriorTestRequiredQuarter = -1.
Append "[YEAR]Q[QTR]" to F2LStatusPriorTestRequiredQuarterMissingOpData (where
Environmental Protection Agency
Page 157 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
[YEAR] and [QTR are the year and number of the quarter being checked.
Else
Set F2LStatusPriorTestRequiredQuarter = -1.
Set F2LStatusPriorTestRequiredQuarterMissingOpData = "No Prior RATA"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 158 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: F2LSTAT-2
Check Name: Locate Most Recent Flow-to-Load Check Prior to the Current Hour
Related Former Checks:
Applicability:
Description: This check locates the most recent passed or failed flow-to-load (F2L) check for the emission report, insures
that quarters between the quarter of the check and the emission report quarter were either not QA operating
quarters (less than 168 operating hours) or have an F2L with a result of EXC168H, indicating that the
operating hours minus exluded hours is less than 168.
If the check exist but an intervening quarter with more than 168 operating hours (excluding EXC168H) exists,
or a check does not exist a parameter indicating the ultimate result is set. If the check does not exist and the a
non load based unit is involved (directly or indirectly) or a Flow-to-Load exemption exist, then the result is
IC-Exempt. If a RATA exists in the prior quarter then the result is OOC-No Prior Check, and if it does not
then IC-No Prior RATA.
Specifications:
If F2LStatusSystemResultDictionary contains lookup value for CurrentMh vRecord. System ID
Set F2LStatusResult = F2LStatusSystemResultDictionary lookup value for CurrentMhvRecord. SystemlD.
Set CurrentFlowToLoadStatusCheck = F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord.SystemlD.
Set F2LStatusMissingOpDataInfo = F2lStatusSystemMissingOpDictionary lookup value for CurrentMhvRecord.SystemlD.
Else
Set F2LStatusResult = null.
Set CurrentFlowToLoadStatusCheck = null.
Set F2LStatusMissingOpDataInfo = null.
Locate the most recent record in F2LCheckRecordsForQaStatus where SystemlD is equal to CurrentMh v Record. System ID.
EndDate < CurrentReportingPeriodBeginDateHour, and TestResultCode is equal to "PASSED" or "FAILED"
If not found
Locate a record in MpLocationNonLoadBasedRecords where the location is the location in CurrentMhvRecord.
If found, and NonLoadBaselnd equals 1
Set F2LStatusResuh = "IC-Exempt".
Else
Locate a record in TestExtensionExemptionRecords where the SystemlD is equal to the
CurrentMh v Record. System ID. the ExtensionExemptionCode is equal to "F2LEXP", and the reporting period is
the period before the current reporting period.
If found
Set F2LStatusResuh = "IC-Exempt".
Else
Locate the most recent record in RataTeslRecordsIiy Location ForOaStatus w here the SystemlD is equal
to CurrentMhvRecord. SystemlD, EndDate < CurrentReportingPeriodBeginDateHour, and
TestResultCode is not equal to "INVALID"
If not found
Environmental Protection Agency
Page 159 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set F2LStatusResult = "IC-No Prior RATA".
Else if F2LStatusPriorTestRequiredQuarter is equal to -1
Set F2LStatusResuh = 'Missing Op Data".
Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData.
Else if F2LStatusPriorTestRequiredQuarter is null or before the quarter of the located
Rata TestRecordsByLocationForQaStatus record
Set F2LStatusResult = "IC".
Else if the quarter of the located RataTestRecordsByLocationForQaStatus record is the quarter before
CurrentReportingPeriod, the TestReasonCode equals "INITIAL" or "RECERT" and TestResultCode
equals "PASSED"
Set F2LStatusResult = "IC".
Else if CurrentMhvRecorcl.SyslcmDcslgmUonCodc is equal to "RB"
Set F2LStatusResult = "Undetermined-No Prior Check reported for Redundant Backup
Monitor".
Else
Set F2LStatusResult = "OOC-Prior Check Missing".
Else
Set CurrentFlowToLoadStatusCheck = the located F2LCheckRecordsForQaStatus record.
If the quarter of CurrentFlowToLoadStatusCheck is not the quarter before CurrentReportingPeriod
If F2LStatusPriorTestRequiredQuarter is equal to -1
Set F2LStatusResuh = 'Missing Op Data".
Set F2LStatusMissingOpDataInfo = F2LStatusPriotTestRequiredQuarterMissingOpData.
Else if F2LStatusPriorTestRequiredQuarter is not null, and is after the quarter of
CurrentFlowToLoadStatusCheck
if CurrentMhvRecord.SyslcmDcsigmxUonCodc 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.TQStResultCode= "PASSED"
Set F2LStatusResult = "IC".
Else
Environmental Protection Agency
Page 160 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If CurrentFlowToLoadStatusCheck.TesiResultCode = "PASSED"
Set F2LStatusResult = "IC".
Set F2LStatusSystemResultDictionary lookup value for CurrentMhvRecord. SystemID = F2LStatusResu1t.
Set F2LStatusSystemCheckDictionary lookup value for CurrentMhvRecord. SystemID = CurrentFlowToLoadStatusCheck.
Set F2lStatusSystemMissingOpDictionary lookup value for CurrentMhvRecord. SystemID = F2LStatusMissingOpDataInfo.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 161 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
F2LSTAT-3
Check Name:
Related Former Checks:
Locate Intervening RATA
Applicability:
Description:
This check locates RATA that occurred after the quarter of the (failed) most recent prior flow-to-load check
and prior to the current hour.
Specifications:
Set F2LStatusInterveningRata = null.
If F2LStatusResult is null
Locate the most recent record in RataTeslRecordsIiy Location ForOaStatus w here the SystemID is equal to
CurrentMh v Record. System ID. EndDateHour is after CurrentFlowToI.oadStatusCheck.EndDalcHour and before
CurrentMh vRecord. Begi nDatc/Begi nHoiir. and TestResultCode is not equal to "INVALID"
If found,
Set F2LStatusResult = "IC-Subsequent RATA Performed".
Set F2LStatusInterveningRata = The located record in RataTestRecordsByLocationForQaStatus.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 162 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: F2LSTAT-4
Check Name: Locate Most Recent QA Cert Event
Related Former Checks:
Applicability:
Description: This check locates Abbreviated Flow-to-Load that occurred after the quarter of the (failed) most recent prior
Flow-to-Load check and prior to the current hour.
Validation Tables:
[Test Type to Required Test Code] (Cross Check Table)
Specifications:
Set F2LStatusQaCertEvent = null.
Set F2L Status Event Requires RATA = false.
Set F2L Status Event Requires Abbreviated Check = false.
If F2LStatusResult is null
Locate the most recent record in QACertificationEventRecords where the SystemID is equal to CurrentMh v Record. System ID.
QaCertEventCode is equal to "312", QaCertEventDateHour is on or after CurrentFlowToLoadStatusCheck.EndD'dlcHour. and
QaCertEventDateHour is on or before CurrentMh vRecord. Begi nDatc/Bcgi nHour.
If found,
Set F2LStatusQaCertEvent = The located record in QACertificationEventRecords.
Locate a record in Cross-Check Table "Test Type to Required Test Code" where TestTypeCode begins with "RATA" and
RequireTestCode equals F2LStatusQaCertEvent. Rcqui rcdTcstCodc.
If found,
F2L Status Event Requires 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. Rcqui rcdTcstCodc.
If found,
F2L Status Event Requires Abbreviated Check = true.
If F2/.StatusOaCertEve/rf. L a s t Tc s t C o m p 1 c t cd D a t c H our is on or before CurrentMh vRecord. Begi nDatc/Bcgi nHoiir
If F2L Status Event Requires Abbreviated Check is equal to true,
Set F2LStatusResult = "IC-Subsequent Abbreviated Flow-to-Load Check Passed".
If F2LStatusResult is null,
If F2LStatusQaCertEvent = null, or F2 /. StatusOa CertE vent. C o n d i t i o n a 1D a t a B eg i n D a t c H o u r i s after
CurrentMh vRecord. Begi nDatc/Bcgi nHour.
Locate records in RataTestRecordsByLocationForQaStatus where the SystemID is null or is equal to
CurrentMh v Record. System ID. EndDateHour is after CurrentFlowToLoadStatusCheck.EndD'dlcHour and before
CurrentMh v Record. Begi nDatc/Bcgi nHour. and TestResultCode is equal to "INVALID".
If found
Environmental Protection Agency
Page 163 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Set F2LStatusResult = "OOC-Check Failed - Invalid RATA Ignored".
Else
Set F2LStatusResult = "OOC-Check Failed".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 164 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: F2LSTAT-5
Check Name: Locate Earliest Valid Required Test
Related Former Checks:
Applicability:
Description: This check locates the earliest RATA test if the most recent event had a Require Test Code of '5' or '6', or the
earliest Abbreviated F2L if the Required Test Code is '26'. If the test was found and it failed the F2L status is
OOC, but for RATA the OOC status depends on the existence of an intervening invalid RATA.
If the test does not exist or did not fail, the F2L is IC if the number of operating hours is less than or equal to
720 for RATA and 168 for other tests. Otherwise the status is OOC, with the RATA OOC value depending on
whether an intevening invalid RATA exists.
Specifications:
Set F2lStatusEarliestValidRequiredTest = null.
If F2LStatusResult is null
If F2L Status Event Requires RATA is true,
Locate earliest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh v Record. System ID. EndDateHour is after CurrentMh v Record. Begi nDate/Begi nHoiir. and TestResultCode is
not equal to "INVALID".
If found,
Set F2LStatusEarliestValidRequiredTest = The located record in RataTestRecordsByLocationForQaStatus.
If F2LStatusEarliestValidRequiredTest .TestResultCode is equal to "FAILED"
Locate records in RataTestRecordsIiy Location ForOaStatus w here the SystemID is equal to
CurrentMh v Record. System ID. EndDateHour is after F2 LStatusOaCertEvent .Qi\C.cr{E\cn{Di\{cY{om imd
before F2LStatusEarliestValidRequiredTest.EndDMcHour. and TestResultCode is equal to "INVALID".
If found
Set F2LStatusResult = "OOC-Recertification RATA Failed - Invalid RATA Ignored".
Else
Set F2LStatusResult = "OOC-Recertification RATA Failed".
Else if F2L Status Event Requires Abbreviated Check is false,
Set F2LStatusResult = "OOC-Invalid Cert Event".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 165 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
F2LSTAT-6
Check Name:
Related Former Checks:
Determine Event Conditional Status and Final Status
Applicability:
Description:
This check determines the status result when a QA Cert Event Conditional Data Period is involved.
Additionally, the check sets the final result for the Flow-to-Load Status checks.
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 F2 /. StatusOa CertEve/rf. C o n d i t i o n a 1B eg i n D a t c is equal to the quarter of the CurrentMhvRecord Date/Hour)
Count the number of HourlyOpData records for the location where OpTime is greater than 0 and Date/Hour is ON OR
AFTER the Conditional Begin Date/Hour and ON OR BEFORE CurrentMhvRecord Date/Hour,
If the number > OperatingHourLimit,
Set F2LStatusResuh = "OOC-Conditional Period Expired".
else
Set F2LStatusResuh = "IC-Conditional".
if (F2 LStatusOaCertEvent. IVT i nOpHoursPriorQuartcr is null)
Set F2 LStatusOaCertEvent. IVT i nOpHoursPriorQuartcr = 0
Set F2LStatusOaCertEventMi\xO$Y{ouxsVx\oxQ\ii\x\cx = 0
for each quarter beginning with the quarter of the F2 /. StatusOa CertEve/rf. C o n d i t i o n a 1B eg i n D a t c and continuing
through the quarter BEFORE the CurrentMhvRecord Date/Hour :
else
if (EarliestLocationReportDate <= the last day of the quarter being checked)
if {Annual Reporting Requirement == false AND the quarter being checked == 2)
Locate the record in OperatingSuppDataRecordsbyLocation where the OpTypeCode is
equal to "OSHOURS" and the reporting period is equal to the quarter being checked.
else
Locate the record in OperatingSuppDataRecordsbyLocation where the OpTypeCode is
equal to "OPHOURS", FuelCode is null, and the reporting period is equal to the quarter
Environmental Protection Agency
Page 166 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
being checked,
if (OperatingSuppDataRecordsbyLocation is not found)
Set F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr = -1
Append" [YEAR] Q[QTR]" to F2L Status Missing Op Data Info (where [YEAR] is the
year of the quarter being checked and [QTR] is the number of the quarter being
checked.)
exit for.
If the quarter being checked is the quarter of the
F2/^Y«?M.v(>rtC.'6'/*?£V677?. Conditional BcginDatc
If ((iperatingSuppDataRecordsbyLocation.Op Va 1 lie MINUS the number of
calendar hours in the quarter being checked that are PRIOR to the
Conditional Begin Date/Hour > 0)
Set F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr =
(iperatingSuppDataRecordsbyL ocation. O p Va 1 lie MINUS the number
of calendar hours in the quarter being checked that are PRIOR to the
Conditional BeginDate/Hour
If ((iperatingSuppDataRecordsbyL ocation. O p Va 1 lie is less than the number of
calendar hours in the quarter begin checked that are ON OR AFTER the
F2/..Sy«?M.v(>c/C.'6'/*?£'v'6'rt?. Conditional BeginDate/Hour)
Set F2IStatus(2aCertEventM'c\\0\~>HoyKS?norQu'c\Y{cr =
(iperatingSuppDataRecordsbyL ocation. O p Va 1 lie.
else
Set F2IStatus(2aCertEventM'c\\0\~>HoyKS?norQu'c\Y{cr = the number of
calendar hours in the quarter being checked that are ON OR AFTER the
F2/..Sy«?M.v(>c/C.'6'/*?£'v'6'rt?. Conditional BeginDatc/Hour.
else
Set F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr =
F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr +
(iperatingSuppDataRecordsbyL ocation. O p Va 1 lie.
Set F2/. StatusOaCertEvent. IVT a \Op Hours PriorQuarter =
F2/^Y«?w\(>rtC'6'/*?£V6'M?.IVIa\OpHoiirsPriorQiiartcr +
(iperatingSuppDataRecordsbyL ocation. O p Va 1 lie.
If (F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr == -1)
set F2LStatusResult to "Missing Op Data"
Else if (F2LStatus(iaCertEvent. IVT i nOpHoursPriorQuartcr > OperatingHourLimit)
If F2L Status Event Requires RATA is true,
Locate records in RataTestRecordsByLocatiionForOaStatus w here the SystemID is equal to
CurrentMh v Record. System ID. EndDateHour is on or after
Environmental Protection Agency
Page 167 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
F2/..Sy«?M.v(>c/C.'6'/*?£'v'6'rt?. Conditional DataBeginDatc/Conditional Data Begin Hour and on or before
CurrentMhvRecord.BcginDatc/BcginHoiir. and TestResultCode is equal to "INVALID".
If found,
Set F2LStatusResuh = "OOC-Conditional Period Expired-Invalid RATA Ignored".
Else
Set F2LStatusResuh = "OOC-Conditional Period Expired".
Else
Set F2LStatusResuh = "OOC-Conditional Period Expired".
Else if (Rpt Period Op Hours Accumulator Array for the location == -1)
Set F2LStatusResuh = "Invalid Op Data".
Else if (F2 LStatusOaCertEvent. IVT i nOpHoursPriorQuartcr + Rpt Period Op Hours Accumulator Array for the Location >
OperatingHourLimit)
If F2L Status Event Requires RATA is true,
Locate records in RataTestRecordsIiy Location ForOaStatus w here the SystemID is equal to
CurrentMh v Record. System ID. EndDateHour is on or after
F2/..Sy«?M.v(>c/C.'6'/*?£'v'6'rt?. Conditional Data Bcgi nDate/Conditional Data Bcgi nHoiir and on or before
CurrentMh v Record. Bcgi nDatc/Bcgi nHoiir. and TestResultCode is equal to "INVALID".
If found,
Set F2LStatusResult = "OOC-Conditional Period Expired-Invalid RATA Ignored".
Else
Set F2LStatusResult = "OOC-Conditional Period Expired".
Else
Set F2LStatusResult = "OOC-Conditional Period Expired".
Else if (F2LStatusOaCertEventMnxOpHoursPnorQirMcr + Rpt Period Op Hours Accumulator Array for the Location
> OperatingHourLimit)
Set F2LStatusResult = "Undetermined-Conditional Data".
Else
Set F2LStatusResult = "IC-Conditional".
If (FlowToLoadStatusResult does not begin with "IC")
Return result F2LStatusResult.
Environmental Protection Agency
Page 168 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Invalid Op Data
Missing Op Data
OOC-Check
Failed
OOC-Check
Failed - Invalid
RATA Ignored
OOC-Conditional
Period Expired
OOC-Conditional
Period
Expired-Invalid
RATA Ignored
OOC-Invalid
Cert Event
OOC-Prior
Check Missing
OOC-Recertificat
ion RATA Failed
OOC-Recertificat
ion RATA Failed
- Invalid RATA
Ignored
Undetermined-C
onditional Data
Undetermined-N
o Prior Check
reported for
Redundant
Backup Monitor
Response
The Flow-to-Load status for [SYSID] could not be determined, because the
OperatingTime in at least one Hourly Operating Data records was missing or invalid.
The Flow-to-Load status for [SYSID] could not be determined, because the Op Supp
Data record for OPHOURS, OSHOURS, or OPDAYS is missing for 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.
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.
You reported an invalid QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [SYSID],
One or more Flow-to-Load Checks is missing for prior quarters.
The subsequent recertification RATA for SystemID [SYSID] with TestNumber
[subtestnum] failed.
The subsequent recertification RATA for SystemID [SYSID] with TestNumber
[subtestnum] failed. An invalid RATA was ignored.
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for SystemID
[eventkey].
The software could not determine if a Flow-to-Load check is required for the
Redundant Backup Flow Monitor.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Flow-to-Load Status Evaluation
Environmental Protection Agency
Page 169 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Aggregation
Environmental Protection Agency
Page 170 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-1
Check Name: Determine Start Quarter
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Set Start Quarter to null.
Set SO2 Start Quarter to null.
Set NOXR Start Quarter to null.
Set CO 2 Start Quarter to null.
Set Heat Input Start Quarter to null.
Set NOXStart Quarter to null.
Set Emissions Tolerance Deviators to null.
If (Quarter of the Current Reporting Period is greater than 1)
Locate the earliest Monitor Method for location where BeginDate is on or before the last day of the Current Reporting Period,
and EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.
If found,
If BeginDate is in a year prior to the current reporting period,
If {Annual Reporting Requirement == true)
Set Start Quarter to 1.
else
Set Start Quarter to 2.
else
Set Start Quarter to the quarter of the BeginDate.
Locate the earliest Monitor Method for location where ParameterCode = "S02" or "S02M", BeginDate is on or before the last day
of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.
If found,
If BeginDate is in a year prior to the current reporting period,
Set SO2 Start Quarter to 1.
else
Set SO2 Start Quarter to the quarter of the BeginDate.
If (LMEAnnual == true)
Locate the record for the location with the earliest Quarter in NOXR Summary Required for LME Annual Records
where LmeNoxrSummarylndicator is equal to 1.
if found,
Set EarliestMethodBeginDate to the date from LmeNoxrBegin for the located record in NOXR Summary
Requiredfor LME Annual Records.
else
Set EarliestMethodBeginDate to null.
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
Environmental Protection Agency
Page 171 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate the earliest Monitor Method for ALL locations in the monitor plan where ParameterCode = "NOXR",
BeginDate is on or before the last day of the Current Reporting Period, and EndDate is null or is on or after Jan
1 of the year of the Current Reporting Period.
if found,
Set EarliestMethodBeginDate to the BeginDate for the located record in Monitor Method.
else
Set EarliestMethodBeginDate to null.
If EarliestMethodBeginDate is NOT null,
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 EarliestMethodBeginDate 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 EarliestMethodBeginDate and
UnitMonitorCertBeginDate.
Otherwise,
If the later of EarliestMethodBeginDate 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 EarliestMethodBeginDate and
EmissionsRecordingBeginDate.
Locate the earliest Monitor Method for location where ParameterCode = "C02" or "C02M", BeginDate is on or before the last
day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting Period.
If found,
If BeginDate is in a year prior to the current reporting period,
Set CO2 Start Quarter to 1.
else
Set CO2 Start Quarter to the quarter of the BeginDate.
If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the Quarter of the
Current Reporting Period is equal to 2))
Locate the earliest Monitor Method for location where ParameterCode = "HI" or "HIT", MethodCode is not equal to "EXP",
BeginDate is on or before the last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of
the Current Reporting Period.
If found,
If BeginDate is in a year prior to the Current Reporting Period,
If Annual Reporting Requirement == true
Set Heat Input Start Quarter to 1
else
Set Heat Input Start Quarter to 2
Environmental Protection Agency
Page 172 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if BeginDate is in Quarter 1 of the year of the Current Reporting Period AND Annual Reporting Requirement ==
false,
Set Heat Input Start Quarter to to 2
else
Set Heat Input Start Quarter to the quarter of the BeginDate.
Locate the earliest Monitor Method for location where ParameterCode is equal to "NOX" or "NOXM", BeginDate is on or before
the last day of the Current Reporting Period, and EndDate is null or is on or after Jan 1 of the year of the Current Reporting
Period.
If found,
If BeginDate is in a year prior to the Current Reporting Period,
If Annual Reporting Requirement == true
Set NOX Start Quarter to 1
else
Set NOX Start Quarter to 2
else if BeginDate is in Quarter 1 of the year of the Current Reporting Period AND Annual Reporting Requirement ==
false,
Set NOX Start Quarter to to 2
else
Set NOX Start Quarter to the quarter of the BeginDate.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 173 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-2
Check Name: Compare S02 Mass Accumulator Values
Related Former Checks: HOURCV-22
Applicability: General Check
Description: This check compares the accumulator reported S02 Mass with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
S02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "S02M" AND
UOM = "TON"
Current S02 Summary Value Record = Summary Value record at this location where
Parameter = "S02M" AND
Reporting Period ID = Current Reporting Period
if (Rpt Period S02 Mass Calculated Accumulator Array for this location == -1 OR Expected Summary Value S02 Array for this location
== false)
Rpt Period S02 Mass Calculated Value = null
else
Rpt Period S02 Mass Calculated Value = {Rpt Period S02 Mass Calculated Accumulator Array for this location / 2000, and
rounded to one decimal place).
if {Rpt Period S02 Mass Reported Accumulator Array for this location >= 0)
Rpt Period S02 Mass Reported Accumulator Array for this location = {Rpt Period S02 Mass Reported Accumulator Array for
this location/ 2000, and rounded to one decimal place).
if {Current S02 Summary Value Record is null OR Current S02 Summary Value Record.Current Reporting Period Total is null)
if {Expected Summary Value S02 Array for this location == true)
return result C
else
if {Expected Summary Value S02 Array for this location == false)
if {Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current S02 Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D
else
S02 Mass Quarterly Reported Value = Current S02 Summary Value Record. Current Reporting Period Total
if (S02 Mass Quarterly Reported Value < 0)
return result F
else if (S02 Mass Quarterly Reported Value is not rounded to one decimal place)
return result G
else if {Rpt Period S02 Mass Calculated Value is not null)
If {Rpt Period S02 Mass Calculated Value <> S02 Mass Quarterly Reported Value)
if (ABS{Rpt Period S02 Mass Calculated Value - S02 Mass Quarterly Reported Value) > S02 Mass
Quarterly Tolerance)
return Result A
else
Environmental Protection Agency
Page 174 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
append "S02M" to Emissions Tolerance Deviators.
else
return result E
// if no result
if (Rpt Period S02 Mass Reported Accumulator Array for this location >= 0 AND ABS {Rpt Period S02 Mass Reported
Accumulator Array for this location - S02 Mass Quarterly Reported Value) > S02 Mass Quarterly Tolerance)
Reported Emissions Value = Rpt Period S02 Mass Reported Accumulator Array for this location
return result B
Results:
Result
A
B
C
D
E
F
G
Usage:
1
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for S02M for the reporting period is inconsistent with the recalculated value of
[calcval].
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for S02M is inconsistent with [sum], the sum of the hourly values reported in the DHV
records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for S02M is missing
or the record is missing.
You reported a value as the CurrentReportingPeriodTotal in the Summary Value record
for S02M, but there were no Hourly Operating Data records or appropriate S02
Methods defined in your monitoring plan.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Process/Category: 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 175 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-3
Check Name: Compare C02 Mass Accumulator Values
Related Former Checks: HOURCV-23
Applicability: General Check
Description: This check compares the accumulator reported C02 Mass with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
If Current Reporting Period Year is greater than or equal to 2012
C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"
else
C02 Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M-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 C02 Mass Reported Accumulator Array for this location >= 0)
Rpt Period C02 Mass Reported Accumulator Array for this location = (Rpt Period C02 Mass Reported Accumulator Array for
this location, rounded to one decimal place).
if (Current C02 Summary Value Record is null OR Current C02 Summary Value Record Current Reporting Period Total is null)
if (Expected Summary Value C02 Array for this location == true)
return result C
else
if (Expected Summary Value C02 Array for this location == false)
if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current C02 Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D
else
C02 Mass Quarterly Reported Value = Current C02 Summary Value Record. 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)
Environmental Protection Agency
Page 176 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return Result A
else
append "C02M" to Emissions Tolerance Deviators.
else
if (Rpt Period C02 Mass Calculated Accumulator Array for this location == -1)
return result E
// if no result
if {Rpt Period C02 Mass Reported Accumulator Array for this location >= 0 AND ABS {Rpt Period C02 Mass Reported
Accumulator Array for this location - C02 Mass Quarterly Reported Value) > C02 Mass Quarterly Tolerance)
Reported Emissions Value = Rpt Period C02 Mass Reported Accumulator Array for this location
return Result B
Results:
Result
A
B
C
D
E
F
G
Usage:
1
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for C02M for the reporting period is inconsistent with the recalculated value of
[calcval].
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for C02M is inconsistent with [sum], the sum of the hourly values reported in the
DHV records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for C02M is missing
or the record is missing.
You reported a value for the CurrentReportingPeriodTotal in the Summary Value
record for [param], but there was no emissions data in your file or an appropriate C02
Method defined in your monitoring plan.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Process/Category: 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 177 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-4
Check Name: Compare HI Accumulator Values
Related Former Checks: HOURCV-24
Applicability: General Check
Description: This check compares the accumulator reported HI with the calculated value and generates an error message if
the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
HI Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"
Current HI Summary Value Record = Summary Value record at this location where
Parameter = "HIT" AND
Reporting Period ID = Current Reporting Period
if (Rpt Period HI Calculated Accumulator Array for this location == -1 O R Expected Summary Value HI Array for this location ==
false)
Rpt Period HI Calculated Value = null
else
Rpt Period HI Calculated Value = Rpt Period HI Calculated Accumulator Array for this location, rounded to zero decimal
places.
if {Rpt Period HI Reported Accumulator Array for this location >= 0)
Rpt Period HI Reported Accumulator Array for this location = (Rpt Period HI Reported Accumulator Array for this location,
rounded to zero decimal places).
if (Current HI Summary Value Record is null OR Current HI Summary Value Record. Current Reporting Period Total is null)
if (Expected Summary Value HI Array for this location == true)
return result C
else
if (Expected Summary Value HI Array for this location == false)
if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current HI Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D
else
HI Quarterly Reported Value = Current HI Summary Value Record. Current Reporting Period Total
if (HI Quarterly Reported Value < 0)
return result F
else if (HI Quarterly Reported Value is not rounded to zero decimal places)
return result G
else if (Rpt Period HI Calculated Value is not null)
if (Rpt Period HI Calculated Value <> HI Quarterly Reported Value)
if (ABS(Rpt Period HI Calculated Value - HI Quarterly Reported Value) > HI Quarterly Tolerance)
return result A
else
append "HIT" to Emissions Tolerance Deviators.
else
return result E
Environmental Protection Agency
Page 178 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
// 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
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for HIT for the reporting period is inconsistent with the recalculated value of [calcval].
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for HIT is inconsistent with [sum], the sum of the hourly values reported in the DHV
records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for HIT is missing or
the record is missing.
You reported a value as the CurrentReportingPeriodTotal in the Summary Value record
for HIT, but there were no Hourly Operating Data records or appropriate HI Methods
defined in your monitoring plan.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Process/Category: 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 179 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-5
Check Name: Compare Op Hours Values
Related Former Checks: HOURCV-25
Applicability: General Check
Description: This check compares the accumulator reported Op Hours with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Op Hours Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPHOURS" AND
UOM = "HR"
Current Op Hours Summary Value Record = Summary Value record at this location where
Parameter = "OPHOURS" AND
Reporting Period ID = Current Reporting Period
if (Rpt Period Op Hours Accumulator Array for this location == -1 OR {LME HI Method is not null and location is a common pipe))
Rpt Period Op Hours Calculated Value = null
Rpt Period Op Days Calculated Value = null
else
Rpt Period Op Hours Calculated Value = Rpt Period Op Hours Accumulator Array for this location
Rpt Period Op Days Calculated Value = Rpt Period Op Days Accumulator Array for this location
if (Current Op Hours Summary Value Record is null OR Current Op Hours Summary Value Record.Current Reporting Period Total is
null)
If {LME HI Method is null or location is not a common pipe)
return result B
else
Op Hours Quarterly Reported Value = Current Op Hours Summary Value Record. Current Reporting Period Total
if (Op Hours Quarterly Reported Value < 0)
return result D
else if (Op Hours Quarterly Reported Value is not rounded to zero decimal places)
return result E
else if (Rpt Period Op Hours Calculated Value is not null)
if (Rpt Period Op Hours Calculated Value <> Op Hours Quarterly Reported Value)
if (ABS{Rpt Period Op Hours Calculated Value - Op Hours Quarterly Reported Value) > Op Hours Quarterly
Tolerance)
return Result A
else
append "OPHOURS" to Emissions ToleranceDeviators.
else
return result C
Environmental Protection Agency
Page 180 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for OPHOURS is inconsistent with [calcval], the number of operating hours reported in
the Hourly Operating Data records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for OPHOURS is
missing or the record is missing.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 181 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-6
Check Name: Compare Op Time Values
Related Former Checks: HOURCV-26
Applicability: General Check
Description: This check compares the accumulator reported Op Time with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Op Time Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "OPTIME" AND
UOM = "HR"
Current Op Time Summary Value Record = Summary Value record at this location where
Parameter = "OPTIME" AND
Reporting Period ID = Current Reporting Period
if (Rpt Period Op Time Accumulator Array for this location == -1 OR {LME HI Method is not null and location is a common pipe))
Rpt Period Op Time Calculated Value = null
else
Rpt Period Op Time Calculated Value = Rpt Period Op Time Accumulator Array for this location
if (Current Op Time Summary Value Record is null OR Current Op Time Summary Value Record.Current Reporting Period Total is
null)
If {LME HI Method is null or location is not a common pipe)
if (Legacy Data Evaluation == true)
return result B
else
return result E
else
Op Time Quarterly Reported Value = Current Op Time Summary Value Record. Current Reporting Period Total
if (Op Time Quarterly Reported Value >= 0)
if (Op Time Quarterly Reported Value is not rounded to two decimal places)
return result F
else
if (Rpt Period Op Time Calculated Value is not null)
if {Rpt Period Op Time Calculated Value <> Op Time Quarterly Reported Value)
if (ABS{Rpt Period Op Time Calculated Value - Op Time Quarterly Reported Value) > Op Time
Quarterly Tolerance)
return A
else
append "OPTIME" to Emissions Tolerance Deviators.
else
return result D
else
return result C
Environmental Protection Agency
Page 182 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for OPTIME is inconsistent with [calcval], the sum of the hourly values reported in the
Hourly Operating Data records for the reporting period.
You did not report a Summary Value record for OPTIME for the reporting period.
While this information was not required for legacy EDR data, it is required for
ECMPS.
The CurrentReportingPeriodTotal reported in the Summary Value record for OPTIME
is invalid. The value must be greater than or equal to 0.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal in the Summary Value record for OPTIME is
missing or the record is missing.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Informational Message
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 183 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-7
Check Name: Compare NOx Rate Accumulator Values
Related Former Checks: HOURCV-27
Applicability: General Check
Description: This check compares the accumulator reported NOx Rate with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
If (Expected Summary Value NOx Rate Array for this location == true)
if (I.ME Annual == true)
if (Rpt Period HI Calculated Value is not null and Rpt Period NOx Mass Calculated Value is not null)
If {Rpt Period NOx Mass Calculated Accumulator Array for this location = 0)
Rpt Period NOx Rate Calculated Value = 0
else
Rpt Period NOx Rate Calculated Value = Rpt Period NOx Mass Calculated Accumulator Array for this
location / Rpt Period HI Calculated Value, and round the result to three decimal places
else
Rpt Period NOx Rate Calculated Value = null
else
if {Rpt Period NOx Rate Hours Accumulator Array fox this location > 0 AND Rpt Period NOx Rate Calculated
Accumulator Array for this location >= 0)
Rpt Period NOx Rate Calculated Value = Rpt Period NOx Rate Calculated Accumulator Array for this location
/ Rpt Period NOx Rate Hours Accumulator Array for the location, and round the result to three decimal places
Rpt Period NOx Rate Sum = Rpt Period NOx Rate Calculated Accumulator Array for this location
Rpt Period NOx Rate Hours = Rpt Period NOx Rate Hours Accumulator Array for this location
else if {Rpt Period NOx Rate Hours Accumulator Array for this location == 0 AND Rpt Period NOx Rate Calculated
Accumulator Array for this location == 0)
Rpt Period NOx Rate Calculated Value = 0
Rpt Period NOx Rate Sum = 0
Rpt Period NOx Rate Hours = 0
else
Rpt Period NOx Rate Calculated Value = null
Rpt Period NOx Rate Sum = null
Rpt Period NOx Rate Hours = null
if {Rpt Period NOx Rate Hours Accumulator Array for this location > 0 AND Rpt Period NOx Rate Reported
Accumulator Array for this location >= 0)
Rpt Period NOx Rate Reported Accumulator Array for this location = Rpt Period NOx Rate Reported
Accumulator Array for this location / Rpt Period NOx Rate Hours Accumulator Array for this location, and
round the result to three decimal places
else
Rpt Period NOx Rate Reported Accumulator Array for this location = -1
else
Rpt Period NOx Rate Calculated Value = null
NOx Rate Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXR" AND
UOM = "LBMMBTU"
Current NOx Rate Summary Value Record = Summary Value record at this location where
Parameter = "NOXR" AND
Reporting Period ID = Current Reporting Period
Environmental Protection Agency
Page 184 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
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 {LMEAnnual == 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
Quarterly Tolerance)
Reported Emissions Value = Rpt Period NOx Rate Reported Accumulator Array for this
location
return Result B
Environmental Protection Agency
Page 185 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
Usage:
1
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for NOXR for the reporting period is inconsistent with the recalculated value of
[calcval].
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for NOXR is inconsistent with [average], the average of the hourly values reported in
the DHV records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for NOXR is missing
or the record is missing.
You reported a value as the CurrentReportingPeriodTotal in the Summary Value record
for NOXR, but this is not appropriate, either because there were no Hourly Operating
Data records in your emissions file, or because this value is not consistent with the unit
program records and monitoring methodologies in your monitoring plan.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
Process/Category: 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 186 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-8
Check Name: Compare NOx Mass Accumulator Values
Related Former Checks:
Applicability: General Check
Description: This check compares the accumulator reported NOx Mass with the calculated value and generates an error
message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
NOx Mass Quarterly Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "NOXM" AND
UOM = "TON"
Current NOx Mass Summary Value Record = Summary Value record at this location where
Parameter = "NOXM" AND
Reporting Period ID = Current Reporting Period
if (Rpt Period NOx Mass Calculated Accumulator Array for this location == -1 OR Expected Summary Value NOx Mass Array for this
location == false)
Rpt Period NOx Mass Calculated Value = null
else
Rpt Period NOx Mass Calculated Value = Rpt Period NOx Mass Calculated Accumulator Array for this location / 2000, and
rounded to one decimal place).
if {Rpt Period NOx Mass Reported Accumulator Array for this location >= 0)
Rpt Period NOx Mass Reported Accumulator Array for this location = Rpt Period NOx Mass Reported Accumulator Array for
this location/ 2000, and rounded to one decimal place).
if (Current NOx Mass Summary Value Record is null OR Current NOx Mass Summary Value Record.Current Reporting Period Total is
null)
if (Expected Summary Value NOxMass Array for this location == true)
return result C
else
if (Expected Summary Value NOX Array for this location == false)
if (Rpt Period Op Hours Accumulator Array for this Location is not equal to 0 OR Current NOx Mass Summary Value
Record. Current Reporting Period Total is not equal to 0)
return result D
else
NOx Mass Quarterly Reported Value = Current NOx Mass Summary Value Record. Current Reporting Period Total
If (NOx Mass Quarterly Reported Value < 0)
return result F
else if (NOx Mass Quarterly Reported Value is not rounded to one decimal place)
return result G
else if (Rpt Period NOx Mass Calculated Value is not null)
if (Rpt Period NOx Mass Calculated Value <> NOx Mass Quarterly Reported Value)
if (ABS{Rpt Period NOx Mass Calculated Value - NOx Mass Quarterly Reported Value) > NOx Mass
Quarterly Tolerance)
return Result A
else
append "NOXM" to Emissions Tolerance Deviators.
Environmental Protection Agency
Page 187 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
Response
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for NOXM for the reporting period is inconsistent with the recalculated value of
[calcval].
The CurrentReportingPeriodTotal of [sumval] reported in the Summary Value record
for NOXM is inconsistent with [sum], the sum of the hourly values reported in the
DHV records for the reporting period.
The CurrentReportingPeriodTotal in the Summary Value record for NOXM is missing
or the record is missing.
You reported a value as the CurrentReportingPeriodTotal in the Summary Value record
for NOXM, but there were no Hourly Operating Data records or appropriate NOX
Methods defined in your monitoring plan.
The CurrentReportingPeriodTotal in the Summary Value record for [param] could not
be recalculated because of errors listed above.
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Process/Category: 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 188 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-10
Check Name: Compare C02 Mass YTD Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual C02 Mass with the calculated values and generates an error message
if the difference is greater than the accepted tolerance.
Specifications:
Annual C02M Calculated Value = null
if (Rpt Period C02 Mass Calculated Value is not null OR Expected Summary Value C02 Array for this location == false)
if (Expected Summary Value C02 Array for this location == true)
If (Emissions 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 thq 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 C02 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 Op Value 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 if (Current C02 Summary Value Record. Yea rToDa teTota 1 is null or is less than 0)
return result B
else if (Current C02 Summary Value Record. Yea rTo D a t eTo t a 1 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
Environmental Protection Agency
Page 189 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
// If no result
If (Current C02 Summary Value /?6'cwY/.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
A
B
C
D
E
F
G
Usage:
1
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for this parameter.
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Severity
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Environmental Protection Agency
Page 190 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-11
Check Name: Compare S02 Mass YTD Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual S02 Mass with the calculated values and generates an error message
if the difference is greater than the accepted tolerance.
Specifications:
Annual S02M Calculated Value = null
if (Rpt Period S02 Mass Calculated Value is not null OR Expected Summary Value S02 Array for this location == false)
if (Expected Summary Value S02 Array for this location == true)
If (Emissions Tolerance Deviators contains "S02M")
Annual S02M Calculated Value = Current S02 Summary Value Record. Current Reporting Period Total
else
Annual S02M Calculated Value = Rpt Period S02 Mass Calculated Value
else if (Quarter of thq Current Reporting Period is greater than 1)
Annual S02M Calculated Value = 0
If (Quarter of the Current Reporting Period is greater than 1)
If (SO2 Start Quarter is not null)
For each quarter from the SO2 Start Quarter to the quarter prior to the quarter of the Current Reporting Period.
Locate an Op Supp Data record for the location and quarter where ParameterCode = "S02M".
If not found,
if (Expected Summary Value S02 Array for this location == true)
set Annual S02M Calculated Value to null
return result A
Otherwise,
add Op Value to Annual S02M Calculated Value
else
set Annual S02M Calculated Value to null
if (Current S02 Summary Value Record is not null)
if (Annual S02M Calculated Value is null AND Expected Summary Value S02 Array for this location == false)
return result H
else if (Current S02 Summary Value Record. YcarToDateTotal is null or is less than 0)
return result B
else if (Current S02 Summary Value Record. YcarToDateTotal is not rounded to one decimal place)
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
Environmental Protection Agency
Page 191 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
// if no result
if (Current S02 Summary Value /?6'cwY/.OzoncScasonToDatcTotal 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
else
If (Expected Summary Value S02 Array for this location == false AND Annual S02M Calculated Value > 0)
return result G
Results:
Result
A
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
The [paramname] emissions from this unit exceed the applicable number of tons
necessary to qualify as an LME unit. According to Part 75.19(b), you must install the
appropriate monitoring systems to measure [paramname] by December 31 of the year
following this reporting period.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for this parameter.
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.
Severity
Critical Error Level 1
B
C
Critical Error Level 1
Critical Error Level 1
D
Critical Error Level 1
E
Informational Message
F
Critical Error Level 1
G
H
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 192 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-12
Check Name: Compare NOx Mass YTD and OS Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual and ozone-season NOx Mass with the calculated values and
generates an error message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Annual NOXM Calculated Value = null
OS NOXM Calculated Value = null
NOXM Summary Invalid Fields = null
Imprecise Fields = null
if (Rpt Period NOx Mass Calculated Value is not null OR Expected Summary Value NOx Mass Array for this location == false)
if (Expected Summary Value NOx Mass Array for this location == true)
If {Annual Reporting Requirement == true)
If (Emissions ToleranceDeviators contains "NOXM")
Annual NOXM Calculated Value = Current NOX Mass Summary Value Record. Current Reporting
Period Total
else
Annual NOXM Calculated Value = Rpt Period NOx Mass Calculated Value
If {OS Reporting Requirement == true)
if (Quarter of the Current Reporting Period is equal to 2 or 3)
If {Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal
to 2)
OS NOXM Calculated Value = {Rpt Period NOx Mass Calculated Accumulator Array for this
location - April NOx Mass Calculated Accumulator Array for this location) / 2000, rounded to
one decimal place.
else
If {Emissions Tolerance Deviators contains "NOXM")
OS NOXM Calculated Value = Current NOX Mass Summary Value Record .Current
Reporting Period Total
else
OS NOXM Calculated Value = Rpt Period NOx Mass Calculated Value
else if (Quarter of the Current Reporting Period is equal to 4)
OS NOXM Calculated Value = 0
else
If {Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 1)
Annual NOXM Calculated Value = 0
If {OS Reporting Requirement == true AND the Quarter of the Current Reporting Period is greater than 2)
OS NOXM Calculated Value = 0
If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the Quarter
of the Current Reporting Period is equal to 2))
If {NOXStart Quarter is not null)
Environmental Protection Agency
Page 193 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
For each quarter in the current year from the NOXStart Quarter to the quarter prior to the quarter of the Current
Reporting Period:
If this quarter is equal to 2 AND OS Reporting Requirement == true,
Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXMOS".
If not found,
if (Expected Summary Value NOx Mass Array for this location == true)
set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result A
otherwise,
Locate an Op Supp Data record for the location and quarter where
ParameterCode = "NOXM".
If found,
set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result A
Otherwise,
add Op Value to OS NOXM Calculated Value.
If this quarter is not equal to 2 OR Annual Reporting Requirement == true,
Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXM".
If not found,
if (Expected Summary Value NOx Mass Array for this location == true)
set Annual NOXM Calculated Value to null,
set OS NOXM Calculated Value to null
return result B
Otherwise,
if Annual Reporting Requirement == true
add Op Value to Annual NOXM Calculated Value
if this quarter is equal to 3 AND OS Reporting Requirement == true
add Op Value to OS NOXM Calculated Value
else
set Annual NOXM Calculated Value to null
set OS NOXM Calculated Value to null
if (Current NOX Mass Summary Value Record is not null)
If (OS NOXM Calculated Value Value is null AND Annual NOXM Calculated Value is null AND Expected Summary
Value NOx Mass Array for this location == false)
return result K
Otherwise,
If (Current NOX Mass Summary Value Record. 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 O zo n c Sc a so n To D a t cTo t a 1 is null and OS Reporting
Environmental Protection Agency
Page 194 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Requirement == true AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current NOX
Mass Summary Value O zo n c Sc a so n To D a t cTo t a 1 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 O zo nc Sca so nTo Da t cTo t a 1)
if (ABS(YAV NOXM Calculated Value - Current NOXM Summary Value
Record. O zo nc Sca so nTo Da t cTo t a 1) > Tolerance OR quarter of the Current Reporting Period is
greater than 2)
append "OzoneSeasonToDateTotal" to NOXM Summary Invalid Fields
If NOXM Summary Invalid Fields is not null,
If (NOXM Summary Invalid Fields contains "Year")
If (NOXM Summary Invalid Fields contains "Ozone")
return result D
else
return result H
else
return result I
// if no result
if (OS Reporting Requirement == false and Current NOXM Summary Value Record. OzoneSeasonToDateTotal
is not null)
return result G
else if (Annual Reporting Requirement == false and Current NOXM Summary Value Record. YearToDateTotal
is not null)
return result L
else if ((LMEAnnual 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. OzoneSeasonToDateTotal
is greater than 50))
Environmental Protection Agency
Page 195 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
return result F
If (Expected Summary Value NOx Mass Array for this location == false AND (OS NOXM Calculated Value > 0 OR
Annual NOXM Calculated Value > 0))
return result J
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the OzoneSeasonToDateTotal
of [osval] in the Summary Value record for [param] is inconsistent with the
recalculated value of [oscalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
The [paramname] emissions from this unit exceed the applicable number of tons
necessary to qualify as an LME unit. According to Part 75.19(b), you must install the
appropriate monitoring systems to measure [paramname] by December 31 of the year
following this reporting period.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for locations that are not associated with an ozone-season program.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.
You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 196 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-13
Check Name: Compare NOx Rate YTD Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual and ozone-season NOx Rate with the calculated values and generates
an error message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Annual NOXR Calculated Value = null
If (LMEAnnual == true)
Set Total NOx Mass to null.
if (Expected Summary Value NOx Rate Array for this location == true)
if {Rpt Period NOx Mass Calculated Accumulator Array for this location is greater than or equal to 0 AND Rpt Period
HI Calculated Value is not null)
Set Total NOx Mass to Rpt Period NOx Mass Calculated Accumulator Array for this location.
Set Total HI to Rpt Period HI Calculated Value.
else if (Quarter of thq Current Reporting Period is greater than 1)
Set Total NOx Mass to 0.
Set Total HI to 0.
If (Quarter of the Current Reporting Period is greater than 1 AND Total NOx Mass is not null)
if (NOXR Start Quarter is not null)
For each quarter in the current year from the NOXR Start Quarter to the quarter prior to the quarter of the
Current Reporting Period:
Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXR".
If not found,
if (Expected Summary Value NOx Rate Array for this location == true)
set Total NOx Mass to null,
return result A
Otherwise,
set NOX Value to Op Value.
Locate an Op Supp Data record for the location and quarter where ParameterCode = "HIT".
If not found,
if (Expected Summary Value NOx Rate Array for this location == true)
set Total HI to null,
return result E
Otherwise,
Add Op Value to Total HI.
Calculate NOX Value = NOX Value * Op Value, and round the result to 1 decimal place.
Environmental Protection Agency
Page 197 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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.
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 thq Current Reporting Period is greater than 1)
Set TotalOpHours to 0.
If (Quarter of the Current Reporting Period is greater than 1 AND TotalOpHours is not null)
if (NOXR Start Quarter is not null)
For each quarter from the NOXR Start Quarter to the quarter prior to the quarter of the Current Reporting
Period:
Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXRSUM".
If found,
Add Op Value to Annual NOXR Calculated Value
Locate an Op Supp Data record for the location and quarter where ParameterCode =
"NOXRHRS".
If found,
Add Op Value to TotalOpHours.
If not found,
set Annual NOXR Calculated Value to null
return result A
Otherwise,
Locate an Op Supp Data record for the location and quarter where ParameterCode = "NOXR".
If not found,
if (Expected Summary Value NOx Rate Array for this location == true)
set Annual NOXR Calculated Value to null
return result A
Otherwise,
Environmental Protection Agency
Page 198 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 Op Value to TotalOpHours.
Add Op Value * NOXVal to Annual NOXR Calculated Value
else
set Annual NOXR Calculated Value to null.
If {Annual NOXR Calculated Value is not null)
If {TotalOpHours == 0)
Set Annual NOXR Calculated Value to 0.
else if {Annual NOXR Calculated Value > 0)
Calculate Annual NOXR Calculated Value = Annual NOXR Calculated Value / TotalOpHours, and round the
result to 3 decimal places.
if {Current NOXR Summary Value Record is not null)
If {Annual NOXR Calculated Value is null AND Expected Summary Value NOx Rate Array for this location == false)
return result H
else if {Current NOXR Summary Value 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"
if (ABS(Annual NOXR Calculated Value - Current NOXR Summary Value Record. YearToDateTotal) >
Tolerance)
return result D
// if no result
if {Current NOXR Summary Value /?6'cw 0)
return result G
Environmental Protection Agency
Page 199 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
G
H
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for OPHOURS is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
The program could not determine year-to-date for [param], because the Op Supp Data
record for HIT is missing for one or more previous reporting periods. If you have
submitted emissions data for prior quarters, you should be able to retrieve these records
by logging on to the EPA host.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for this parameter.
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for NOXR, but this is not appropriate, because
this record is not consistent with the unit program records and monitoring
methodologies in your monitoring plan. You only report a NOXR Summary Value if
the unit belongs to the Acid Rain program.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 200 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-14
Check Name: Compare Total Heat Input YTD and OS Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual and ozone-season heat input with the calculated values and generates
an error message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Annual HIT Calculated Value = null
OS HIT Calculated Value = null
HI Summary Invalid Fields = null
Imprecise Fields = null
if (Rpt Period HI Calculated Value is not null OR Expected Summary Value HI Array for this location == false)
if (Expected Summary Value HI Array for this location == true)
If {Annual Reporting Requirement == true)
If (Emissions ToleranceDeviators 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)
OS HIT Calculated Value = 0
If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the Quarter
of the Current Reporting Period is equal to 2))
If {Heat Input Start Quarter is not null)
For each quarter in the current year from the Heat Input Start Quarter to the quarter prior to the quarter of the
Environmental Protection Agency
Page 201 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
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 Op Value 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 Op Value to Annual HIT Calculated Value
if this quarter is equal to 3 AND OS Reporting Requirement == true
add Op Value to OS HIT Calculated Value
else
set Annual HIT Calculated Value to null
set Annual OS HIT Calculated Value to null
if (Current HI Summary Value Record is not null)
If (OS HIT Calculated Value is null AND Annual HIT Calculated Value is null AND Expected Summary Value HI
Array for this location == false and (LME HI Method <> "LTFF" or location does not start with "CP") )
return result K
Otherwise,
If (Current HI Summary 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 /?6'cw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Record. O zo n c Sc a so n To D a t cTo t a 1 is less than 0,
append "OzoneSeasonToDateTotal" to HIT Summary Invalid Fields
If {Current HI Summary Value Record. YcarToDateTotal 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 OK Current HI Summary ^£//w e O zo n c Sc a so n To D a t cTo t a 1
is not rounded to one decimal place)
append "OzoneSeasonToDateTotal" to Imprecise Fields
If {HIT Summary Invalid Fields is not null)
return result C
else if {Imprecise Fields is not null)
set HIT Summary Invalid Fields to Imprecise Fields
return result E
else if {Annual HIT Calculated Value is not null OR OS HIT Calculated Value is not null)
Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"
if {Annual HIT Calculated Value is not null AND Annual HIT Calculated Value <> Current HI
Summary Value Record. YearToDateTotal)
append "YearToDateTotal" to HIT Summary Invalid Fields
if {OS HIT Calculated Value is not null AND OS HIT Calculated Value o Current HI Summary
Value Record. OzoneSeasonToDateTotal)
If {Legacy Data Evaluation == false)
if (ABS(YAV HIT Calculated Value - Current HI Summary Value
Record. O zo n c Sc a so n To D a t cTo t a 1) > Tolerance OR the quarter of the Current Reporting
Period is greater than 2)
append "OzoneSeasonToDateTotal" to HLT Summary Invalid Fields
else
if (ABS(YAV HIT Calculated Value - Current HI Summary Value
Record. O zo n c Sc a so n To D a t cTo t a 1 rounded to the nearest integer) > Tolerance OR the
quarter of the Current Reporting Period is greater than 2)
append "OzoneSeasonToDateTotal" to HLT Summary Invalid Fields
If (HIT Summary Invalid Fields is not null)
If (HIT Summary Invalid Fields contains "Year")
If (HIT Summary Invalid Fields contains "Ozone")
return result D
else
return result H
else
If {Legacy Data Evaluation == true)
return result F
else
return result I
// if no result
Environmental Protection Agency
Page 203 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (OS Reporting Requirement == false and Current HI Summary Value /?6'cw 0 OR OS HIT
Calculated Value > 0))
return result J
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Usage:
1
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the OzoneSeasonToDateTotal
of [osval] in the Summary Value record for [param] is inconsistent with the
recalculated value of [oscalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for locations that are not associated with an ozone-season program.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.
You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.
Process/Category: 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
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 204 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-15
Check Name: Compare Operating Time YTD and OS Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual and ozone-season operating time with the calculated values and
generates an error message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Annual OPTIME Calculated Value = null
OS OPTIME Calculated Value = null
OPTIME Summary Invalid Fields = null
Imprecise Fields = null
if (Rpt Period Op Time Calculated Value is not null)
If Annual Reporting Requirement == true
If (Emissions ToleranceDeviators contains "OPTIME")
Annual OPTIME Calculated Value = Current Op Time Summary Value Record. Current Reporting Period Total
else
Annual OPTIME Calculated Value = Rpt Period Op Time Calculated Value
If OS Reporting Requirement == true)
if (the Quarter of the Current Reporting Period is equal to 2 or 3)
If Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal to 2,
OS OPTIME Calculated Value = Rpt Period Op Time Accumulator Array for this location - April Op
Time Accumulator Array for this location.
else
If (Emissions Tolerance Deviators contains "OPTIME")
OS OPTIME Calculated Value = Current Op Time Summary Value Record. Current Reporting
Period Total
else
OS OPTIME Calculated Value = Rpt Period Op Time Calculated Value
else if (Quarter of the Current Reporting Period is equal to 4)
OS OPTIME Calculated Value = 0
If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the Quarter
of the Current Reporting Period is equal to 2))
If (Start Quarter is not null)
For each quarter in the current year from the Start Quarter to the quarter prior to the quarter of the Current
Reporting Period:
If this quarter is equal to 2 AND OS Reporting Requirement == true
Locate an Op Supp Data record for the location and quarter where ParameterCode = "OSTIME".
If not found,
set Annual OPTIME Calculated Value to null,
set OS OPTIME Calculated Value to null
Locate the Facility record for the location.
Environmental Protection Agency
Page 205 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 Op Value to OS OPTIME Calculated Value.
If this quarter is not equal to 2 OR Annual Reporting Requirement == true,
Locate an Op Supp Data record for the location and quarter where ParameterCode = "OPTIME".
If not found,
if Annual Reporting Requirement == true
set Annual OPTIME Calculated Value to null.
if OS Reporting Requirement == true
set OS OPTIME Calculated Value to null.
Locate the Facility record for the location.
If the First ECMPS Reporting Period in the retrieved record is not null AND is on or
before the Start Quarter of the current year,
return result B.
exit for.
Otherwise,
if Annual Reporting Requirement == true
add Op Value to Annual OPTIME Calculated Value
if this quarter is equal to 3 AND OS Reporting Requirement == true
add Op Value 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
0Current 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. O zo n c Sc a so n To D a t cTo t a 1 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
Environmental Protection Agency
Page 206 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 O zo nc Sca so nTo Da t cTo t a 1)
if (ABS(YAV OPTIME Calculated Value - Current Op Time Summary Value
Record. O zo nc Sca so nTo Da t cTo t a 1) > Tolerance OR quarter of the Current Reporting Period is greater
than 2)
append "OzoneSeasonToDateTotal" to OPTIME Summary Invalid Fields
If OPTIME Summary Invalid Fields is not null,
If {OPTIME Summary Invalid Fields contains "Year")
If {OPTIME Summary Invalid Fields contains "Ozone")
return result D
else
return result G
else
return result H
// if no result
if {OS Reporting Requirement == false and Current Op Time Summary ^£//w e O zo n c Sc a so n To D a t cTo t a 1 is not
null)
return result F
else if {Annual Reporting Requirement == false and Current Op Time Summary Value Record. YearToDateTotal is not
null)
return result I
Environmental Protection Agency
Page 207 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
Usage:
1
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the OzoneSeasonToDateTotal
of [osval] in the Summary Value record for [param] is inconsistent with the
recalculated value of [oscalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for locations that are not associated with an ozone-season program.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].
You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.
Process/Category: 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
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 208 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-16
Check Name: Compare Operating Hours YTD and OS Values
Related Former Checks:
Applicability: General Check
Description: This check compares the reported annual and ozone-season operating hours with the calculated values and
generates an error message if the difference is greater than the accepted tolerance.
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Annual OPHOURS Calculated Value = null
OS OPHOURS Calculated Value = null
OPHOURS Summary Invalid Fields = null
Imprecise Fields = null
if (Rpt Period Op Hours Calculated Value is not null)
If Annual Reporting Requirement == true
If (Emissions ToleranceDeviators contains "OPHOURS")
Annual OPHOURS Calculated Value = Current Op Hours Summary Value Record. Current Reporting Period
Total
else
Annual OPHOURS Calculated Value = Rpt Period Op Hours Calculated Value
If OS Reporting Requirement == true)
if (the Quarter of the Current Reporting Period is equal to 2 or 3)
If Annual Reporting Requirement == true AND the Quarter of the Current Reporting Period is equal to 2,
OS OPHOURS Calculated Value = Rpt Period Op Hours Accumulator Array for this location - April
Op Hours Accumulator Array for this location.
else
If (Emissions Tolerance Deviators contains "OPHOURS")
OS OPHOURS Calculated Value = Current Op Hours Summary Value Record.Current
Reporting Period Total
else
OS OPHOURS Calculated Value = Rpt Period Op Hours Calculated Value
else if (Quarter of the Current Reporting Period is equal to 4)
OS OPHOURS Calculated Value = 0
If (the Quarter of the Current Reporting Period is greater than 2 OR {Annual Reporting Requirement == true AND the Quarter
of the Current Reporting Period is equal to 2))
If (Start Quarter is not null)
For each quarter in the current year from the Start Quarter to the quarter prior to the quarter of the Current
Reporting Period:
If this quarter is equal to 2 AND OS Reporting Requirement == true,
Locate an Op Supp Data record for the location and quarter where ParameterCode =
"OSHOURS" and FuelCd is null.
If not found,
set Annual OPHOURS Calculated Value to null,
set OS OPHOURS Calculated Value to null
return result A
Environmental Protection Agency
Page 209 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Otherwise,
add Op Value 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 Op Value to Annual OPHOURS Calculated Value
if this quarter is equal to 3 AND OS Reporting Requirement == true
add Op Value 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. Yea rToDa teTota 1 is null and Annual Reporting Requirement == true) OR
0Current Op Hours Summary Value Record. YearToDateTotal is less than 0,
append "YearToDateTotal" to OPHOURS Summary Invalid Fields
If (Current Op Hours Summary ^//w e O zo n c Sc a so n To D a t cTo t a 1 is null and OS Reporting Requirement == true
AND Quarter of the Current Reporting Period is equal to 2 or 3 or 4), OR Current Op Hours Summary Value
Record. O zo n c Sc a so n To D a t cTo t a 1 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
If (Current Op Hours Summary Value O zo n c Sc a so n To D a t cTo t a 1 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)
Environmental Protection Agency
Page 210 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 O zo nc Sca so nTo Da t cTo t a 1)
if (ABS(YAV OPHOURS Calculated Value - Current Op Hours Summary Value
Record. O zo nc Sca so nTo Da t cTo t a 1) > 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. YearToDateTotal is not
null)
return result I
Environmental Protection Agency
Page 211 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
Usage:
1
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc], and the OzoneSeasonToDateTotal
of [osval] in the Summary Value record for [param] is inconsistent with the
recalculated value of [oscalc].
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for locations that are not associated with an ozone-season program.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
The OzoneSeasonToDateTotal of [osval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [oscalc].
You reported YearToDate in the Summary Value record for [param], but this is not
valid for locations that only report during the ozone season.
Process/Category: 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
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 212 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-17
Check Name: Check BC02 Summary Value
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Current BC02 Summary Value Record = Summary Value record at this location where
Parameter = "BC02" AND
Reporting Period ID = Current Reporting Period
Set RGGIBegin Date, RGGI Start Quarter, AND BC02 Quarterly Reported Value to null.
if (Current BC02 Summary Value Record is not null)
if (CurrentMonitorPlanLocationRecord.SVAckPlpc\D 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 BC02 Summary Value Record. Current Reporting Period Total < 0)
return result C
else if (Current BC02 Summary Value Record. Current Reporting Period Total is not rounded to one decimal
place)
return result D
else
BC02 Quarterly Reported Value = Current BC02 Summary Value Record.Currcnl Reporting Period
Total
Environmental Protection Agency
Page 213 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Response
Severity
A
You reported a Summary Value record for [param], but this value should only be
reported at the unit, not at a stack or pipe.
Critical Error Level 1
B
You reported a Summary Value record for BC02, but this location does not belong to
the RGGI program during this reporting period.
Critical Error Level 1
C
The CurrentReportingPeriodTotal reported in the Summary Value record for [param] is
invalid. The value must be greater than or equal to 0.
Critical Error Level 1
D
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Critical Error Level 1
E
This check result is obsolete.
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 214 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAGG-18
Check Name: Compare BC02 Mass YTD Values
Related Former Checks:
Applicability: General Check
Description:
Validation Tables:
[Quarterly Emissions Tolerances] (Cross Check Table)
Specifications:
Set Annual BC02 Calculated Value to null.
If (BC02 Quarterly Reported Value is not null)
Annual BC02M Calculated Value = BC02 Quarterly Reported Value
else
Annual BC02M Calculated Value = -1
If (RGGI Start Quarter is not null AND Quarter of the Current Reporting Period is greater than 1)
For each quarter in the current year from the RGGI Start Quarter to the quarter prior to the quarter of the Current Reporting
Period:
Locate an Op Supp Data record for the location and quarter where ParameterCode = "BC02".
If not found,
If (BC02 Quarterly Reported Value is not null)
set Annual BC02 Calculated Value to null
return result A
Otherwise,
If {AnnualBC02M Calculated Value == -1)
Set Annual BC02M Calculated Value to Op Value
else
add Op Value to Annual BC02 Calculated Value.
If (Current BC02 Summary Value Record is not null)
If {Annual BC02M Calculated Value = -1)
set Annual BC02 Calculated Value to null
return result G
else if {Current BC02 Summary Value Record. Yea rToDa teTota 1 is null or is less than 0)
return result B
else if {Current BC02 Summary Value Record. Yea rTo D a t eTo t a 1 is not rounded to one decimal place)
return result C
else if {AnnualBC02 Calculated Value is not null)
if {Annual BC02 Calculated Value <> Current BC02 Summary Value Record. Yea rTo D a t eTo t a 1)
Tolerance = Lookup Tolerance from Cross-Check Table "Quarterly Emissions Tolerances" where
Parameter = "C02M" AND
UOM = "TON"
if (ABS( Annual HC()2 Calculated Value - Current BC02 Summary Value Record. Yea rTo D a t eTo t a 1) >
Environmental Protection Agency
Page 215 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Tolerance)
return result D
// If no result
If {Current BC02 Summary Value /?6'cwY/.OzoneSeasonToDateTotal is not null)
return result E.
else
If (AnnualBC02 Calculated Value == -1)
set Annual BC02 Calculated Value to null
If (Annual BC02 Calculated Value > 0)
return result F
Results:
Result
A
B
C
D
E
F
G
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [fieldname] in the Summary Value record for [param] is missing or invalid.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
The YearToDateTotal of [ytdval] in the Summary Value record for [param] is
inconsistent with the recalculated value of [ytdcalc].
You reported OzoneSeasonToDate in the Summary Value record for [param], but this is
not valid for this parameter.
You did not report a Summary Value record to report year-to-date total for [param].
You reported a Summary Value record for [param], but there was no [param] method
defined in your monitoring plan that was active during the year.
Severity
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 216 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Appendix D
Environmental Protection Agency
Page 217 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-1
Check Name: Initialize Accumulators for Appendix D Calculations
Related Former Checks:
Applicability: Appendix D Check
Description: Set all Appendix D Accumulators to ZERO
Specifications:
HI App D Accumulator = 0
SO2 App D Accumulator = 0
CO 2 App D Accumulator = 0
NOXR App E Accumulator = 0
Current Fuel Flow Record = null
Current Fuel Group = null
Fuels Used List = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Appendix D/E Unit-Level Initialization
Environmental Protection Agency
Page 218 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-3
Check Name: Initialize Fuel Flow Record
Related Former Checks:
Applicability: Appendix D Check
Description: Initialization procedure for fuel flow category.
Specifications:
Current Fuel Group = Current Fuel Flow FuclGroupCd
if (Current Fuel Flow Record\Jni\FuQ\CA in set {OGS, PRG,OOL})
Special Fuel Burned = true
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 219 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-4
Check Name: Check Fuel Usage Time
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
HFF Usage Time Status = true
If (Current Fuel Flow FuelUsageTime is null OR Current Fuel Flow /?6'cmy/. Fuel UsagcTi mc < 0 OR Current Fuel Flow
Record F ucl U sagcTi mc > 1)
HFF Usage Time Status = false
return result A
else if {Current Hourly Op Record .0\~>cn\{\\\gY\mc > 0 AND Current Hourly Op Record .0\~>cn\{\\\gY\mc <= 1)
if Current Fuel Flow Record.FuelCode is not in Fuels Used List
add 1 to Fuel Op Hours Accumulator Array for the location and fuel
append FuelCode to the Fuels Used List
if {Current Fuel Flow Record. FuelUsageTime > Current Hourly Op Record .0\~>cn\{\\\gY'\mc)
HFF Usage Time Status = false
return result B
else if {Hourly Fuel Flow Count For Gas + Hourly Fuel Flow Count For Oil == 1 AND {MPPipe Configfor Hourly Checks
is null OR Current Hourly Op /?6'cwY/.LocationNaine begins with "CP") AND Current Fuel Flow Record.FuelUsageTime <>
Current Hourly Op Ttecon/.OperatingTime)
HFF Usage Time Status = false
return result B
Results:
Result Response Severity
A The FuelUsageTime reported in the HFF record for FuelCode [fueled] is invalid. The Critical Error Level 1
must be greater than 0 and less than or equal to 1.
B The FuelUsageTime reported in the HFF record for FuelCode [fueled] is inconsistent Critical Error Level 1
with the OperatingTime for the hour.
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 220 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-5
Check Name: Check Volumetric SODC Code
Related Former Checks:
Applicability: Appendix D Check
Description: Validation checks on Volumetric SODC Code for the Current Fuel Flow Record
Specifications:
HFF SODC Status = true
If (Current Fuel Flow /?6'cw "E")
HFF SODC Status == false
return result E
else if (Current Fuel Flow /?6'cw "I")
HFF SODC Status == false
return result F
Results:
Result
A
B
C
D
Usage:
1
Response
You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you
reported a [ratefieldname].
You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not
report a [ratefieldname].
The SourceOfDataVolumetricCode reported in the HFF record for FuelCode [fueled] is
invalid.
You reported a [fieldname] of 3 in the HFF record for FuelCode [fueled], but,
according to the qualification record in your monitoring plan, this is not a peaking
unit.
You reported a [fieldname] of 4 in the HFF record for FuelCode [fueled], which
indicates that the fuel is an emergency fuel, but according to the Unit Fuel record in
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.
Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 221 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-6
Check Name:
Related Former Checks:
Check Oil Mass SODC Code
Applicability:
Description:
Appendix D Check
Validation checks on Mass SODC Code for the Current Oil Fuel Flow Record
Specifications:
HFFMass SODC Status == true
If (Current Fuel FlowRecord.SourceOfDataMassCode is null)
If (Current Fuel Flow Record.MassFlowRate is not null)
HFF Mass SODC Status == false
return result A
If (Current Fuel Flow Record.MassFlowRate is null)
HFF Mass SODC Status == false
return result B
else if (Current Fuel Flow 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
else
Environmental Protection Agency
Page 222 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you
reported a [ratefieldname].
You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not
report a [ratefieldname].
You reported a SourceOfDataMassCode of [sodc] in the HFF record for FuelCode
[fueled], but you also reported a VolumetricFlowRate. The SourceOfDataMassCode
must be 2 when mass oil flow is calculated from volumetric oil flow.
You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode [fueled],
but you did not report a VolumetricFlowRate. The SourceOfDataMassCode should be
2 only when the mass oil rate is calculated from volumetric oil flow.
You reported a [fieldname] of 3 in the HFF record for FuelCode [fueled], but,
according to the qualification record in your monitoring plan, this is not a peaking
unit.
You reported a [fieldname] of 4 in the HFF record for FuelCode [fueled], which
indicates that the fuel is an emergency fuel, but according to the Unit Fuel record in
your monitoring plan, this fuel is not an emergency fuel.
You reported a [fieldname] of [sodc] in the HFF record for FuelCode [fueled], which
indicates that the fuel is an igniter fuel, but according to the Unit Fuel record in your
monitoring plan, this fuel is not an igniter fuel.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 223 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-7
Check Name: Check Fuel Flow Monitoring System
Related Former Checks:
Applicability: Appendix D Check
Description: Validates the Monitoring System reported in the HourlyFuelFlowData record
Specifications:
HFF System Type = null
FuelFlowComponentRecords = null
CurrentAppendixDStatus = null
f (Current Fuel Flow Record Mon\\ox\ ngSystcm ID is null)
If (Current Fuel Flow Record. SourceOfData VoluinctricCode 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 {1, 3 } OR
0Current 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 RecordMomtoxmg'SystQmSD
if Current Mon Sys Record is null
return result D
else if (Current Fuel Group == "GAS" AND Current Mon ,SV.v Record. SystcmTypcCodc <> "GAS")
return result E
else if (Current Fuel Group == "OIL" AND Current Mon ,SV.v Record. SystcmTypcCodc not in set {OILV, OILM})
return result F
else if (Current Fuel Group == "OIL" AND Current Oil Fuel Flow Record. SourceOfDataMassCode == "2" AND
Current Mon ,SV.v Record. SystcmTypcCodc <> "OILV")
return result G
else
HFF System Type = Current Mon ,SV.v Record. SystcmTypcCodc
if Current Mon Sys Record .Fuc\Codc is not null and is not equal to Current Fuel Flow Record.FuelCode
HFF System Fuel = Current Mon ,SV.v Re cord.¥uc\CoA.c
return result H
else if (Current Fuel Flow Record. SourceOfData VolumetricCode 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"
Environmental Protection Agency
Page 224 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
For each retrieved record found:
If (MonitorSystemComponentRecordsByHourLocation.ComponentTypeCd ==
"OFFM")
Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords.
If none were found,
return result I.
else if {Current Fuel Group = "GAS")
Locate MonitorSystemComponentRecordsByHourLocation where the SystemID is equal to
CurrentFuelFlowRecord. SystemID and the ComponentTypeCd = "GFFM" or "BGFF"
For each retrieved record found:
If (MonitorSystemComponentRecordsByHourLocation.ComponentTypeCd ==
"GFFM")
Add the MonitorSystemComponentRecordsByHourLocation record to
FuelFlowComponentRecords.
If none were found,
return result I.
Environmental Protection Agency
Page 225 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
Response
You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the HFF
record for FuelCode [fueled], indicating the use of a fuel flowmeter system, but you did
not report its MonitoringSystemlD.
You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the HFF
record for FuelCode [fueled] that indicates the use of substitute data, but you did not
report a MonitoringSystemlD. This was not required for legacy EDR data, but for
ECMPS, you should report the primary MonitoringSystemlD of the fuel flowmeter
system that normally records the flow for this fuel.
You reported a SourceOfDataVolumetricCode or SourceOfDataMassCode in the HFF
record for FuelCode [fueled] that indicates the use of an emergency or igniter fuel, so
you should not have reported a MonitoringSystemlD in this record.
You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled], but
there is no MonitorSystem record for this system in your monitoring plan that was
active during the hour.
You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled], but
this system is not a GAS monitoring system.
You reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled], but
this system is not an OILM or OILV monitoring system.
You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode [fueled],
indicating that you are calculating mass oil rate from volumetric oil flow, but
MonitoringSystemlD [ID] is not an OILV monitoring system.
Your reported MonitoringSystemlD [ID] in the HFF record for FuelCode [fueled], but
the FuelCode for this system in the MonitorSystem record is [sysfuel]. The FuelCode
in the Monitor System record should be the same as the FuelCode in the HFF record.
You did not report any active fuel flowmeter components in your monitoring plan for
MonitoringSystemlD [ID], The QA status for Appendix D testing for this system will
not be evaluated.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 226 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-8
Check Name:
Check Volumetric Units of Measure
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
HFF UOM Status = true
If (Current Fuel Flow VolumctricUnitsOnvicasurcCodc is null)
If (Current Fuel Flow Record VolumctricFlowRatc is not null)
HFF UOM Status = false
return result A
If (Current Fuel Flow Record. VolumctricFlowRatc is null)
HFF UOM Status = false
return result B
else if (Current Fuel Group == "OIL" AND Current Fuel Flow Record. VolumctricUnitsOnvicasurcCodc 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. VolumctricUnitsOnvicasurcCodc <> "HSCF")
HFF UOM Status = false
return result C
else
Results:
Result
A
Response
You did not report a [fieldname] in the HFF record for FuelCode [fueled], but you
reported a [ratefieldname].
You reported a [fieldname] in the HFF record for FuelCode [fueled], but you did not
report a [ratefieldname].
The VolumetricUnitsOfMeasureCode reported in the HFF record for FuelCode [fueled]
is invalid.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 227 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-9
Check Name:
Check Fuel in HFF Record
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
HFF Fuel Indicator Code = null
Locate active UnitFuel record for the location
where FuelCd = Current Fuel Flow Record.UnitFuelCd
If found,
HFF Fuel Indicator Code = Current Fuel Flow Record. I ndicatorCd
else
return result A
Results:
Result
A
You did not report an active Unit Fuel record for FuelCode [fueled] in your monitoring Critical Error Level 1
plan.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 228 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-10
Check Name: Check Volumetric Flow in HFF Record
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
HFF Calc Volumetric Rate = null
HFF Max Heat Input for Volume = null
If (HFF System Type is not null AND HFF SOD Status == true AND HFF Mass SODC Status == true AND HFF UOM Status == true)
If (Current Fuel Flow Record. VolumctricFlowRatc is null)
If {HFFSystem Type<> "OILM")
return result A
else
If (HFFSystem Type== "OILM")
return result B
else if (Current Fuel Flow Record. SourceOfDataVolumetricCode == "4")
If (Current Entity Type is equal to "Unit")
Locate a Unit Capacity record for the location and hour.
If exactly one record is found, and the MaximumHourlyHeatlnputCapacity in the retrieved record is
greater than 0,
HFF Max Heat Input for Volume =
t/wifCa/7ac%/?J#
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
FuelCode == Current Fuel Flow Record.FuelCode
if (Count <> 1)
return result C
else if (DefaultRecordDQf&vlXSfdluQ <= 0)
return result D
else if (De/aM//i?ecor HFF Calc Volumetric Rate)
return result F
else
If (Current Fuel Flow Record. VolumctricFlowRatc <= 0)
return result E
else
return result G
else if Current Fuel Flow Ttecon/.MonitoringSystemID is not null)
If (Current Fuel Flow Record. VolumetricFlowRate <= 0)
return result E
else
If (Current Fuel Flow /?6'cw 3)
HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate
Count active System Fuel Flow Record for the system.
If (Count <> 1)
return result H
else if (System Fuel Flow itecordMaximumFuelFlowRate <= 0)
return result I
else if (System Fuel Flow Record. SystemFuelFlowUOMCode == Current Fuel Flow
Record. Vo 1 u m c t r i c U n i t sO fM ca s u rc C ode)
If (Current Fuel Flow /?6'cwY/.SourccOfDataVoluinctricCodc == 3)
HFF Calc Volumetric Rate = System Fuel Flow itecordMaximumFuelFlowRate
If Current Fuel Flow Record. VolumetricFlowRate <> HFF Calc Volumetric Rate)
return result J
else
If (HFF Calc Volumetric Rate > System Fuel Flow itecordMaximumFuelFlowRate
return result K
else
return result L
else
If (Current Fuel Flow Record. VolumetricFlowRate <= 0)
return result E
else
HFF Calc Volumetric Rate = Current Fuel Flow Record. VolumetricFlowRate
Environmental Protection Agency
Page 230 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
H
I
J
K
M
Usage:
1
Response
You did not report a VolumetricFlowRate in the HFF record for FuelCode [fueled],
which is required when using [systype] MonitoringSystemID [ID],
You reported a VolumetricFlowRate in the HFF record for FuelCode [fueled], which is
invalid when using an OILM system.
You did not report one and only one default record for [parameter] for FuelCode
[fueled] in your monitoring plan that was active during current hour.
The Default Value reported in the active [parameter] default record for the hour is
invalid.
The VolumetricFlowRate reported in the HFF record for FuelCode [fueled] is invalid.
You reported a SourceOfDataVolumetricCode of [sodc] in the HFF record for FuelCode
[fueled], but the VolumetricFlowRate is not equal to the fuel flow rate defined in the
active [parameter] default record in your monitoring plan.
The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode [fueled] is not
the same as the DefaultUnitsOfMeasureCode in the active [parameter] default record in
your monitoring plan.
You did not report one and only one active SystemFuelFlow record for
MonitoringSystemID [ID] in your monitoring plan for the hour.
The MaximumFuelFlowRate reported in the active System Fuel Flow record for
MonitoringSystemID [ID] in your monitoring plan is invalid.
You reported a SourceOfDataVolumetricCode of 3 in the HFF record for FuelCode
[fueled], but the VolumetricFlowRate is not equal to the MaximumFuelFlowRate
specified in the active System Fuel Flow record for MonitoringSystemID [ID] in your
monitoring plan.
Warning: The VolumetricFlowRate reported in the HFF record for FuelCode [fueled]
exceeds the MaximumFuelFlowRate specified in the active System Fuel Flow record
for MonitoringSystemID [ID] in your monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary. You
should investigate the cause of these exceedances and determine whether an
adjustment to your monitoring systems or monitoring plan is necessary.
The VolumetricUnitsOfMeasureCode in the HFF record for FuelCode [fueled] is not
the same as the SystemFuelFlowUOMCode in the active System Fuel Flow record for
MonitoringSystemID [ID] in your monitoring plan.
You did not report one and only one valid active Unit Capacity record in your
monitoring plan for the unit for the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 231 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-11
Check Name: Check Mass Oil Flow in HFF Record
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
HFF Calc Mass Oil Rate = null
HFF Max Heat Input for Mass = null
If {HFF System Type is not null AND HFF SOD Status == true AND HFF Mass SODC Status == true AND HFF UOM Status == true)
If {Current Fuel Flow Record.MassFlowRate is null)
If {HFFSystem Type== "OILM")
return result A
Else if {HFFSystem Type== "OILV"
If {Current Fuel FlowRecord.SourceOfDataMassCode == "2")
return result B
Else if {Current Unit isARP == true)
return result C
else
If {HFFSystem Type== "GAS")
return result D
else if {HFFSystem Type== "OILV")
If {Current Fuel Flow Record. SomceOfDataMassCode == "2" AND Current Fuel Flow Record.MassFlowRate
<=0)
return result E
else if {Current Fuel Flow Record. SomceOfDataMassCode == "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 Mass =
UnitCapacityByHourLocationMaximmnRom\yY[Qa\hi\)\itCa\)aci\y
If {HFFGCV is not null)
HFF Calc Mass Oil Rate = HFF Max Heat Input for Mass / HFFGCV * 1000000,
rounded to one decimal place.
else
return result M
else
If {Current Fuel Flow MassFlowRate <= 0)
return result E
else
HFF Calc Mass Oil Rate = Current Fuel Flow 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
Environmental Protection Agency
Page 232 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if {DefaultRecord DzfavAtValue <= 0 ORDe/aM//i?ecor "LBHR")
return result G
else
HFF Calc Mass Oil Rate = Default Record .Default Value
If (Current Fuel Flow MassFlowRate <= 0)
return result E
else if (Current Fuel Flow Ttecon/.MassFlowRate <> HFF Calc Mass Oil Rate)
return result H
else if (Current Fuel Flow Ttecon/.MonitoringSystemID is not null)
If {Current Fuel Flow Record.MassFlowRate <= 0)
return result E
else
If {Current Fuel Flow Record. SourccOfDataMassCodc <> 3)
HFF Calc Mass Oil Rate = Current Fuel Flow Ttecon/.MassFlowRate
Count active System Fuel Flow Record for the system.
If {Count <> 1)
return result I
else if {System Fuel Flow itecordMaximumFuelFlowRate <= 0 OR System Fuel Flow
Record.SystemFuelFlowUOMCode <> "LBHR")
return result J
else
If {Current Fuel FlowRecord.SourceOfDataMassCode== 3)
HFF Calc Mass Oil Rate = System Fuel Flow itecordMaximumFuelFlowRate
If {Current Fuel Flow Record. MassFlowRate <> HFF Calc Mass Oil Rate)
return result K
else
If {HFF Calc Mass Oil Rate > System Fuel Flow itecordMaximumFuelFlowRate
return result L
else
If {Current Fuel Flow Record.MassFlowRate <= 0)
return result E
else
HFF Calc Mass Oil Rate = Current Fuel Flow MassFlowRate
Environmental Protection Agency
Page 233 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
M
Usage:
1
Response
You did not report a [fieldname] in the HFF record for FuelCode [fueled], but the
MonitoringSystemID [ID] is an [systype] fuel flow system.
You reported a SourceOfDataMassCode of 2 in the HFF record for FuelCode [fueled],
which indicates that the mass oil rate was calculated from the volumetric oil rate, but
you did not report a MassFlowRate in the record.
You did not report a [fieldname] in the HFF record for FuelCode [fueled], but this
value is required for an ARP unit.
You reported a MassFlowRate in the HFF record for FuelCode [fueled]. This value
should be blank for a gas fuel.
The MassFlowRate reported in the HFF record for FuelCode [fueled] is invalid.
You did not report one and only one default record for [parameter] for FuelCode
[fueled] in your monitoring plan that was active during current hour.
The Default Value or DefaultUnitsOfMeasureCode reported in the active [parameter]
default record for the hour is invalid.
You reported a SourceOfDataMassCode of [sodc] in the HFF record for FuelCode
[fueled], but the MassFlowRate is not equal to the fuel flow rate defined in the active
[parameter] default record in your monitoring plan.
You did not report one and only one active SystemFuelFlow record for
MonitoringSystemID [ID] in your monitoring plan for the hour.
The MaximumFuelFlowRate or SystemFuelFlowUOMCode reported in the active
System Fuel Flow record for MonitoringSystemID [ID] in your monitoring plan is
invalid.
You reported a SourceOfDataMassCode of 3 in the HFF record for FuelCode [fueled],
but the MassFlowRate is not equal to the MaximumFuelFlowRate specified in the
active System Fuel Flow record for MonitoringSystemID [ID] in your monitoring plan.
Warning: The MassFlowRate reported in the HFF record for FuelCode [fueled] exceeds
the MaximumFuelFlowRate specified in the active System Fuel Flow record for
MonitoringSystemID [ID] in your monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary. You
should investigate the cause of these exceedances and determine whether an
adjustment to your monitoring systems or monitoring plan is necessary.
You did not report one and only one valid active Unit Capacity record in your
monitoring plan for the unit for the hour.
Severity
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 234 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-12
Check Name: Determine Density
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Fuel Type Reality Checks for Density (Cross Check Table)
Fuel Type Warning Levels for Density (Cross Check Table)
Table D-6 Missing Data Values (Cross Check Table)
Specifications:
HFF Density = null
Current Density Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "DENSOIL"
If (Count >1)
return result A
Else If (Count == 0)
If (HFFSystem Type== "OILV" and Current Fuel Flow Record. SourceOfDataMassCode == "2")
return result B
Else if (HFFSystem Type= "OILV" AND Current Fuel Flow Record. SourceOfDataMassCode == "2")
Current Density Record = matching record
Density UOM = Current Density Record. ParameterUOMCode
if (Density UOM not in set {LBGAL, LBBBL, LBM3, LBSCF})
return result C
else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D
else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D
else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D
else if (Current Fuel Flow Record. VolumetricUnitsOfMeasureCode
return result D
else if (Current Density Record.ParamValFuel > 0)
Density Default = null
If (Current Density Record. SamplcTypcCodc == 8)
Density Default = Lookup "MissingData Value" in "Table D-6 Missing Data Values"
where "Parameter" column = "DENSOIL -" + Density UOM AND "FuelCode" column = Current Fuel
Flow Record.FuelCode
If (DensityDefault == 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,
== "GALHR" AND Density UOM <> "LBGAL")
== "BBLHR" AND Density UOM <> "LBBBL")
== "M3HR" AND Density UOM <> "LBM3")
== "SCFH" AND Density UOM <> "LBSCF")
Environmental Protection Agency
Page 235 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
" -", 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. Pa rain Va 1F ucl > Max Allowed Density) OR
{Min Allowed Density is not null AND Current Density Record. ParamValFuel < Min Allowed Density)
return result E
else
HFFDensity = 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)
return result F
else
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
Results:
Result
A
B
C
D
E
F
G
H
I
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You did not report an HPFF record for [parameter] for FuelCode [fueled] for the hour.
The ParameterUOMCode reported in the HPFF record for DENSOIL for FuelCode
[fueled] is missing or invalid.
The ParameterUOMCode reported in the HPFF record for DENSOIL for FuelCode
[fueled] is inconsistent with the VolumetricUnitsOfMeasureCode reported in the
associated HFF record.
The ParameterValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is outside the range of allowable values for the fuel type.
The Parameter ValueForFuel 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 Parameter ValueForFuel does
not equal the default value for the fuel.
The Parameter ValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is invalid. The value should be greater than 0.
You reported an HPFF record for [parameter] for FuelCode [fueled], but this value is
only appropriate when using an OILV system and a SourceOfDataMassCode equal to
2.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 236 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-13
Check Name: Check Density Sample Type
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If {Current Density Record is not null)
If Current Density Record. SampleTypeCode not in {1, 2, 5, 6, 7, 8}
return result A
Results:
Result Response Severity
A The SampleTypeCode reported in the HPFF record for DENSOIL for FuelCode [fueled] Critical Error Level 1
is missing or invalid.
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 237 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-14
Check Name:
Check Extraneous Density Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If {Current Density Record is not null)
If {Current Density Formu 1 a Idcn t i ficr 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 Opcrat i ngCondi t ionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If {Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for DENSOIL for FuelCode [fueled].
This data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 238 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-15
Check Name:
Calculate Mass Oil Flow
Related Former Checks:
Applicability:
Appendix D Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
If HFF Calc Volumetric Flow is not null AND HFFDensity is not null)
HFF Calc Mass Oil Flow = HFF Density * HFF Calc Volumetric Flow, and round the result to one decimal place (0.1)
Flow Rate Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "OILM" AND
UOM = "LBHR"
If (Current Fuel Flow MassFlow Ratc > 0)
if (ABS(Current Fuel Flow Ttecon/.MassFlowRate - HFF Calc Mass Oil Flow) > Flow Rate Tolerance)
return result A
Results:
Result
A
Response
The MassFlowRate reported in the HFF record for FuelCode [fueled] is inconsistent
with the value calculated from the VolumetricFlowRate and density.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 239 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-16
Check Name: Determine GCV
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Fuel Type Reality Checks for GCV (Cross Check Table)
Fuel Type Warning Levels for GCV (Cross Check Table)
Table D-6 Missing Data Values (Cross Check Table)
Specifications:
HFF GCV = null
Current GCV Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "GCV"
If (Count >1)
return result A
Else If (Count == 0)
If (Current HI HPFFRecord is not null)
return result B
Else if (Current HI HPFF Record is not null)
Current GCV Record = matching record
GCVUOM = Current GCf^Ttecon/.ParameterUOMCode
if (GCVUOM not in set {BTUGAL, BTUBBL, BTUM3, BTUSCF, BTULB, BTUHSCF}
return result C
else if (Current Fuel Group == "GAS" AND GCVUOM <> "BTUHSCF")
return result D
else if (Current Fuel Group == "OIL" AND Current Fuel Flow MassFlow Ratc is not null AND GCVUOM <>
"BTULB")
return result D
else if (Current Fuel Group == "OIL" AND Current Fuel Flow Ttecon/.MassFlowRate is null AND Current Fuel Flow
Record. Vo 1 u m c t r i c U n i t sO fM ca s u rc C ode == "GALHR" AND GCVUOM <> "BTUGAL")
return result D
else if (Current Fuel Group == "OIL" AND Current Fuel Flow Ttecon/.MassFlowRate is null AND Current Fuel Flow
itecorrf. VohimetricUnitsOfMeasureCode == "BBLHR" AND GCVUOM <> "BTUBBL")
return result D
else if (Current Fuel Group == "OIL" AND Current Fuel Flow Ttecon/.MassFlowRate is null AND Current Fuel Flow
Record. Vo 1 u m c t r i c U n i t sO (TVI ca s u rc C ode == 'M3HR" AND GCVUOM <> "BTUM3")
return result D
else if (Current Fuel Group == "OIL" AND Current Fuel Flow Ttecon/.MassFlowRate is null AND Current Fuel Flow
Record. Vo 1 u m c t r i c U n i t sO (TVI ca s u rc C ode == "SCFH" AND GCVUOM <> "BTUSCF")
return result D
else if (Current GCV Record PwavaNdXPuQl > 0)
GCV Default = null
If (Current GCVRecord.Sm\\AcY\pcCode == 8)
GCV Default = Lookup "MissingData Value" in "Table D-6 Missing Data Values"
where "Parameter" column = "GCV -" + GCVUOM AND "FuelCode" column = Current Fuel Flow
Record. Fuel Code
If (GCVDefault == null)
Environmental Protection Agency
Page 240 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
GCVDefault = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"
where "Parameter" column = "GCV -" + GCVUOM and FuelCode column is null.
If {GCVDefault == null)
Max Expected GCV = Lookup "Upper Value" in "Fuel Type Warning Levels for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow Record.FuelCode,
" -", GCVUOM)
Min Expected GCV = Lookup "Lower Value" in "Fuel Type Warning Levels for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow Record.FuelCode,
" -", GCVUOM)
Max Allowed GCV = Lookup "Upper Value" in "Fuel Type Reality Checks for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow Record.FuelCode,
" -", GCVUOM)
Min Allowed GCV = Lookup "Lower Value" in "Fuel Type Reality Checks for GCV Cross Check Table"
where "Fuel Code - Units Of Measure" column = concatenation of {Current Fuel Flow Record.FuelCode,
" -", GCVUOM)
if {Max Allowed GCV is not null AND Current G C V Record. Pa ra 111 Va 1F lie 1 > Max Allowed GCV) OR {Min
Allowed GCV is not null AND Current GCV Record < Min Allowed GCV)
return result E
else if {Current GCV Record PwavaNdXPuQl is not rounded to one decimal place)
return result J
else
HFF GCV = Current GCV Record. Pa ra 111 Va 1 Fuel
if {Min Expected GCV is not null AND HFF GCV < Min Expected GCV) OR {Max Expected GCV is not
null AND HFF GCV > Max Expected GCV)
return result F
If {Current GCf^./tecon/.ParamValFuel is not rounded to one decimal place)
return result J
else if (GCV Default == Current GCV Record. Pa ra 111 Va 1F ucl)
HFF GCV = Current GCV Record. Pa ra 111 Va 1 Fuel
else
return result G
else
return result H
else
return result I
Environmental Protection Agency
Page 241 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You did not report a HPFF record for GCV for FuelCode [fueled] for the hour.
The ParameterUOMCode reported in the HPFF record for GCV for FuelCode [fueled]
is missing or invalid.
The ParameterUOMCode reported in the HPFF record for GCV for FuelCode [fueled]
is inconsistent with the fuel flow units of measure.
The ParameterValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is outside the range of allowable values for the fuel type.
The Parameter ValueForFuel 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 Parameter ValueForFuel does
not equal the default value for the fuel.
The ParameterValueForFuel reported in the HPFF record for GCV for FuelCode
[fueled] is invalid. The value must be greater than 0.
You reported an HPFF record for GCV for FuelCode [fueled], but you have not
reported an HPFF record for HI for the hour.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 242 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-17
Check Name:
Check GCV Sample Type
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
If (Current GCV Record is not null)
If (Current Fuel Group == "OIL" AND Current G C V Record .Sm\\AcY\ pc C ode not in {1, 2, 5, 6, 7, 8})
return result A
else if (Current Fuel Group == "GAS" AND Current G C V Record .Sm\\AcY\ pc C ode not in {0, 2, 3, 4, 6, 7, 8})
return result A
Results:
Result
A
Response
The SampleTypeCode reported in the HPFF record for GCV for FuelCode [fueled] is
missing or invalid.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 243 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-18
Check Name:
Check Extraneous GCV Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current GCV Record is not null)
If (Current f/Y.'K. Fornui 1 a Idcn t i ficr is not null)
append "Formulaldentifier" to Hourly Extraneous Fields
If (Current f/Y.'K. Moni tori ngSystcm ID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current f/Y.'K. SegmcntN umbe r is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If (Current GCK.Opcrat i ngCondi t ionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for GCV for FuelCode [fueled]. This
data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 244 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-19
Check Name: Validate Heat Input Record
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
Current HI HPFF Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "HI"
If (Count >1)
HI App D Accumulator = -1
return result A
Else If (Count == 0)
If {Heat Input App D Method Active For Hour == true)
HI App D Accumulator = -1
return result B
Else if {Heat Input App D Method Active For Hour == true)
Current HI HPFF Record = matching record
HI HPFF Exists = true
if {Current HI HPFF M o n i t o r i ng Fo r m u 1 a I d is null
return result C
else
Cur HIMon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current HI HPFF . M o n i t o r i ng Fo r m u 1 a ID
if {Cur HIMon Formula Record is null)
return result D
else if {Cur HIMon Formula Record. ParamctcrCodc <> "HI")
return result E
else if {Current Fuel Group == "GAS")
If {Cur HIMon Formula .RecordEquationCode not in set {D-6, F-20})
return result F
else if {Current Fuel Flow Record.MassFlowRate is not null)
If {Cur HIMon Formula .RecordEquationCode not in set {D-8, F-19})
return result F
else
If {Cur HIMon Formula Record.EquationCode <> "F-19V")
return result F
else
return result G
Environmental Protection Agency
Page 245 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
Usage:
1
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You did not report an HPFF record for [parameter] for FuelCode [fueled] for the hour.
You did not report a FormulalD in the HPFF record for HI for FuelCode [fueled].
You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for HI for FuelCode [fueled], but this
is not an HI formula.
The FormulaCode of FormulalD [ID] reported in the HPFF record for HI for FuelCode
[fueled] is invalid.
You reported an HPFF record for GCV for FuelCode [fueled], but you have not
reported an HPFF record for HI for the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 246 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-20
Check Name:
Check Extraneous Heat Input Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current HIHPFFRecord is not null)
If (Current HI HPFF Record.MomtoringSystemlD 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 . O pc ra t i ngCo ndi t i o n Code is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current HI HPFF Record. SampleTypeCode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
You reported [fieldnames] in the HPFF record for HI for FuelCode [fueled]. This data Non-Critical Error
should be blank.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 247 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-21
Check Name: Calculate Heat Input Rate
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
HFF Calc HI Rate = null
If (Current HI HPFFRecord is not null)
if (Current Fuel Flow /?6'ewY/.SourccO(Data VolumctricCodc == "4")
if (HFF Max Heat Input for Volume is not null)
HFF Calc HI Rate = HFF Max Heat Input for Volume
else
HI App D Accumulator = -1
return result A
else if (Current Fuel Flow Record. SomceOfDataMassCode == "4")
if (HFF Max Heat Input for Mass is not null)
HFF Calc HI Rate = HFF Max Heat Input for Mass
else
HI App D Accumulator = -1
return result A
else if (HFFGCV is not null)
HI HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI HPFF" AND
UOM = "MMBTUHR"
If (HFFSystem Type == "GAS" OR Current Fuel Flow MassFlow Ratc is null)
If (HFF Calc Volumetric Rate is not null)
HFF Calc HI Rate = HFF Calc Volumetric Rate * HFF GCV / 1000000, and round the result to one
decimal place.
else
HI App D Accumulator = -1
return result A
else
if (HFF Calc Mass Oil Rate is not null)
HFF Calc HI Rate = HFF Calc Mass Oil Rate * HFF GCV / 1000000, and round the result to one
decimal place.
else
HI App D Accumulator = -1
return result A
If (HFF Calc HI Rate is not null)
If Current Fuel Flow Record. FuelUsageTime > 0 AND Current Fuel Flow Record. FuelUsageTime <= 1 AND HI App D
Accumulator >= 0)
// Note - this accumulates totals for all Fuel flow records and does not work like a normal parameter
HI App D Accumulator = HI App D Accumulator + HFF Calc HI Rate * Current Fuel Flow
Environmental Protection Agency
Page 248 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Record. F ucl U sagcTi mc
else
HI App D Accumulator = -1
If (Current HI HPFF Record. Pa rain Va 1F ucl > 0)
If (Current Fuel Flow /?6'cw Flow Tolerance)
return result C
else
If (Current Fuel Flow MassFlow Ratc is greater than 0, AND
HFF Calc Mass Oil Rate is not equal to Current Fuel Flow Ttecon/.MassFlowRate)
Flow Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions
Tolerances" where Parameter = "FOIL"
if (ABS{HFF Calc Mass Oil Rate - Current Fuel Flow Ttecon/.MassFlowRate)
> Flow Tolerance)
return result D
else
If (ABS {HFF Calc HI Rate - Current HI HPFF Record. Pa ram Va 1F ucl) > HI HPFF Tolerance)
return result B
else
HI App D Accumulator = -1
return result A
Environmental Protection Agency
Page 249 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Usage:
1
Response
The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode [fueled]
could not be recalculated due to errors listed above.
The ParameterValueForFuel reported in the HPFF record for HI for FuelCode [fueled]
is inconsistent with the recalculated value.
You reported a SourceOfDataVolumetricCode of 4, indicating that you burned an
emergency fuel, but the VolumetricFlowRate in the HFF record for FuelCode [fueled] is
inconsistent with the maximum fuel flow rate for the unit. When you burn an
emergency fuel, you should report the maximum fuel flow rate, which is based on the
maximum hourly heat input capacity of the unit.
You reported a SourceOfDataMassCode of 4, indicating that you burned an emergency
fuel, but the MassFlowRate in the HFF record for FuelCode [fueled] is inconsistent
with the maximum fuel flow rate for the unit. When you burn an emergency fuel, you
should report the maximum fuel flow rate, which is based on the maximum hourly heat
input capacity of the unit.
Severity
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 250 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-22
Check Name:
Check Reported Heat Input
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
If (Current HI HPFFRecord is not null)
If (Current HI HPFF Record. Pa rain Va 1F ucl >= 0
If (Current HI HPFF Record. ParamValFuel is not rounded to one decimal place)
return result D
else if (Current Fuel Flow Record.SourceOfDataYolumetncCode== "4" and HFFMax Heat Input for Volume is not
null)
if (Current HI HPFF Record. ParamValFuel is not equal to HFF Max Heat Input for Volume)
return result E
else if (Current Fuel Flow Record. SourceOfDataMassCode == "4" and HFF Max Heat Input for Mass is not null)
if (Current HI HPFF Record. ParamValFuel is not equal to HFF Max Heat Input for Mass)
return result F
else
If Current Entity Type == "CP",
Count active UnitCapacity record for each unit linked to the pipe
if (Count <> 1 for any unit)
return result A
else
Calculate Max Heat Input as the sum of UnitCapacity
IVIaxi liuunHourly Heat I nputCapacit\ for all units.
Count active UnitCapacity record for the associated unit,
if (Count <> 1)
return result A
else
Max Heat Input = In it (Yy/jflc/'n/tecwr/.MaximumHoiirlyHcatlnputCapacitY
if Current HI HPFF Record. ParamValFuel > Unit ( Max inuini Hourly Heat I nputCapacity
return result B
else
else
return result C
Environmental Protection Agency
Page 251 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Usage:
1
Response
You did not report one and only one active Unit Capacity record in your monitoring
plan for the unit (or for each unit linked to the pipe) for the hour.
Warning: The ParameterValueForFuel reported in the HPFF record for HI for FuelCode
[fueled] exceeds the MaximumHourlyHeatlnputCapacity reported in the Unit Capacity
record in your monitoring plan. Sources are required to periodically (at least once
annually) evaluate the appropriateness of maximum values in the monitoring plan and
make proper adjustments when necessary. You should investigate the cause of these
exceedances and determine whether an adjustment to the
MaximumHourlyHeatlnputCapacity reported in your monitoring plan is necessary.
The ParameterValueForFuel reported in the HPFF record for HI for FuelCode [fueled]
is invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported a SourceOfDataVolumetricCode of 4 in the HFF record, indicating that
you burned an emergency fuel. However, you did not report the maximum hourly heat
input capacity for the unit as the ParameterValueforFuel in the HPFF record for HI,
which is required when you burn an emergency fuel.
You reported a SourceOfDataMassCode of 4 in the HFF record, indicating that you
burned an emergency fuel. However, you did not report the maximum hourly heat
input capacity for the unit as the Parameter ValueforFuel in the HPFF record for HI,
which is required when you burn an emergency fuel.
Severity
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 252 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-23
Check Name: Check Heat Input Units Of Measure
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current HI HPFFRecord is not null)
If (Current HI HPFF Record.ParameterUOMCode <> "MMBTUHR")
return result A
Severity
Critical Error Level 1
Results:
Result Response
A The ParameterUOMCode reported in the HPFF record for HI for FuelCode [fueled] is
missing or invalid. The value should be "MMBTUHR".
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 253 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-24
Check Name: Validate S02 Record
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
Current S02 HPFFRecord = null
HFF S02 Equation Code = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow 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 (SO 2 App D Method Active For Hour == true)
Current S02 HPFF Record = matching record
SO2 HPFF Exists = true
if (Current S02 HPFF/?6'cmy/. Moni tori ngFormu 1 a Id is null
return result C
else
Cur S02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current S02 HPFF /?6'cmy/. M o n i t o r i ng Fo r m u 1 a ID
if {Cur S02 Mon Formula Record is null)
return result D
else if (Cur S02 Mon Formula Record.PammeterCode <> "S02")
return result E
else if {Current Fuel Group == "GAS")
If {Cur S02 Mon Formula Record.EquationCode in set {D-4, D-5})
HFF S02 Equation Code = Cur S02 Mon Formula Record.EquationCode
else
return result F
else
If {Cur S02 Mon Formula Record.EquationCode == "D-2")
HFF S02 Equation Code = Cur S02 Mon Formula Record.EquationCode
else
return result F
else
return result G
Environmental Protection Agency
Page 254 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
Usage:
1
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You did not report an HPFF record for [parameter] for FuelCode [fueled] for the hour.
You did not report a FormulalD in the HPFF record for S02 for FuelCode [fueled].
You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for S02 for FuelCode [fueled], but
this is not an S02 formula.
The FormulaCode of FormulalD [ID] reported in the HPFF record for S02 for
FuelCode [fueled] is invalid.
You reported an HPFF record for S02 for FuelCode [fueled], but you do not have an
active Appendix D S02 method for the hour.
Severity
Critical
Error
Level 1
Critical
Critical
Critical
Error
Error
Error
Level 1
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 255 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-25
Check Name:
Check Extraneous S02 Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current S02 HPFFRecord is not null)
If (Current S02 HPFF/?6'cmy/. Moni tori ngSystcm ID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current S02 HPFF Record. ScgmcntNumbcr is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If (Current S02 HPFF Record. O pc ra t i n g Co n d i t i o n C ode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current S02 HPFF Record. S a m p 1 cTy pc C ode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for S02 for FuelCode [fueled]. This
data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 256 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-26
Check Name: Check S02 Units Of Measure
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current S02 HPFFRecord is not null)
If (Current S02 HPFF Record Pa ra mctc rUOM Code <> "LBHR")
return result A
Results:
Result Response Severity
A The ParameterUOMCode reported in the HPFF record for S02 for FuelCode [fueled] is Critical Error Level 1
missing or invalid. The value should be "LBHR".
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 257 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-27
Check Name: Calculate S02 Mass Rate
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
HFF Calc S02 = null
If (Current S02 HPFFRecord is not null)
if (Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-4" AND HFF Sulfur is not null AND HFF Calc
Volumetric Rate is not null
SO 2 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Gas HPFF" AND
UOM = "LBHR"
HFF Calc S02 = HFF Sulfur * HFF Calc Volumetric Rate *2.0 / 7000, and round the result to 5 decimal places.
else if (Current Fuel Group == "GAS" AND HFFS02 Equation Code == "D-5" AND HFFS02 Emission Rate is not null
AND HFF Calc HI Rate is not null
SO 2 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Gas HPFF" AND
UOM = "LBHR"
HFF Calc S02 = HFF S02 Emission Rate * HFF Calc HI Rate, and round the result to 5 decimal places.
else if (Current Fuel Group == "OIL" AND HFF Sulfur is not null AND HFF Calc Mass Oil Rate is not null
SO2 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02 Oil HPFF" AND
UOM = "LBHR"
HFF Calc S02 = HFF Sulfur * HFF Calc Mass Oil Rate *2.0/100, and round the result to 1 decimal place.
If {HFF Calc S02 is not null)
If Current Fuel Flow Fuel UsagcTi mc > 0 AND Current Fuel Flow /?6'cwY/.FuclUsagcTiine <= 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. F ucl U sagcTi mc
else
SO2 App D Accumulator = -1
If (Current S02 HPFF Record. Pa rain Va 1F ucl >= 0)
if (ABSCHFF Calc S02 - Current S02 HPFF Record. Pa rain Va 1 Fuel) > S02 HPFF Tolerance)
return result A
else
SO2 App D Accumulator = -1
return result B
Environmental Protection Agency
Page 258 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode Critical Error Level 1
[fueled] is inconsistent with the recalculated value.
B The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode [fueled] Informational Message
could not be recalculated due to errors listed above.
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 259 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-28
Check Name: Determine Sulfur Content
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Fuel Type Reality Checks for Sulfur (Cross Check Table)
Fuel Type Warning Levels for Sulfur (Cross Check Table)
Table D-6 Missing Data Values (Cross Check Table)
Specifications:
HFF Sulfur = null
Current Sulfur Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "SULFUR"
If (Count >1)
return result A
Else If (Count == 0)
If (HFFS02 Equation Code in set {D-2, D-4})
return result B
Else if (HFFS02 Equation Code in set {D-2, D-4})
Current Sulfur Record = matching record
Sulfur UOM = Current Sulfur Record.PammeterUOMCode
If (Current Fuel Group == "GAS" AND Sulfur UOM <> "GRHSCF")
return result C
else if 0Current Fuel Group == "OIL" AND Sulfur UOM <> "PCT")
return result C
else if (Current Sulfur Record. Pa rain Va 1F ucl > 0)
Sulfur Default = null
If (Sulfur UOM == "GRHSCF")
Sulfur Precision = 1
else
Sulfur Precision = 4
If (Current Sulfur Record. SamplcTypcCodc == 8)
Sulfur Default = Lookup "MissingDataValue" in "Table D-6 Missing Data Values"
where "Parameter" column = "SULFUR" AND "FuelCode" column = Current Fuel Flow
Record. Fuel Code
If {Sulfur Default == null)
Max Expected Sulfur = Lookup "Upper Value" in "Fuel Flow Warning Levels for Sulfur Content Cross Check
Table"
where "Fuel Code" column = Current Fuel Flow Record.FuelCode
Min Expected Sulfur = Lookup "Lower Value" in "Fuel Flow Warning Levels for Sulfur Content Cross Check
Table"
where "Fuel Code" column = Current Fuel Flow Record.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
Environmental Protection Agency
Page 260 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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. Pa rain Va 1F ucl > 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. Pa rain Va 1F ucl 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. Pa ram Va 1F ucl is not rounded to Sulfur Precision)
return result I
else if Sulfur Default == Current Sulfur Record.ParamValFuel
HFF Sulfur == Current Sulfur Record.ParamValFuel
else
return result F
else
return result G
else
return result H
Results:
Result
A
B
C
D
E
F
G
H
I
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You reported a formula with a FormulaCode of [code] in the HPFF record for S02 for
FuelCode [fueled], but you did not report an HPFF record for SULFUR. Use of this
formula to calculate S02 requires the reporting of the fuel's sulfur content.
The ParameterUOMCode reported in the HPFF record for SULFUR for FuelCode
[fueled] is missing or invalid.
The ParameterValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is outside the range of allowable values for the fuel type.
The Parameter ValueForFuel 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 Parameter ValueForFuel does
not equal the default value for the fuel.
The Parameter ValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is invalid. The value should be greater than 0.
You reported an HPFF record for [parameter] for FuelCode [fueled], but you do not
require this value to calculate S02.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 261 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-29
Check Name:
Check Extraneous Sulfur Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If {Current Sulfur Record is not null)
If (Current Su//m/* . Formu 1 a Idcn t i ficr 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. ScgmcntNumbcr is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If {Current Sulfur . Opcrat i ngCondi t ionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If {Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for SULFUR for FuelCode [fueled].
This data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 262 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-30
Check Name: Check Sulfur Sample Type
Related Former Checks:
Applicability: Appendix D Check
Description:
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 Response Severity
A The SampleTypeCode reported in the HPFF record for SULFUR for FuelCode [fueled] Critical Error Level 1
is missing or invalid.
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 263 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-31
Check Name: Determine S02 Emission Rate
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
HFF S02 Emission Rate = null
Current S02R Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "S02R"
If (Count >1)
return result A
Else If (Count == 0)
If (HFFS02 Equation Code== "D-5")
return result B
Else if (HFFS02 Equation Code== "D-5")
Current S02R Record = matching record
If (Current S()2R Record. Pa ra mctc rUOM Code <> "LBMMBTU"}
return result C
else if (Current S()2R Record. Pa ra ln Va lFuel > 0)
HFF S02 Emission Rate = Current S()2 R Record. Pa ra l n Va lFuel
else
return result D
else
return result E
Results:
Result
A
B
C
D
E
Usage:
1
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You reported a formula with a FormulaCode of "D-5" in the HPFF record for S02 for
FuelCode [fueled], but you did not report an HPFF record for S02R. Use of formula
D-5 to calculate S02 requires the reporting of the S02 emission rate for the fuel.
The ParameterUOMCode reported in the HPFF record for S02R for FuelCode [fueled]
is missing or invalid. The value should be "LBMMBTU".
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.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 264 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-32
Check Name:
Check Extraneous S02R Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current S02R Record is not null)
If (Current S()2R Record. M o n i t o r i ng S v s t e m ID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current S()2R Record. SegmcntN umbe r is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If (Current S()2R Record.Opcrat i ngCondi t ionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current S()2R Record. Sa mp 1 cTypcCode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for S02R for FuelCode [fueled]. This
data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 265 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-33
Check Name: Check S02R Formula
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current S02R Record is not null)
If (Current S()2R Record. Formu 1 a Idcn t i ficr 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 S()2 R Record. IVI o n i t o r i ng Fo r m u 1 a ID
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
Response
You did not report a FormulalD in the HPFF record for S02R for FuelCode [fueled].
This formula is required except when using the standard default emission rate of
0.0006 for pipeline natural gas.
You reported FormulalD [ID] in the HPFF record for S02R for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for S02R for FuelCode [fueled], but
this is not an S02R formula.
The FormulaCode of FormulalD [ID] reported in the HPFF record for S02R for
FuelCode [fueled] is invalid. The FormulaCode should be "D-1H".
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 266 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-34
Check Name: Check Reported S02 Mass Rate
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current S02 HPFFRecord is not null)
If (Current S02 HPFF Record. Pa rain Va 1F ucl is null or is less than 0
return result A
else if (Current Fuel Group == "OIL" AND Current S02 HPFF Record. Pa rain Va 1F ucl is not rounded to one decimal place)
return result B
Results:
Result
A
B
Response
The ParameterValueForFuel reported in the HPFF record for S02 for FuelCode
[fueled] is invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Severity
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 267 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-35
Check Name: Determine FC Factor
Related Former Checks:
Applicability: Appendix D Check
Description:
Validation Tables:
Fuel Type Reality Checks for FC FACTOR (Cross Check Table)
Specifications:
HFF Fc Factor = null
Current Fc Factor Record = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "FC"
If (Count >1)
return result A
Else If (Count == 0)
If (Current C02 HPFFRecord is not null)
return result B
Else if (Current C02 HPFF Record is not null)
Current Fc Factor Record = matching record
If {Current Fc Factor Record.ParameterUOMCode <> "SCFCBTU")
return result C
else if (Current FcFactor Record. Pa rain Va 1F ucl > 0)
if {Current FcFactor Record.ParamValFuel is not rounded to one decimal place)
return result G
else
HFF Fc Factor = Current Fc Factor Record. Pa rain Va 1F ucl
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. Pa ram Va 1F ucl > Max Allowed Fc Factor)
OR {Min Allowed FcFactor is not null AND Current Fc Factor Record. Pa ram Va 1F ucl < Min Allowed Fc Factor)
return result D
else
return result E
else
return result F
Environmental Protection Agency
Page 268 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
Usage:
1
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
You reported an HPFF record for C02 for FuelCode [fueled], but you did not report an
HPFF record for FC for the hour.
The ParameterUOMCode reported in the HPFF record for FC for FuelCode [fueled] is
missing or invalid.
The ParameterValueForFuel reported in the HPFF record for [parameter] for FuelCode
[fueled] is outside the range of allowable values for the fuel type.
The ParameterValueForFuel reported in the HPFF record for FC for FuelCode [fueled]
is invalid.
You reported an HPFF record for FC for FuelCode [fueled], but you have not reported
an HPFF record for C02 for the hour.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 269 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-36
Check Name:
Check Extraneous Fc Factor Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current Fc Factor Record is not null)
If (Current Fc Factor Formu 1 a Idcn t i ficr is not null)
append "Formulaldentifier" to Hourly Extraneous Fields
If (Current Fc Factor Ttecon/.MonitoringSystemID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current Fc Factor Record. SegmentNumber is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If (Current Fc Factor Opcrat i ngCondi t ionCode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If {Current Fc Factor Record. SampleTypeCode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
You reported [fieldnames] in the HPFF record for FC for FuelCode [fueled]. This data Non-Critical Error
should be blank.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 270 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-37
Check Name: Validate C02 Record
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
Current C02 HPFFRecord = null
Count the HourlyParamFuelFlow record where
HourlyParamFuelFlow.HourlyFuelFlowID = Current Fuel Flow Record.HourlyFuelFlowID AND
HourlyParamFuelFlow.ParameterCode = "C02"
If (Count >1)
C02 App D Accumulator = -1
return result A
Else If (Count == 0)
If (CO 2 App D Method Active For Hour == true)
C02 App D Accumulator = -1
If (Legacy Data Evaluation == false)
return result B
else
return result H
Else if (C()2 App D Method Active For Hour == true)
Current CO2 HPFF Record = matching record
CO2 HPFF Exists = true
if (Current C02 //PFF^ecwY/.MonitoringForinulald is null
return result C
else
Cur C02 Mon Formula Record = Lookup active formula in MonitoringFormula Table where
MonitoringFormulalD = Current C02 HPFF /?6'cmy/ . M o n i t o r i ng Fo r m u 1 a ID
if (Cur C02 Mon Formula Record is null)
return result D
else if (Cur C02 Mon Formulai?ecor "C02")
return result E
else if (Cur C02 Mon Formula Record.EquationCode <> "G-4")
return result F
else
return result G
Environmental Protection Agency
Page 271 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
Response
You reported more than one HPFF record for [parameter] for FuelCode [fueled] for the
hour.
Your monitoring plan indicates the use of the Appendix D C02 method, but you did
not report an HPFF record for C02 for FuelCode [fueled] for the hour.
You did not report a FormulalD in the HPFF record for C02 for FuelCode [fueled].
You reported FormulalD [ID] in the HPFF record for C02 for FuelCode [fueled], but
there is no active Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the HPFF record for C02 for FuelCode [fueled], but
this is not a C02 formula.
The FormulaCode of FormulalD [ID] reported in the HPFF record for C02 for
FuelCode [fueled] is invalid. The FormulaCode should be "G-4".
You reported an HPFF record for C02 for FuelCode [fueled], but you do not have an
active Appendix D C02 method for the hour.
Your monitoring plan indicates the use of the Appendix D C02 method, but you did
not report an HPFF record for C02 for FuelCode [fueled] for the hour. Fuel-specific
C02 emissions data was not required in the EDR data, but is required for all data
submitted through ECMPS. The software will not recalculate C02 emissions values.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 272 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-38
Check Name:
Check Extraneous C02 Record Fields
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
Hourly Extraneous Fields = null
If (Current C02 HPFFRecord is not null)
If (Current C02 HPFF/?6'cmy/. Moni tori ngSystcm ID is not null)
append "MonitoringSystemID" to Hourly Extraneous Fields
If (Current C02 HPFF Record. ScgmcntNumbcr is not null)
append "SegmentNumber" to Hourly Extraneous Fields
If (Current C02 HPFF Record. O pc ra t i n g Co n d i t i o n C ode is not null)
append "OperatingConditionCode" to Hourly Extraneous Fields
If (Current C02 HPFF Record. S a m p 1 cTy pc C ode is not null)
append "SampleTypeCode" to Hourly Extraneous Fields
If (Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
Response
You reported [fieldnames] in the HPFF record for C02 for FuelCode [fueled]. This
data should be blank.
Severity
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 273 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-39
Check Name:
Calculate C02 Mass Rate
Related Former Checks:
Applicability:
Appendix D Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
HFFCalc C02 = null
If (Current C02 HPFFRecord is not null)
if (HFF Calc HI Rate is not null AND HFF Fc Factor is not null)
C02 HPFF Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "C02" AND
UOM = "TNHR"
HFF Calc C02 = HFF Calc HI Rate * HFF Fc Factor * 44.0 / (385.0 * 2000.0), and round the result to one decimal
place.
If Current Fuel Flow Fuel UsagcTi mc > 0 AND Current Fuel Flow /?6'cwY/.FuclUsagcTiine <= 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 F ucl U sagcTi mc
else
CO2 App D Accumulator = -1
If (Current C02 HPFF Record. Pa rain Va 1F ucl >= 0)
if (ABSCHFFCalc C02 - Current C02 HPFF Record. Pa rain Va 1 Fuel) > C02 HPFF Tolerance)
return result A
else
C02 App D Accumulator = -1
return result B
Results:
Result
A
Response
The ParameterValueForFuel reported for HPFF record for C02 for FuelCode [fueled] is
inconsistent with the recalculated value.
The ParameterValueForFuel in the HPFF record for [parameter] for FuelCode [fueled]
could not be recalculated due to errors listed above.
Severity
Critical Error Level 1
B
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 274 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAD-40
Check Name:
Check Reported C02 Mass Rate
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
If (Current C02 HPFFRecord is not null)
If (Current C02 HPFF Record. Pa rain Va 1F ucl is null or is less than 0
return result A
else if (Current C02 HPFFRecord.ParamValFuel is not rounded to one decimal place)
return result B
Results:
Result
A
Response
The ParameterValueForFuel reported in the HPFF record for C02 for FuelCode
[fueled] is invalid. The value should be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 275 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-44
Check Name: Check C02 Units Of Measure
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current C02 HPFFRecord is not null)
If (Current C02 HPFF Record Pa ra mctc rUOM Code <> "TNHR")
return result A
Results:
Result Response Severity
A The ParameterUOMCode reported in the HPFF record for C02 for FuelCode [fueled] Critical Error Level 1
is missing or invalid. The value should be "TNHR".
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 276 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAD-45
Check Name: Determine Appendix D Measure Codes
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If (Current Fuel FlowRecord.SourceOfDataMassCode in set {4, 5, 6} OR Current Fuel Flow Record.SowceOfDataVolumetricCode 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 FlowRecord.SourceOfDataMassCode in set {1, 3} OR Current Fuel FlowRecord.SowceOfDataVolumetiicCode
in set {1, 3})
if (Monitor Measure Code Array for "FF" begins with "MEAS")
set Monitor Measure Code Array for "FF" to "MEAS SUB"
else
set Monitor Measure Code Array for "FF" to "SUB"
else if (Current Fuel FlowRecord.SourceOfDataMassCode in set {0, 9} OR Current Fuel FlowRecord.SowceOfDataVolumetiicCode
in set {0, 9}))
if (Monitor Measure Code Array for "FF" contains "SUB")
set Monitor Measure Code Array for "FF" to "MEAS SUB"
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 "MEAS SUB"
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 "MEAS SUB"
else
set Monitor Measure Code Array for "SULFUR" to "MEASURE"
if (Current GC VRecord is not null)
if (Current GC VRecord. SampleTypeCode == 8)
if (Monitor Measure Code Array for "GCV" begins with "MEAS")
set Monitor Measure Code Array for "GCV" to "MEASSUB"
else
set Monitor Measure Code Array for "GCV" to "SUB"
else if (Current GCV Record. SampleTypeCode in set {0, 1, 2, 3, 4, 5, 6, 7})
if (Monitor Measure Code Array for "GCV" contains "SUB")
set Monitor Measure Code Array for "GCV" to "MEASSUB"
else
set Monitor Measure Code Array for "GCV" to "MEASURE"
if (Current Density Record is not null)
if (Current Density Record. SampleTypeCode == 8)
if (Monitor Measure Code Array for "DENSITY" begins with "MEAS")
set Monitor Measure Code Array for "DENSITY" to "MEASSUB"
else
set Monitor Measure Code Array for "DENSITY" to "SUB"
else if (CurrentDensity Record. SampleTypeCode in set {1, 2, 5, 6, 7})
if (Monitor Measure Code Array for "DENSITY" contains "SUB")
Environmental Protection Agency
Page 277 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
set Monitor Measure Code Array for "DENSITY" to "ME AS SUB"
else
set Monitor Measure Code Array for "DENSITY" to "MEASURE"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 278 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Appendix E
Environmental Protection Agency
Page 279 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-1
Check Name: Initialize AE Reporting Method
Related Former Checks:
Applicability: Appendix E Check
Description: Determines whether Appendix E Reporting is from a single fuel source, multiple fuel sources, or a Constant
Mix Fuel Source
Specifications:
App E Reporting Method = null
App E Op Code = null
App E Segment Number = null
App E Reported Value = null
App E Fuel Code = null
App E Calc HI = null
if {Current NOx Rate Method Code == "AE")
Total Fuel Sources = Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil
II App E Constant Fuel Mix detected when processing DHV records
if (Total Fuel Sources > 1)
App E Reporting Method = 'MULTIPLE"
else if (Total Fuel Sources == 1)
App E Reporting Method = "SINGLE"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 280 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-2
Check Name: Validate NOXR Record
Related Former Checks:
Applicability: Appendix E Check
Description: Locates the appropriate NOXR HourlyParamFuelFlow record for current fuel flow record
Specifications:
Current App E NOXR Record = null
AppE 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 AppE 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
AppE Segment Number = Current AppE NOXR Record. SegmentNumber
App E Reported Value = Current App E NOXR Record. Pa rain Va 1F ucl
AppE Calc HI = HFF Calc HI Rate
App E Fuel Code = Current Fuel Flow Record.FuelCode
if Current Appe ENOXR /?6'ewY/.OpcratingConditionCodc in set {E, X, Y, Z, U, W, N, M}
App E Op Code = Current App E NOXR Record. O pc ra t i n g Co n d i t i o n Code
else
App E Op Code = null
return result C
else if (App EReporting Method == "CONSTANT")
return result D
else
return result E
Environmental Protection Agency
Page 281 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Usage:
1
Response
You did not report an HPFF record for NOXR to report the NOx emission rate for
individual fuels.
You reported more than one HPFF record for NOXR for FuelCode [fueled] for the
hour.
The OperatingConditionCode reported in the HPFF record for NOXR for FuelCode
[FUELCD] is missing or invalid.
You reported an HPFF record for NOXR, but, according to your monitoring plan, you
use an Appendix E mixed fuel curve to determine the NOx emission rate. If this is the
case, you should report the NOx emission rate in a NOXR DHV record. The HPFF
record will not be evaluated and the NOx emissions rate will not be recalculated.
You reported an HPFF record for NOXR, but you have not defined a NOXR AE
method in your monitoring plan that is active during the current hour. The HPFF
record will not be evaluated and the NOx emissions rate will not be recalculated.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hourly Fuel Flow
Environmental Protection Agency
Page 282 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAE-4
Check Name:
Check for Extraneous Fields in NOXR Record
Related Former Checks:
Applicability:
Appendix E Check
Description:
Specifications:
Hourly Extraneous Fields = null
if {Current App E NOXR Record is not null)
if {Current App E NOXR Record. Sa mp 1 cTypcCode is not NULL)
append "SampleTypeCode" to Hourly Extraneous Fields
if {Current App E NOXR /?6'cmy/. Moni tori ngFormu 1 a Id is not NULL)
append "MonitoringFormulalD" to Hourly Extraneous Fields
If {Hourly Extraneous Fields is not null)
return result A
Results:
Result
A
You reported [fieldnames] in the HPFF record for NOXR for FuelCode [fueled]. This Non-Critical Error
data should be blank.
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 283 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-5
Check Name: Check Monitoring System Data for Appendix E NOXR
Related Former Checks:
Applicability: Appendix E Check
Description: Verifies whether monitoring system reported for Appendix E NOXR meets the reporting requirements
Specifications:
if {Current App E NOXR Record is not null)
App E NOXE System ID = null
App E NOXE System Identifier = null
if {Current App E NOXR /?6'cmy/. IVIoni tori ngSystcm Id is null)
if (Current App ENOXR /?6'ewY/.OpcratingConditionCodc == "E")
if {HFF Fuel Indicator Code <> "E")
return result A
else
return result B
// report Monitoring System in all other cases
else
Current App E NOXR Mon Sys Record = find MonitoringSystem record where
MonitoringSystem.MonitoringSystemld = Current App E NOXR Record .MonitoringSystemld
if {Current App E NOXR Mon Sys Record is null)
return result C
else if {Current App E NOXR Mon ,SV.v Record. SystcmTypcCodc <> "NOXE"
return result D
else if {Current App E NOXR Mon Sys RecordFvlqXCo&q <> Current Fuel Flow Record.FuelCode
return result E
else
App E NOXE System ID = Current App E NOXR Record .MonitoringSystemld
App E NOXE System Identifier = Current App E NOXR Mon Sys Record. Systemldentifier
Results:
Result
A
B
C
D
E
Response
The OperatingConditionCode of E reported in the HPFF record for NOXR 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 FuelCode
[fueled], but you did not report an OperatingConditionCode of E. You must report a
NOXE MonitoringSystemID for non-emergency fuels.
You reported MonitoringSystemID [ID] in the HPFF record for NOXR for FuelCode
[fueled], but there is no MonitorSystem record for this system in your monitoring plan
that was active during the hour.
You reported MonitoringSystemID [ID] in the HPFF record for NOXR for FuelCode
[fueled], but this system is not a NOXE monitoring system.
You reported NOXE MonitoringSystemID [ID] in the HPFF record for NOXR, but the
FuelCode of this system is not equal to FuelCode [fueled] in the associated HFF record.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 284 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAE-7
Check Name:
Related Former Checks:
Retrieve Appendix E Correlation Test Results or Default Value
Applicability:
Description:
Appendix E Check
Finds most recent successful test results for Appendix E Tests in QASupplementalData or TestSummary
Records
Specifications:
Maximum App E Curve NOx Emission Rate = null
App E NOx MER = null
App E Segment Total = null
If (App E Op Code in set {N, W, X, Y, Z} )
if (Current Appendix E Status begins with "IC" or "Undetermined")
QA Supp Attribute Count Record = matching record in QASuppAttribute where
QASuppAttribute.QASuppDatald = Prior Appendix E Record.QASwppDatald
QASuppAttribute. AttributeName = "SEGMENTCOUNT"
if (QA Supp Attribute Count Record is not null)
App E Segment Total = QA Supp AttributeCount Record. Attribute Value
Dimension App E Correlation NOx Rate Array with App E Segment Total elements
Dimension App E Correlation Heat Input Array with App E Segment Total elements
for (X = 1 to App E Segment Total)
QA Supp Attribute Segment NOx Record = matching record in QASuppAttribute where
QASuppAttribute.QASuppDatald = Prior Appendix E Record.QASwppDatald
QASuppAttribute. AttributeName = "NOX RATE X" (where X matches the loop variable)
if (QA Supp Attribute Segment NOx Record is not null)
if (QA Supp Attribute Segment NOx Record .Attribute Value > Maximum App E Curve NOx
Emission Rate
Maximum App E Curve NOx Emission Rate = QA Supp Attribute Segment NOx
Record. AttributeValue
App E Correlation NOx Rate Array[X\ = QA Supp Attribute Segment NOx
Record. AttributeValue
QA Supp Attribute Segment HI Record = matching record in QASuppAttribute where
QASuppAttribute.QASuppDatald = Prior Appendix E Record.QASwppDatald
QASuppAttribute. AttributeName = "HI RATE X" (where X matches the loop variable)
if (QA Supp Attribute Segment HI Record is not null)
App E Correlation Heat Input Array[X\ = QA Supp Attribute Segment HI Record. Attribute Value
else if (App E Op Code in set {E, M, U} )
Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code
if (Count <> 1)
Environmental Protection Agency
Page 285 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result A
AppE NOxMER Default Record = matching record
If {AppENOxMER DefauIt RecordDcfau 11 Va 1 lie > 0
App E NOx MER = AppE NOxMER Defau It Record. D c fa u 11 Va 1 lie
else
return result B
Results:
Result Response Severity
A The NOx emission rate could not be determined, because you did not report one and Critical Error Level 1
only one missing data default record for NORX for FuelCode [fueled] in your
monitoring plan that was active during current hour.
B The NOx emission rate could not be determined, because the Default Value in the Critical Error Level 1
NORX default record for FuelCode [fueled] is invalid.
Usage:
1
Process/Category:
Emissions Data Evaluation Report — Hourly Configuration Evaluation
Conditions:
App E Checks Needed Equals true
2
Process/Category:
Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Conditions:
App E Constant Fuel Mix Equals true
3
Process/Category:
Emissions Data Evaluation Report Hourly Fuel Flow
Conditions:
App E Constant Fuel Mix Equals false
Environmental Protection Agency
Page 286 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-8
Check Name: Determine Appendix E Curve Segment
Related Former Checks:
Applicability: Appendix E Check
Description:
Specifications:
App E Calc Segment Num = null
if (App E Op Code is not null)
switch (App E Op Code)
case "E" or "U" or "M" or "W":
if App E Segment Number is not null
return result A
case "N" or "X":
If (App E Segment Total is not null)
if App E Segment Number is not null
if [App E Segment Number > number of elements in the App E Correlation NOx Rate Array)
return result B
else if (App E Correlation NOx Rate Array [App E Segment Number] <> 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 (i <= App E Segment Total AND App E Calc HI <= App E Correlation Heat Input Array[i\)
App E Calc Segment Num = i
if (App E Op Code == "Z")
if (App E Calc Segment Num <> 1)
return result C
else if App E Segment Number is null
if (Legacy Data Evaluation == false)
return result G
else if (App E Segment Number <> 1)
return result D
else if App E Segment Number is null
Environmental Protection Agency
Page 287 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (Legacy Data Evaluation == false)
return result G
else if (App E Calc HI == App E Correlation Heat Input Array[i])
if (App E Segment Number <> App E Calc Segment 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
return result F
Results:
Result
A
B
C
D
E
F
Usage:
1
2
3
Response
You reported a SegmentNumber in the HPFF or DHV record for NOXR for FuelCode
[fueled]. This field should be blank when OperatingConditionCode is [OpCode].
You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF record for
NOXR for FuelCode [fueled], but the reported SegmentNumber does not represent the
segment on the Appendix E curve with the maximum NOx emission rate.
You reported an OperatingConditionCode of Z in the DHV or HPFF record for NOXR
for FuelCode [fueled], but the calculated heat input rate is not below the lowest point
on the Appendix E curve.
You reported an OperatingConditionCode of Z in the DHV or HPFF record for NOXR
for FuelCode [fueled], but you did not report a SegmentNumber of 1.
The SegmentNumber reported in the HPFF or DHV record for NOXR for FuelCode
[fueled] is inconsistent with the calculated heat input.
You reported an OperatingConditionCode of [OpCode] in the DHV or HPFF record for
NOXR for FuelCode [fueled], but the calculated heat input rate is higher than the
maximum heat input rate on the Appendix E curve. You should report an
OperatingConditionCode of W, and use the appropriate substitute data algorithm to
calculate the NOx emission rate.
You did not report a SegmentNumber in the HPFF or DHV record for NOXR for
FuelCode [fueled].
Severity
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category:
Conditions:
Process/Category:
Conditions:
Process/Category:
Conditions:
Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true
Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
App E Constant Fuel Mix Equals true
Emissions Data Evaluation Report Hourly Fuel Flow
App E Constant Fuel Mix Equals false
Environmental Protection Agency
Page 288 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-9
Check Name: Calculate Appendix E NOx Rate
Related Former Checks:
Applicability: Appendix E Check
Description: For Appendix E data that was extrapolated to the piecewise linear curve under conditions where the Operating
Condition Code was reported as" "Y", this check ensures that the reported value matches the calculated value
based on heat input.
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
App E Calculated NOx Rate for Source = null
if (App E Op Code in set {Y, Z})
If (App E Calc Segment Num is not null)
if (App E Calc Segment Num ==1)
App E Calculated NOx Rate for Source = App E Correlation NOx Rate Array[\\
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 - y 1) / (x2 - xl)
App E Calculated NOx Rate for Source = slope * (App E Calc HI - x 1) + y 1, and round the result to 3 decimal
places.
else if (App E Op Code in set {N, X})
App E Calculated NOx Rate for Source = Maximum App E Curve NOx Emission Rate
else if (App E Op Code in set {E, M, U})
App E Calculated NOx Rate for Source = App E NOx MER
else if (App E Op Code == "W" AND Maximum App E Curve NOx Emission Rate is not null AND App E Reported Value >= 0 AND
App E Reported Value is rounded to three decimal places)
If (App E Reported Value >= Maximum App E Curve NOx Emission Rate *1.25 (rounded to 3 decimal places))
App E Calculated NOx Rate for Source = App E Reported Value
Count active MonitoringDefault record for location where
ParameterCode = "NORX" AND
DefaultPurpose = "MD" AND
FuelCode = App E Fuel Code
if (Count <> 1)
return result A
else
NOx MER Default Record = matching record
Environmental Protection Agency
Page 289 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (NOxMER Default Record .Default Value > 0)
If (App E Reported Value >= NOxMER Default Record .Default Value)
App E Calculated NOx Rate for Source = App E Reported Value
else
if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result B
else
NOXRAppE Accumulator = -1
return result C
else
if (App E Reporting Method == "CONSTANT" or "APPORTIONED")
return result D
else
NOXRAppE 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 EReporting 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 EReporting Method == "APPORTIONED")
Apportionment Calc NOXR Array at this Location = App E Calculated NOx Rate for Source
if (Rpt Period NOx Rate Calculated Accumulator Array for this location is not null)
if (Rpt Period NOx Rate Calculated Accumulator Array for this location >= 0)
Rpt Period NOx Rate Calculated Accumulator Array for this location = Rpt Period NOx Rate
Calculated Accumulator Array for this location + App E Calculated NOx Rate for Source
else
Rpt Period NOx Rate Calculated Accumulator Array for this location = App E Calculated NOx Rate for
Source
Rpt Period NOx Rate Hours Accumulator Array for this location = Rpt Period NOx Rate Hours Accumulator Array
for this location + 1
Set Current Measure Code to the Monitor Measure Code Array for "NOXR".
if (App E Reported Value >= 0 AND ABS(App E Calculated NOx Rate for Source - App E Reported Value) > NOXR
HPFF Tolerance)
return result E
If Current Fuel Flow Fuel UsagcTi mc > 0 AND Current Fuel Flow /?6'cwY/.FuclUsagcTiine <= 1 AND NOXR
App EAccumulator >= 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. Fucl UsagcTi inc * App E Calc HI)
else
NOXR App E Accumulator = -1
Environmental Protection Agency
Page 290 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 EReporting Method == "CONSTANT")
return result G
else if (App EReporting Method == "APPORTIONED")
Apportionment Calc NOXR Array at this Location = -1
Rpt Period NOX Rate Calculated Accumulator Array for this location = -1
return result G
else if (App E Op Code is not null)
NOXR App E Accumulator = -1
return result H
Results:
Result
A
B
C
D
E
F
G
H
Response
The NOx emission rate could not be determined, because you did not report one and
only one missing data default record for NORX for FuelCode [fueled] in your
monitoring plan that was active during current hour.
You reported an OperatingConditionCode of W in the DHV record for NOXR for
FuelCode [fueled], but the 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.
The NOx emission rate could not be determined, because the Default Value in the
NORX default record for FuelCode [fueled] is invalid.
The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with
the recalculated value.
The Parameter ValueForFuel 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 Parameter ValueForFuel in the HPFF record for [parameter] for FuelCode [fueled]
could not be recalculated due to errors listed above.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Informational Message
Usage:
1
2
3
Process/Category:
Conditions:
Process/Category:
Conditions:
Process/Category:
Conditions:
Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true
Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
App E Constant Fuel Mix Equals true
Emissions Data Evaluation Report Hourly Fuel Flow
App E Constant Fuel Mix Equals false
Environmental Protection Agency
Page 291 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAE-13
Check Name:
Check Reported NOx Emission Rate
Related Former Checks:
Applicability:
Appendix D Check
Description:
Specifications:
If {Current Appe E NOXR Record is not null)
If {Current App E NOXR Record. Pa rain Va 1F ucl is null or is less than 0
return result A
else if {Current App E NOXR Ttecon/.ParamValFuel is not rounded to three decimal places)
return result B
Results:
Result
A
Response
The ParameterValueforFuel reported in the HPFF record for NOXR for FuelCode
[fueled] is invalid. The value must be greater than or equal to 0.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 292 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAE-14
Check Name: Check NOXR Units Of Measure
Related Former Checks:
Applicability: Appendix D Check
Description:
Specifications:
If {Current App E NOXR Record is not null)
If {Current App ENOXR Record.Para mete rUOM Code <> "LBMMBTU")
return result A
Results:
Result Response Severity
A The ParameterUOMCode reported in the HPFF record for NOXR for FuelCode Critical Error Level 1
[fueled] is missing or invalid. The value should be "LBMMBTU".
Usage:
1 Process/Category: Emissions Data Evaluation Report Hourly Fuel Flow
Environmental Protection Agency
Page 293 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAE-15
Check Name:
Determine Appendix E Measure Code
Related Former Checks:
Applicability:
Appendix E Check
Description:
Specifications:
if (App E Op Code is not null)
If (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"
Results:
Result
Response
Severity
Usage:
2
3
Process/Category:
Conditions:
Process/Category:
Conditions:
Process/Category:
Conditions:
Emissions Data Evaluation Report — Hourly Configuration Evaluation
App E Checks Needed Equals true
Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
App E Constant Fuel Mix Equals true
Emissions Data Evaluation Report Hourly Fuel Flow
App E Constant Fuel Mix Equals false
Environmental Protection Agency
Page 294 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Apportionment
Environmental Protection Agency
Page 295 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-1
Check Name:
Determine Monitoring Plan Configuration
Related Former Checks: HOUROP-28
Applicability:
Description:
CEM Check
Determines whether the current MP is a Common Stack, Multistack, or simple Unit
Specifications:
MP Stack Config for Hourly Checks = null
MP Pipe Config for Hourly Checks = null
MP Load UOM = null
MP Unit Load = null
Stack OpTime Accumulator = 0
Stack LoadTimesOpTime Accumulator = 0
Pipe LoadTimesOpTime Accumulator = 0
Config HeatlnputTimesOpTime Accumulator = 0
ConfigNOxRateTimesHeatlnput Accumulator = 0
ConfigNOxRateTimesOpTime Accumulator = 0
Config OpTime Accumulator = 0
Config Heatlnput Accumulator = 0
Max Stack OpTime = 0
Unit OpTime Accumulator = 0
Unit LoadTimesOpTime Accumulator = 0
Unit HeatlnputTimesOpTime Accumulator = 0
Max Unit OpTime = 0
CP Fuel Count = 0
Current Month = month from Current Date
App E Reporting Method = null
App E Op Code = null
App E Segment Number = null
App E Reported Value = null
App E Fuel Code = null
App E Calc HI = null
App E NOXE System ID = null
App E NOXE System Identifier = null
CurrentAppendixEStatus = null
EarliestLocationReportDate = null
Current Measure Code = null
MATS MSI Hg DHVID = null
MATS MSI HCL DHVID = null
MATS MSI HF DHVID = null
MATS MSI S02 DHVID = null
MATS Parameter Plugin Hg = null
MATS Parameter Plugin HCL = null
MA TS Parameter Plugin HF = null
MATS Parameter Plugin S02 = null
MATS MSI Hg Unadjusted Hourly Value = null
MATS MSI HCL Unadjusted Hourly Value = null
MATS MSI HF Unadjusted Hourly Value = null
MATS MSI S02 Unadjusted Hourly Value = 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
Environmental Protection Agency Page 296 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Apportionment CalcNOXRArray - set each element in array to 0.0
Apportionment HI Method Array - set each element in array to null
Apportionment NOX Method Array - set each element in array to null
Apportionment HI Measure Code Array - set each element in array to null
Apportionment NOXR Measure Code Array - set each element in array to null
Apportionment Stack Unit List - set each element in array to null
Apportionment NOXR Method Array - set each element in array to null
Apportionment Stack Flow Array - set each element in array to null
Apportionment MATS Load Array - set each element in array to null
Apportionment Hg Rate Array - set each element in array to null
Apportionment HCL Rate Array - set each element in array to null
Apportionment HFRate Array - set each element in array to null
Apportionment S02 Rate Array - set each element in array to null
MATS MSI HgMODC Code Array - set each element in array to null
MATS MSI HCLMODC Code Array - set each element in array to null
MATS MSI HFMODC Code Array - set each element in array to null
MATS MSI S02 MODC Code Array - set each element in array to null
If Current Location Count > 1
Find List of MonitorLocationlds in Monitor Plan Location 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 \ fori i lor Location.SVAckPlpc\D is not null,
set Stack Unit Count to 0
for each UnitStackConfiguration record where
BeginDate <= Current Date AND EndDate >= Current Date AND
StackPipeld = MonitorLocation. StackPipeLd
add 1 to Stack Unit Count
append MonitorLocationID of the unit to Apportionment Stack Unit List for the stack location
if (StackPipeUnit Count > 0)
if (Mo«/'forZocaft'o«.StackPipeNamebegins with "MS")
add 1 to MS Count
else if (Mo«/'forZocaft'o«.StackPipeNamebegins with "MP")
add 1 to MP Count
else if (Mo«/'forZocaft'o«.StackPipeNamebegins with "CS")
Environmental Protection Agency
Page 297 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
add 1 to CS Count
f (CS Count == 1)
CS Unit Count = Stack Unit Count
else if (Mo«/'forZocaft'o«.StackPipeNamebegins 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 (UnitCount == 1)
Unit MS Count = number of UnitStackConfiguration records where
UnitStackConfigurationBegmDate <= Current Date AND
UnitStackConfigurationHndDatQ >= Current Date AND
UnitStackConfiguration.UnitlD = MonitorLocation. Unitld
UnitStackConfiguration. StackPipeName begins with "MS"
if (MS Count > 1 AND CS Count == 0 AND Unit Count == 1 AND MS Count == Unit MS Count)
MP Stack Config for Hourly Checks = 'MS"
Multiple Stack Configuration = true
else if (CS Count == 1 AND MS Count == 0 AND Unit Count > 1 AND Unit Count == CS Unit Count)
MP Stack Config for Hourly Checks = "CS"
else if (CS Count == 1 AND MS Count > 0)
MP Stack Config for Hourly Checks = "CSMS"
else if (CS Count + MS Count > 0)
MP Stack Config for Hourly Checks = "COMPLEX"
If (CP Count ==1 AND MP Count == 0 AND Unit Count > 1 AND Unit Count == CP Unit Count)
MP Pipe Config for Hourly Checks = "CP"
else if (CP Count + MP Count > 0)
MP Pipe Config for Hourly Checks = 'MULTIPLE"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Initialization
Environmental Protection Agency
Page 298 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAPP-2
Check Name: Pre-Validate Heat Input Calculation
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Calculate Apportioned HI = false
Calculate NOXM From Apportioned HI = false
if Current Monitor Plan Location . S tackPi pc ID is not null
If the StackPipelD of the monitoring location begins with "CS",
set Current HI Entity Type = "CS"
If the StackPipelD of the monitoring location begins with "CP",
set Current HI Entity Type = "CP"
If the StackPipelD of the monitoring location begins with "MS",
set Current HI Entity Type = 'MS"
If the StackPipelD of the monitoring location begins with "MP",
set Current HI Entity Type = 'MP"
else if the UnitID of the monitoring location is not null
set Current HI Entity Type = "Unit"
If {Apportionment HI Method Array for the location contains "CALC") OR {Apportionment HI Method Array for the location ==
"COMPLEX")
If {MP Pipe Configfor Hourly Checks == "CP" AND CP Fuel Count > 1)
Apportionment HI Method Array for the location == "NOCALC"
If {Apportionment OpTimeArray for the location > 0 AND Apportionment OpTimeArray for the location <= 1)
// F-25
If {MPStack Configfor Hourly Checks == "CS" AND Current HI Entity Type = "CS")
if {Apportionment NOX Method Array == "NOXR")
Calculate NOXM From Apportioned HI = true
If Apportionment OpTime Array for the location < Max Unit OpTime
return result A
else if Apportionment OpTime Array for the location > Unit OpTime Accumulator + (the number of units in the
monitoring plan * .005)
return result B
else
If {ConfigHeatlnputTimesOpTimeAccumulator > 0)
Calculate Apportioned HI = true
if (MPLoad UOM <> "INVALID" AND StackLoadTimesOpTimeAccumulator > 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 Configfor Hourly Checks == "CP") AND
Environmental Protection Agency
Page 299 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 Configfor Hourly Checks <> "CP" AND MP Stack Config for Hourly Checks == "CS"
AND StackLoadTimesOpTimeAccumulator > 0 AND UnitLoadTimesOpTimeAccumulator > 0 AND
(Stack LoadTimesOpTime Accumulator - Unit LoadTimesOpTime Accumulator) > number of items in
the Apportionment OpTime Array)
return result C
else if (Config HeatlnputTimesOpTime Accumulator >= 0 AND Apportionment Load Array for this
Location >= 0 AND Unit LoadTimesOpTime Accumulator >= 0 AND Apportionment Calc HI Array
for this Location >= 0)
Calculate Apportioned HI = true
If (Unit LoadTimesOpTime Accumulator == 0)
Apportionment HI Method Array for the location == "NOCALC"
// Cannot apportionment but will validate total configuration
else if ({MP Stack Config for Hourly Checks begins with "CS" OR MP Pipe Configfor Hourly Checks == "CP" OR MP
Pipe Config for Hourly Checks == 'MULTIPLE") AND Apportionment HI Method Array fox the location <>
"COMPLEX")
if (Apportionment NOX Method Array == "NOXR")
Calculate NOXM From Apportioned HI = true
If Max Stack OpTime > Unit OpTime Accumulator + (the number of units in the monitoring plan * .005) AND
MP Pipe Config for Hourly Checks is null
return result B
else if (Config HeatlnputTimesOpTime Accumulator > 0 and Unit HeatlnputTimesOpTime Accumulator == 0)
OR (Config HeatlnputTimesOpTime Accumulator == 0 AND Unit HeatlnputTimesOpTime Accumulator > 0)
return result G
else if (Config HeatlnputTimesOpTime Accumulator >= 0 AND Unit HeatlnputTimesOpTime Accumulator >=
0)
Calculate Apportioned HI = true
// COMPLEX
else if (MP Stack Config for Hourly Checks == "COMPLEX" OR Apportionment HI Method Array for the location ==
"COMPLEX")
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
Environmental Protection Agency
Page 300 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
// F-21C
else if (MPStack Config for Hourly Checks == 'MS")
if (Apportionment NOX Method Array == "NOXR")
Calculate NOXM From Apportioned HI = true
if (ConfigHeatlnputTimesOpTimeAccumulator >= 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")
else if (Current Entity Type == 'MS" AND MPLoad UOM <> "INVALID" and MPUnit Load > 0 AND Apportionment Load Array for
the location > 0)
if (MPUnitLoad o Apportionment Load Array for the location)
return result F
return result B
else
return result D
Results:
Result
A
Response
The OperatingTime reported at the common stack/pipe is less than the OperatingTime
reported for one or more units linked to the stack/pipe.
The OperatingTime reported for one (or more) stacks/pipes is greater than the sum of
the operating times reported for the units for the hour.
The HourLoad reported at the common stack/pipe is inconsistent with the load and
operating time values reported at the units linked to the stack/pipe.
The OperatingTime reported for the unit is less than the OperatingTime reported for
one or more multiple stacks linked to the unit.
The OperatingTime reported for the unit is greater than the sum of operating times at
the multiple stacks linked to the unit.
The HourLoad in the Hourly Operating record for all multiple stacks linked to this unit
are not equal.
The Heat Input Rate and Operating Time reported for the unit is inconsistent with the
Heat Input Rates and Operating Times for the configuration.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
D
Critical Error Level 1
E
Critical Error Level 1
F
Critical Error Level 1
G
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 301 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-3
Check Name:
Calculate Apportioned or Summed Heat Input Rate
Related Former Checks: HOUROP-29
Applicability:
CEM Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Current HI Apportionment Record = null
HI Calculated Apportioned Value = null
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
// F-25
If {MPStack Configfor Hourly Checks == "CS" AND Current HI Entity Type = "CS")
If {Calculate Apportioned HI == true)
HI Calculated Apportioned Value = Config HeatlnputTimesOpTime Accumulator / Apportionment OpTime
Array for this Location, rounded to one decimal place.
if {Current Month is not April OR Annual Reporting Requirement == true)
If {Rpt Period HI Calculated Accumulator for this location >= 0)
Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated
Accumulator for this location + {HI Calculated Apportioned Value * Apportionment OpTime
Array for this Location)
if {Current Month is April)
April HI Calculated Accumulator for this location = April HI Calculated Accumulator for this
location + {HI Calculated Apportioned Value * Apportionment OpTime Array for this Location)
if {Current HI Apportionment Record. AdjustedHourlyValue >= 0 AND ABS{Current HI Apportionment
./tecon/.AdjustedHourlyValue - 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
Parameter = "HI" AND
UOM = "MMBTUHR"
else
Calculate Apportioned HI = false
Environmental Protection Agency
Page 302 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result B
// other complex situations
else if {Current HI Entity Type <> "Unit")
If {Calculate Apportioned HI == true AND Current HI Apportionment Record. AdjustedHourlyValue >= 0)
HI Calculated Apportioned Value = Current HI Apportionment Record. AdjustedHourlyValue
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 Op Time
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 {{MPStack 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. AdjustedHourlyValue >=
0)
if {Unit LoadTimesOpTime Accumulator > 0)
HI Calculated Apportioned Value = {Config HeatlnputTimesOpTime Accumulator*
Apportionment OpTime Array for this Location * Apportionment Load Array for this Location /
Unit LoadTimesOpTime Accumulator ) / Apportionment OpTime Array for this Location),
rounded to one decimal place.
else
HI Calculated Apportioned Value = Current HI Apportionment Record. AdjustedHourlyValue
HI Calculated Apportioned Value = HI Calculated Apportioned Value + Apportionment Calc HI Array
for this Location
if {Current Month is not April OR 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 303 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 /?£6y>/y/. Adjust cdHoiirlyVtil lie - 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(ConfigHeatInputTimesOpTimeAccumulator - UnitHeatlnputTimesOpTimeAccumulator) <= Heat
Input Tolerance OR Apportionment HI Method Array for the location == "COMPLEX" OR (MP Stack Config
for Hourly Checks== "COMPLEX" and MP Pipe Configfor Hourly Checks is null))
HI Calculated Apportioned Value = Current HI Apportionment Record. AdjustedHourlyValue
if (Current Month is not April OR Annual Reporting Requirement == true)
If (Rpt Period HI Calculated Accumulator for this location >= 0)
Rpt Period HI Calculated Accumulator for this location = Rpt Period HI Calculated
Accumulator for this location + (HI Calculated Apportioned Value * Apportionment
OpTime Array for this Location)
if (Current Month is April)
April HI Calculated Accumulator for this location = April HI Calculated Accumulator
for this location + (HI Calculated Apportioned Value * Apportionment OpTime Array
for this Location)
else
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator for this location = -1
return result C
else if (Apportionment OpTime Array for the location <> 0)
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator for this location = -1
Count active DerivedHourlyValueData records for location
WHERE ParameterCode = "HI"
Environmental Protection Agency
Page 304 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (Count == 1)
Current HI Apportionment Record = matching record
if (Current HI Apportionment Record .AdjustedHourlyValue > 0 AND Config HecitlnputTimesOpTime
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 HeatlnputlimesOpIime 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. AdjustedHourlyValue >= 0 AND ABS(Current HI Apportionment
Record. AdjustedHourlyValue - HI Calculated Apportioned Value) > Heat Input Tolerance)
return result A
else if (Apportionment OpTime Array for the location <> 0)
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator for this location = -1
return result B
Results:
Result
A
B
C
D
Response
The AdjustedHourlyValue reported in the DHV record for HI is inconsistent with the
recalculated apportioned or summed value.
The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due
to other errors listed in this report.
The heat input calculated for the configuration is inconsistent with the sum of the
reported heat input at the units in this configuration.
You reported heat input at the unit, but there was no heat input at any of the locations
where heat input was measured.
Severity
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 305 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAPP-4
Check Name: Calculate NOx Mass Rate from Apportioned or Summed Heat Input Rate
Related Former Checks:
Applicability: CEM Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Current NOX Apportionment Based Record = null
NOX Calculated Apportionment Based Value = null
If {Calculate NOXM From Apportioned HI ==true)
If {HI Calculated Apportioned Value is not null AND Apportionment CalcNOXR 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
NOXRArray, rounded to one decimal place.
if {Current Month is not April OR Annual Reporting Requirement == true
if {Apportionment OpTime Array for this location is between 0 and 1 (inclusive))
If {Rpt Period NOX Mass Calculated Accumulator for this location) >= 0)
Rpt Period NOX Mass Calculated Accumulator for this location = RptPeriodNOX
Mass Calculated Accumulator for this location + {NOX Calculated Apportionment
Based Value * Apportionment OpTime Array for this location)
if {Current Month is April)
April NOXMass Calculated Accumulator for this location = April NOX Mass
Calculated Accumulator for this location + {NOX Calculated Apportionment Based
Value * Apportionment OpTime Array for this location)
else
Rpt Period NOX Mass Calculated Accumulator for this location = -1
if {Current NOX Apportionment Record. AdjustedHourlyYalue >= 0)
If {ABS{Current HI Apportionment Record. AdjustedHourlyValue - NOX Calculated Apportionment
Based Value) > NOX Tolerance)
If {Legacy Data Evaluation == false)
return result A
else if {Apportionment OpTime Array for this Location is greater than 0 and less than or equal to
1)
Environmental Protection Agency
Page 306 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (ABS(Current HI Apportionment Record. AdjustedHourlyYalue - NOX Calculated
Apportionment Based Value) > NOX Tolerance / Apportionment OpTime Array for this
Location)
return result A
else
if {Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period NOX Mass Calculated Accumulator for this location = -1
return result B
Results:
Result Response Severity
A The AdjustedHourlyValue reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
B The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message
to other errors listed in this report.
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 307 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-5
Check Name:
Sum Weighted NOx Emission Rate from Multiple Stacks
Related Former Checks:
Applicability:
CEM Check
Description:
Specifications:
If {MPStack Config for Hourly Checks == 'MS" AND Current HI Entity Type == "Unit")
If (ConfigNOxRateTimesHeatlnputAccumulator <> 0 OR ConfigNOxRateTimesOpTimeAccumulator <> 0)
Expected Summary Value NOx Rate Array for this location = true
If (Config NOxRateTimesHeatlnput Accumulator > 0 AND Config Heatlnput Accumulator > 0 AND Rpt Period NOX
Rate Calculated Accumulator Array for this location >= 0)
Rpt Period NOX Rate Calculated Accumulator Array for this location = Rpt Period NOX Rate Calculated
Accumulator for this location + (Config NOxRateTimesHeatlnput Accumulator / Config Heatlnput
Accumulator, rounded to 3 decimal places.)
Rpt Period NOX Rate Hours Accumulator Array for this location = Rpt Period NOX Rate Hours Accumulator
for this location + 1
else if (Config NOxRateTimesOpTime Accumulator > 0 AND Config Oplime Accumulator > 0 AND Rpt Period NOX
Rate Calculated Accumulator Array for this location >= 0)
Rpt Period NOX Rate Calculated Accumulator Array for this location = Rpt Period NOX Rate Calculated
Accumulator for this location + (Config NOxRateTimesOpTime Accumulator / Config OpTime Accumulator,
rounded to 3 decimal places.)
Rpt Period NOX Rate Hours Accumulator Array for this location = Rpt Period NOX Rate Hours Accumulator
for this location + 1
else
Rpt Period NOX Rate Calculated Accumulator Array for this location = -1
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 308 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAPP-6
Check Name: Initialize Variable for Calculating Appendix E NOx Rate via Apportionment
Related Former Checks:
Applicability: Appendix E Check
Description:
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 NOXR Apportionment Based Record = matching record
if {Current NOXR Apportionment Based Record.MomtoringSystemlD is not null)
Mon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current NOXR Apportionment Based
Record. M o n i t o r i ng Sy s t e m ID
if (found AND Mon Sys Record. SystcmTypcCodc == "NOXE" AND Mon ,SV.v /tecwc/. FuclTypcCode is not null)
if (Current NOXR Apportionment Based Record.OpemtingConditionCode in set {X, Y, Z, U, W, N,
M})
App E Op Code = Current NOXR Apportionment Based Record.OpemtingConditionCode
App E Calc HI = HI Calculated Apportioned Value
App E Reported Value = Current NOXR Apportionment Based Record. AdjustedHourly Value
App E Segment Number = Current NOXR Apportionment Based Record. ScgmcntNumbcr
App E NOXE System ID = Current NOXR Apportionment Based RecordMonitoxing'SystQmSD
App E NOXE System Identifier = Current NOXR Apportionment Based
Record. Systemldentifier
App E Fuel Code = Mon Sys Record.Fuel Type Code
EarliestLocationReportDate = CurrentMonitorPlanLocationRecord.EarlisstRsportDatQ
else if (Current NOXR Apportionment Based Record.OpemtingConditionCode == "E")
return result A
else
return result B
else
return result C
Environmental Protection Agency
Page 309 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Response
You reported an OperatingConditionCode of E in the DHV record for NOXR. You
should report the NOx emission rate for emergency fuels in an HPFF record, not a
DHV record.
The OperatingConditionCode reported in the DHV record for NOXR is missing or
invalid.
According to your monitoring plan, your reported that you are determining NOx
emission rate using the Appendix E methodology, but you did not report a
MonitoringSystemID in this record. You should report the MonitoringSystemID of the
NOXE system associated with the Appendix E fuel curve.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 310 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAPP-7
Check Name: Handle NOx Rate Summary Expected for ARP
Related Former Checks:
Applicability:
Description: Sets Expected Summary Value NOx Rate Array value for a location to true when the location is a unit and the
unit is affected by ARP.
Specifications:
If CurrentHIEntityType is equal to "Unit", MPStackConfigForHourlyChecks is equal to "MS", and the
ExpectedSummaryValueNOxRateArray value for this location is equal to false,
Locate a record in LocationProgramRecordsByHourAndLocation where:
1) ProgramCode is equal to 'ARP', and
2) Class is equal to 'PI' or 'P2'.
if found,
Set ExpectedSummaryValueNOxRateArray for this location to true
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 311 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURAPP-9
Check Name: Check MATS Load Value
Related Former Checks:
Applicability: General Check
Description: This checks the apportionment of load value to MS in MS configurations. The load is apportioned based on
stack flow. The check calculates the apportioned value and compares it to the reported value with a tolerance
determine by HourlyEmissionsTolerances's LOAD-MW entry.
Specifications:
Set CalculatedMatsMsLoad to null.
If MpStackConfigForHourlyChecks is equal to "MS", AND CurrentMonitorPlanLocationRecord.Sl'dckP\pc\D is not null,
Set CurrentMsLoad to Apport'wnmentMatsLoad Array value for the current location.
If CurrentMsLoad is NOT null,
If the ApportionmentStackFlowArray value for every MS location is NOT null,
Set MsStackFlowSum to the sum of ApportionmentStackFlowArray * ApportionmentOpTimeArray for MS
locations.
Set CurrentMsFlow to ApportionmentStackFlowArray * ApportionmentOpTimeArray for the current location.
Set IJnitLoad to Apport'wnmentMatsLoad Array value for the unit.
If MsStackFlowSum is greater than 0, AND UnitLoad is NOT null and is greater than 0,
Set CalculatedMatsMsLoad to UnitLoad * CurrentMsFlow / MsStackFlowSum, rounded to an integer.
If ABS(CurrentMsLoad - CalculatedMatsMsLoad) is greater than MwLoadHourly Tolerance,
Return result A.
Results:
Result Response Severity
A The reported MATS Load value does not match the value of [CALCVALUE] calculated Informational Message
using stack flow apportionment.
Usage:
1 Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Environmental Protection Agency
Page 312 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-10
Check Name:
Related Former Checks:
MATS Hg: Calculate and check MATS MSI Flow Weighted value
Applicability:
Description:
General Check
Calculates and checks the MATS rate when the source is using the MS-1 formula.
Specifications:
Set CalculatedFlowWeightedHg to null.
Set MATSReportedPluginHg to null.
If MpStackConfigForHourlyChecks is equal to "MS", AND Current Monitor Plan Location Record. Uni11D is not null, AND
MatsHgDhvId is not null,
SetModc38Used to false.
Set StackOperatecl to false.
Set StackMissingData to false.
Set NumOperatingStacks to 0.
Set SingleStackHgRate to 0.
For each MS Location
If MatsMSIHgModcCodeArray is 38
Set Modc38Used to true
If ApportionmentOpTimeArray is > 0
Set StackOperated to true
Increment NumOperatingStacks
Set Single StackHgRate to ApportionmentHgRateArray
If ApportionmentOpTimeArray is > 0 and (ApportionmentStackFlowArray is null or ApportionmentHgRateArray is
null),
Set StackMissingData to true
If the ApportionmentStackFlowArray value for MS location is NOT null,
Set MsStackFlowSum to the sum of ApportionmentStackFlowArray for MS location.
Set MsStackEmissionRateFlow to the sum of ApportionmentHgRateArray * ApportionmentStackFlowArray for
MS location.
If Modc38Used is false and StackOperated is true and MatsHgUnadjustedHourlyValue is null
return result B
Else If NumOperatingStacks is 1
Set CalculatedFlowWeightedHg to Single StackHgRate
If Single StackHgRate not equal MatsHgUnadjustedHourlyValue
Else If StackMissingData is true and MatsHgUnadjustedHourlyValue is not null
return result C
Else If MsStackFlowSum is greater than 0 and MatsHgUnadjustedHourlyValue is not null
Set CalculatedFlowWeightedHg to MsStackEmissionRateFlow / MsStackFlowSum, rounded to an integer.
Set MATSReportedPluginHg to MatsHgUnadjustedHourlyValue
If (MatsHgUnadjustedHourlyValue + CalculatedFlowWeightedHg) is NOT equal to 0
Set PercentDifference = 100 * A BS(MatsMsl HgUnadjustedHourly Value - CalculatedFlowWeightedHg)/
{{MatsMslHgUnadjustedHourly Value + CalculatedFlowWeightedHg)/2), rounded to 1 decimal place.
return result A
If (PercentDifference > 5)
return result A
Environmental Protection Agency
Page 313 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
The reported [MATS Parameter] Calculated Flow Weighted value of [Reported] does
not match the recalculated value of [Calculated] calculated using stack flow
apportionment.
You did not report a [MATS Parameter] unit-level emission rate, but did report a
[MATS Parameter] emission rate at each operating stack.
You reported a [MATS Parameter] unit-level emission rate, but did not report a [MATS
Parameter] emission rate or unadjusted flow rate from one or both stacks.
Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Severity
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 314 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-11
Check Name:
Related Former Checks:
MATS HCL: Calculate and check MATS MSI Flow Weighted value
Applicability:
Description:
General Check
Calculates and checks the MATS rate when the source is using the MS-1 formula.
Specifications:
Set CalculatedFlowWeightedHcl to null.
Set MATSReportedPluginHcl to null.
If MpStackConfigForHourlyChecks is equal to "MS", AND Current Monitor Plan Location Record. Uni11D is not null, AND
MatsHclDhvId is not null,
Set Modc38Used to false.
Set StackOperated to false.
Set StackMissingData to false.
Set NumOperatingStacks to 0.
Set SingleStackHclRate to 0.
For each MS Location
If MatsMSIHgModcCodeArray is 38
Set Modc38 Used to true
If ApportionmentOpTimeArray is > 0
Set StackOperated to true
Increment NumOperatingStacks
Set SingleStackHclRate to ApportionmentHclRateArray
If ApportionmentOpTimeArray is > 0 and (ApportionmentStackFlowArray is null or ApportionmentHclRateArray is
null),
Set StackMissingData to true
If the ApportionmentStackFlowArray value for MS location is NOT null,
Set MsStackFlowSum to the sum of ApportionmentStackFlowArray for MS location.
Set MsStackEmissionRateFlow to the sum of ApportionmentHclRateArray * ApportionmentStackFlowArray for
MS location.
If Modc38Used is false and StackOperated is true and MatsHclUnadjustedHourlyValue is null
return result B
Else If NumOperatingStacks is 1
Set CalculatedFlowWeightedHcl to SingleStackHclRate
If SingleStackHclRate not equal MatsHclUnadjustedHourlyValue
Else If StackMissingData is true and MatsHclUnadjustedHourlyValue is not null
return result C
If MsStackFlowSum is greater than 0 and MatsHclUnadjustedHourlyValue is not null
Set CalculatedFlowWeightedHcl to MsStackEmissionRateFlow / MsStackFlowSum, rounded to an integer.
Set MATSReportedPluginHcl to MatsHclUnadjustedHourlyValue
If (MatsHclUnadjustedHourlyValue + CalculatedFlowWeightedHcl) is NOT equal to 0
Set PercentDifference = 100 * A BS(MatsMsl He!UnadjustedHourly Value - CalculatedFlowWeightedHcl)/
((.MatsMslHclUnadjustedHourlyValue + CalculatedFlowWeightedHcl)/2), rounded to 1 decimal place.
If (PercentDifference > 5)
return result A
Environmental Protection Agency Page 315 of 95 9
return result A
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
The reported [MATS Parameter] Calculated Flow Weighted value of [Reported] does
not match the recalculated value of [Calculated] calculated using stack flow
apportionment.
You did not report a [MATS Parameter] unit-level emission rate, but did report a
[MATS Parameter] emission rate at each operating stack.
You reported a [MATS Parameter] unit-level emission rate, but did not report a [MATS
Parameter] emission rate or unadjusted flow rate from one or both stacks.
Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Severity
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 316 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-12
Check Name:
Related Former Checks:
MATS HF: Calculate and check MATS MSI Flow Weighted value
Applicability:
Description:
General Check
Calculates and checks the MATS rate when the source is using the MS-1 formula.
Specifications:
Set CalculatedFlowWeightedHf to null.
Set MATSReportedPluginHf to null.
If MpStackConfigForHourlyChecks is equal to "MS", AND Current Monitor Plan Location Record. Uni11D is not null, AND
MatsHfDhvId is not null,
Set Modc38Used to false.
Set StackOperated to false.
Set StackMissingData to false.
Set NumOperatingStacks to 0.
Set SingleStackHJRate to 0.
For each MS Location
If MatsMSIHgModcCodeArray is 38
Set Modc38 Used to true
If ApportionmentOpTimeArray is > 0
Set StackOperated to true
Increment NumOperatingStacks
Set SingleStackHJRate to ApportionmentHfRateArray
If ApportionmentOpTimeArray is > 0 and (ApportionmentStackFlowArray is null or ApportionmentHfRateArray is
null),
Set StackMissingData to true
If the ApportionmentStackFlowArray value for MS location is NOT null,
Set MsStackFlowSum to the sum of ApportionmentStackFlowArray for MS location.
Set MsStackEmissionRateFlow to the sum of ApportionmentHfRateArray * ApportionmentStackFlowArray for
MS location
If Modc38Used is false and StackOperated is true and MatsHfUnadjustedHourly Value is null
return result B
Else If NumOperatingStacks is 1
Set CalculatedFlowWeightedHf to SingleStackHJRate
If SingleStackHJRate not equal MatsHfUnadjustedHourly Value
Else If StackMissingData is true and MatsHfUnadjustedHourly Value is not null
return result C
Else If MsStackFlowSum is greater than 0 and MatsHfUnadjustedHourly Value is not null
Set CalculatedFlowWeightedHf to MsStackEmissionRateFlow / MsStackFlowSum, rounded to an integer.
Set MATSReportedPluginHf to MatsHfUnadjustedHourly Value
If (MatsHfUnadjustedHourlyValue + CalculatedFlowWeightedHf) is NOT equal to 0
Set PercentDifference = 100 * A B S(MatsMsl HfUnadjustedHourly Value - CalculatedFlowWeightedHf)/
((MatsMslHfUnadjustedHourly Value + CalculatedFlowWeightedHf )/2), rounded to 1 decimal place.
If (PercentDifference > 5)
return result A
Environmental Protection Agency Page 317 of 959
return result A
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
The reported [MATS Parameter] Calculated Flow Weighted value of [Reported] does
not match the recalculated value of [Calculated] calculated using stack flow
apportionment.
You did not report a [MATS Parameter] unit-level emission rate, but did report a
[MATS Parameter] emission rate at each operating stack.
You reported a [MATS Parameter] unit-level emission rate, but did not report a [MATS
Parameter] emission rate or unadjusted flow rate from one or both stacks.
Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Severity
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 318 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURAPP-13
Check Name:
Related Former Checks:
MATS S02: Calculate and check MATS MSI Flow Weighted value
Applicability:
Description:
General Check
Calculates and checks the MATS rate when the source is using the MS-1 formula.
Specifications:
Set Calcu I cited Flo 1v Weigh tedS<>2 to null.
Set MATSReportedPluginSo2 to null.
If MpStackConfigForHourlyChecks is equal to "MS", AND Current Monitor Plan Location Record. Uni11D is not null, AND
MatsSo2DhvId is not null,
Set Modc38Used to false.
Set StackOperated to false.
Set StackMissingData to false.
Set NumOperatingStacks to 0.
Set SingleStackSo2Rate to 0.
For each MS Location
If MatsMSIHgModcCodeArray is 38
Set Modc38 Used to true
If ApportionmentOpTimeArray is > 0
Set StackOperated to true
Increment NumOperatingStacks
Set SingleStackSo2Rate to ApportionmentSo2RateArray
If ApportionmentOpTimeArray is > 0 and (ApportionmentStackFlowArray is null or ApportionmentSo2RateArray is
null),
Set StackMissingData to true
If the ApportionmentStackFlowArray value for MS location is NOT null,
Set MsStackFlowSum to the sum of ApportionmentStackFlowArray for MS location.
Set MsStackEmissionRateFlow to the sum of ApportionmentSo2RateArray * ApportionmentStackFlowArray for
MS location.
If Modc38Used is false and StackOperated is true and MatsSo2UnadjustedHourly Value is null
return result B
Else If NumOperatingStacks is 1
Set Calcu IatedFIo 1v Weigh tedSo2 to SingleStackSo2Rate
If SingleStackSo2Rate not cqua 1 MatsSo2UnadjustedHourly Value
Else If StackMissingData is true and MatsSo2UnadjustedHourlyValue is not null
return result C
Else If MsStackFlowSum is greater than 0 and MatsSo2UnadjustedHourlyValue is not null
Set CalculatedFlowWeightedSo2 to MsStackEmissionRateFlow / MsStackFlowSum, rounded to an integer.
Set MATSReportedPluginSo2 to MatsSo2UnadjustedHourly Value
If (MatsSo2UnadjustedHourly Value + Calcu/atedFIo1v WeightedSo2) is NOT equal to 0
Set PercentDifference = 100 * A BS( MatsMsl So2 UnadjustedHourly Value - Calcu I atedFIo 1v Weigh tedSo2)/
((MatsMslSo2UnadjustedHourly Value + CalculatedFlowWeightedSo2)/2), rounded to 1 decimal place.
return result A
If (PercentDifference > 5)
return result A
Environmental Protection Agency
Page 319 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
The reported [MATS Parameter] Calculated Flow Weighted value of [Reported] does
not match the recalculated value of [Calculated] calculated using stack flow
apportionment.
You did not report a [MATS Parameter] unit-level emission rate, but did report a
[MATS Parameter] emission rate at each operating stack.
You reported a [MATS Parameter] unit-level emission rate, but did not report a [MATS
Parameter] emission rate or unadjusted flow rate from one or both stacks.
Process/Category: Emissions Data Evaluation Report — Hourly Configuration Evaluation
Severity
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 320 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Calculated Data
Environmental Protection Agency
Page 321 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-1
Check Name:
Related Former Checks:
Calculate Percent H20
Applicability:
Description:
CEM Check
If there was a valid equation code reported for a Derived H20 record and 02 monitored values were available,
this check reproduces the formula for calculating H20 and compares it to the reported H20 Percentage
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if (H20 Method Code = "MWD" AND Current DHV Record.ModcCode in set {01, 02, 03, 04, 53, 54})
if (H2() CEM Equation Code== "F-31")
if {Current DHVRecord 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(H2() DHV Calculated Adjusted Value - Current
I)HV Record. kdi)us\cdHour 1 y Va 1 uc) > H20 Cone Tolerance)
return result A
else
return result B
else if (H2() CEM Equation Code== "M-1K")
if (Derived Hourly Adjusted Value Status == true)
H20 DHV Calculated Adjusted Value = Current /)//K/?6'cw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-3
Check Name: Determine Diluent Cap and Moisture for C02 Concentration Calculation Verification
Related Former Checks:
Applicability: CEM Check
Description: Determines the moisture and diluent values used in the C02C calculation.
Specifications:
if (C()2 Cone CEM Equation Code== "F-14B")
If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated Adjusted
Value is not null)
Calculated Moisture for C02C = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisture for C02C = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated Adjusted
Value is not null)
Calculated Moisture for C02C = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == 'MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is not null)
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 (02XCount == 0)
return result B
else if MonitoringDefault.DefaultValue <= 0
return result C
else
Calculated Diluentfor C02C = MonitoringDefault. Default Value
else
case (C()2 Cone CEM Equation Code)
"F-14A":
Calculated Diluent for C02C = 02 Drv Calculated Adjusted Value
"F-14B":
Calculated Diluentfor C02C = 02 Wet Calculated Adjusted Value
Results:
Result Response
A You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.
B You did not report a default record for 02X in your monitoring plan that was active
during the current hour. Please note that the use of a diluent cap to calculate C02
concentration is only applicable to legacy data.
C The Default Value reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Calculation Verification
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 323 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-4
Check Name:
Related Former Checks:
Calculate C02 Concentration
Applicability:
Description:
Specifications:
CEM Check
Based on equation code in C02 Concentration record and reported values, calculate the C02 Concentration
If {CurrentDHVRecord ModcCode in set {01, 02, 03, 04, 53, 54})
C02 Cone Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerance" where
Parameter = "C02C" AND
UOM= "PCT"
case (CO2 Cone CEM Equation Code)
"F-14A":
If {Current DHV Record Valid == true AND Calculated Diluentfor C02C is not null AND Valid FC Factor
Exists == true AND Valid FD Factor == true)
C02C DHV Calculated Adjusted Value = 100 * {Current Hourly Op Record.FcFactor /Current Hourly
Op Record .FdFactor) * [(20.9 - Calculated Diluentfor C02C) / 20.9 ], and round the result to 1
decimal place.
If {C02C DHV Calculated Adjusted Value < 0)
C02C DHV Calculated Adjusted Value = 0
If {Derived Hourly Adjusted Value Status == true AND ABS(CY/2C DHV Calculated Adjusted Value -
Current /)//K/?6'cwY/.AdjustcdHourly Value) > C02 Cone Tolerance)
return result A
If {Current DHV Record Valid == true AND Calculated Diluentfor C02C is not null AND Valid FC Factor
Exists == true AND Valid FD Factor Exists == true AND Calculated Moisture for C02C is not null)
C02C DHV Calculated Adjusted Value = [100/20.9] * {Current Hourly Op Record FcF actor /Current
Hourly Op Record. FdFactor) * [20.9 * ((100 - Calculated Moisture for C02C)/100) - Calculated
Diluentfor C02C ], and round the result to 1 decimal place.
If {C02C DHV Calculated Adjusted Value < 0)
C02C DHV Calculated Adjusted Value = 0
If {Derived Hourly Adjusted Value Status == true AND ABS(CY/2C DHV Calculated Adjusted Value -
Current /)//K/?6'cwY/.AdjustcdHourly Value) > C02 Cone Tolerance)
return result A
else
return result B
'F-14B":
else
return result B
Otherwise
return result B
else
C02C DHV Calculated Adjusted Value = Current DHV Calculated Adjusted Value
Environmental Protection Agency
Page 324 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A The AdjustedHourlyValue reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
B The AdjustedHourly Value in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Calculation Verification
Environmental Protection Agency
Page 325 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-6
Check Name: Determine Diluent Cap and Moisture for Heat Input Calculation Verification
Related Former Checks:
Applicability: General Check
Description: Ensures that all inputs are available for each equation type prior to performing the actual calculations
Specifications:
If {Heat Input Method Code == "CEM")
if {Heat Input Equation Code in set {F-16, F-17, F-18}
If {H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHVCalculated
Adjusted Value is not null)
Calculated Moisture for HI = H20 DHV Calculated Adjusted Value
else if {H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisturefor 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. D i 1 lie n t Ca p I ndi cator = = 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.Default Value
else if (CO2 Cone Checks Needed for Heat Input == true)
if {Current C02 Cone Missing Data Monitor Hourly Record is not null)
Calculated Diluent for HI = C02C SD Calculated Adjusted Value
else
Calculated Diluent for HI = C02C MHV Calculated Adjusted Value
else if {Heat Input Equation Code == "F-17" OR Heat Input Equation Code == "F-18" )
if (Current DHV Record. D i 1 lie n t Ca p I ndi cator = = 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 {02XCount == 0)
return result E
else if MonitoringDefault.Default Value <= 0
return result F
else
Calculated Diluent For HI = MonitoringDefault.Default Value
Environmental Protection Agency
Page 326 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if {Heat Input Equation Code == "F-17" AND 02 Wet Checks Needed for Heat Input == true)
Results:
Result
A
B
C
D
E
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
Response
You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.
You did not report an active C02N diluent cap default record in your monitoring plan
for the hour. The use of the diluent cap to calculate HI is only applicable for legacy
data.
The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.
You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.
You did not report a default record for 02X in your monitoring plan that was active
during the current hour. Please note that the use of a diluent cap to calculate HI is only
applicable to legacy data.
The Default Value reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Heat Input Calculation Verification
Environmental Protection Agency
Page 327 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-7
Check Name: Calculate Heat Input
Related Former Checks:
Applicability: General Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if {DerivedHourly Adjusted Value Status == true AND Current Hourly Op Ttecon/.OperatingTime is between 0 and 1 (inclusive))
Heat Input Total Reported Value = Current /J/ZK/fecvMY/. Adjust edHourlv Value * Current Hourly Op Record.0\~>cn\{\\\gY\mc.
if (Current Month is not April OR Annual Reporting Requirement == true)
if {Rpt Period HI Reported Accumulator Array for this location is not null)
if {Rpt Period HI Reported Accumulator Array >= 0)
Rpt Period HI Reported Accumulator Array for this location = Rpt Period HI Reported Accumulator
Array for this location + Heat Input Total Reported Value
else
Rpt Period HI Reported Accumulator Array for this location = Heat Input Total Reported Value
if {Current Entity Type== "Unit" AND UnitHeatlnputTimesOpTimeAccumulator >= 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 Diluentfor HI is not null AND Valid FC Factor Exists
== true AND FLOW Calculated Adjusted Value is not null)
HI Calculated Adjusted Value = {FLOW Calculated Adjusted Value * Calculated Diluent for Heat
Input) / {Current Hourly Op Record.FcFactor * 100.0), and round the result to 1 decimal place.
else
return result A
= "F-16":
If {Current DHV Record Valid == true AND Calculated Diluentfor HI is not null AND Valid FC Factor Exists
== true AND FLOW Calculated Adjusted Value is not null AND Calculated Moisturefor HI is not null)
HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (100 - Calculated Moisture for
HI) * Calculated Diluent for HI ] / (10,000 * Current Hourly Op Record. FcFactor), and round the
result to 1 decimal place.
else
return result A
= "F-17":
Environmental Protection Agency
Page 328 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If {Current DHVRecord 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 Moisturefor HI is not null)
HI Calculated Adjusted Value = [FLOW Calculated Adjusted Value * (1 / Current Hourly Op
Record. FdFtictor)* [0.209 * (100 - Calculated Moisture for HI) - Calculated Diluentfor HI] / 20.9) ],
and round the result to 1 decimal place.
else
return result A
= "F-18":
If {Current 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 Moisturefor HI is not null)
HI Calculated Adjusted Value = {FLOW Calculated Adjusted Value *[100 - Calculated Moisture for
HI] * [20.9 - Calculated Diluent for HL] ) / (2090 * Current Hourly Op Record. FdFactor), and round
the result to 1 decimal place.
else
return result A
= All Other Equation Codes:
return result A
if no result
if {HI Calculated Adjusted Value is less than 1 AND Legacy Data Evaluation == false)
HI Calculated Adjusted Value = 1
Apportionment Calc HI Array at this Location = HI Calculated Adjusted Value
if {MPStack Configfor Hourly Checks == 'MS")
Config Heatlnput Accumulator = Config Heatlnput Accumulator + HI Calculated Adjusted Value
if result A
Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1
if {Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator Array for this location = -1
if {MPStack Config for Hourly Checks == 'MS")
Config Heatlnput Accumulator = -1
else if {Heat Input App D Method Active for Hour == true)
if {HIApp D Accumulator >= 0)
Total Heat Input from Fuel Flow = HI App D Accumulator
if {HIApp D Accumulator >= 0 AND Current Hourly Op /?6'tw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Config HeatlnputTimesOpTime Accumulator = -1
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator Array for this location = -1
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.Opcn\\\ngY\mc is between 0 and 1 inclusive)
Heat Input Total Calculated Value = HI Calculated Adjusted Value * Current Hourly Op Record. OperatingTime.
if ( Config HeatlnputTimesOpTime Accumulator >= 0)
Config HeatlnputTimesOpTime Accumulator = Config HeatlnputTimesOpTime Accumulator + Heat Input
Total Calculated Value
if (Current Month is not April OR Annual Reporting Requirement == true)
if (Rpt Period HI Calculated Accumulator Array for this location is not null)
if (Rpt Period HI Calculated Accumulator Array for this location >= 0)
Rpt Period HI Calculated Accumulator Array for this location = Rpt Period HI Calculated
Accumulator Array for this location + Heat Input Total Calculated Value
else
Rpt Period HI Calculated Accumulator Array for this location = Heat Input Total Calculated Value
if (Current Month is April)
if (April HI Calculated Accumulator Array for this location is not null)
April HI Calculated Accumulator Array for this location = April HI Calculated Accumulator
Array for this location + Heat Input Total Calculated Value
else
April HI Calculated Accumulator Array for this location = Heat Input Total Calculated Value
else
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 (DerivedHourly Adjusted Value Status == true)
If (Heat Input Method Code in set {CEM, AD})
if (HI Calculated Adjusted Value is equal to 1 AND Current Adjust edHourlv Value is less than 1
AND Current DHV Record. MOD C Code is not equal to "26" and Legacy Data Evaluation == false)
return result C
else
Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HI" AND
UOM = "MMBTUHR"
if (ABS(Current DHV Record. AdjustedHourlyValue - HI Calculated Adjusted Value) > Heat Input
Tolerance)
return result B
Environmental Protection Agency
Page 330 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if {Apportionment Calc HI Array at this Location is greater than or equal to 0) \\ ADCALC
If (Current Hourly Op /?6'tw= 0)
Config HeatlnputTimesOpTime Accumulator = Config HeatlnputTimesOpTime Accumulator + Heat Input
Total Calculated Value
else
Config HeatlnputTimesOpTime Accumulator = -1
else if {Heat Input Method Code not in set {ADCALC, CALC})
Apportionment Calc HI Array at this Location = -1
Config HeatlnputTimesOpTime Accumulator = -1
if {Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period HI Calculated Accumulator Array for this location = -1
Results:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
B The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
C You reported in AdjustedHourly Value of less than 1 in the DHV record for [param]. Critical Error Level 1
You must report a minimum heat input of 1 and a MODCCode of "26".
Usage:
Process/Category: Emissions Data Evaluation Report Heat Input Calculation Verification
Environmental Protection Agency
Page 331 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-9
Check Name: Calculate S02 Mass Emissions
Related Former Checks:
Applicability: CEM Check
Description: Based on values from S02 Monitor Hourly and Stack Flow Monitor Hourly, plus moisture values if applicable
and the current equation code, the S02 Mass emissions rate is calculated
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecon/.OperatingTime is between 0 and 1 (inclusive))
S02 Total Reported Value = Current /)//K/?6'cwcn\{\\\gY\mc.
if (Rpt Period S02 Mass Reported Accumulator Array for this location is not null)
if {Rpt Period S02 Mass Reported Accumulator Array for this location >= 0)
Rpt Period S02 Mass Reported Accumulator Array for this location = Rpt Period S02 Mass Reported
Accumulator Array for this location + S02 Total Reported Value
else
Rpt Period S02 Mass Reported Accumulator Array for this location = S02 Total Reported Value
else
Rpt Period S02 Mass Reported Accumulator Array for this location = -1
If (SO2 CEM Method Active for Hour == true)
if (S()2 Equation Code== "F-l")
If {Current DHVRecord Valid == true AND S02C Calculated Adjusted Value is not null AND FLOWCalculated
Adjusted Value is not null)
SO2 Calculated Adjusted Value = 0.000000166 * S02C Calculated Adjusted Value * FLOWCalculated
Adjusted Value, ROUNDED to one decimal place.
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A
else if {S02 Equation Code== "F-2")
If {Current DHV Record Valid == true AND S02C Calculated Adjusted Value is not null AND FLOWCalculated
Adjusted Value is not null AND Calculated Moisture for S02 is not null)
SO2 Calculated Adjusted Value = 0.000000166 * S02C Calculated Adjusted Value * FLOWCalculated
Adjusted Value * (100.0 - Calculated Moisture for S02) /100.0, ROUNDED to one decimal place.
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A
else if {SO2 F23 Method Activefor Hour == true)
If {Current DHV Record Valid == true AND F23 Default Value is not null AND HI Calculated Adjusted Value is not
null)
SO2 Calculated Adjusted Value = F23 Default Value * HI Calculated Adjusted Value, rounded to one decimal
Environmental Protection Agency
Page 332 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
place.
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A
else if (SO2 App D Method Active for Hour == true)
if (SO2 AppD Accumulator >= 0 AND Current Hourly Op /?6'tw= 0)
Rpt Period S02 Mass Calculated Accumulator Array for this location = Rpt Period S02 Mass
Calculated Accumulator Array for this location + S02 Total Calculated Value
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = SO 2 Total Calculated Value
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
If {DerivedHourly Adjusted Value Status == true)
S02 Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "S02" AND
UOM = "LBHR"
if (ABS(Current DHV /fecwf/. AdjustedHourly Value - S02 Calculated Adjusted Value) > S02 Tolerance)
return result B
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
Results:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
B The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
Environmental Protection Agency
Page 333 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Calculation Verification
Environmental Protection Agency
Page 334 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-12
Check Name: Determine Diluent Cap, Moisture, and NOXC for NOx Rate Calculation Verification
Related Former Checks:
Applicability: CEM Check
Description: For each possible formula, ensure that all required components are available. Note that no responses are
output, because each missing part should have generated an earlier error message.
Specifications:
If (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. U n a dj u s t cd H o u r 1 y Va 1 lie is not null)
NOx Cone for NOx Rate Calculation = Current NOx Cone Monitor Hourly Record. U n a dj u s t cd H o u r ly Va 1 lie
else
NOx Cone for NOx Rate Calculation = null
if (NOx Rate Equation Code in set {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9})
If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)
Calculated Moisture for NOXR = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisture for NOXR = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)
Calculated Moisture for NOXR = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == 'MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is
not null)
Calculated Moisture for NOXR = H20 Default Value
if (NOx Rate Equation Code in set {19-3 D. 19-5D} OR Current DHV Record.ModcCode == 14)
If (NOxRate Equation CWeinset {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 .Default Value is NULL OR 02 Monitor Default Record. Default Value <=
0)
return result C
else
Calculated Diluent for NOXR = 02 Monitor Default Record .Default Value
else if (NOx Rate Equation CWeinset {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
Environmental Protection Agency
Page 335 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result D
else if C02 Monitor Default Matches = 0
return result E
else
CO 2 Monitor Default Record = the single matched record
if (C02 Monitor Default Record. Default Value is NULL OR C02 Monitor Default Record. Default Value
<=0)
return result F
else
Calculated Diluentfor NOx Rate = C02 Monitor Default Record .Default Value
If (NOx Rate Equation Code in set {F-5, 19-1, 19-4} AND 02 Dry Checks Neededfor NOx Rate Calc == true)
Calculated Diluentfor NOx Rate = 02 Dry Calculated Adjusted Value
else if (NOx Rate Equation Code in set {19-2. 19-3, 19-5} AND ()2 Wet Checks Needed for NOx Rate Calc ==true)
Calculated Diluentfor 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 Diluentfor NOx Rate = C02C MHV Calculated Adjusted Value
else
Results:
Result
A
Response
You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.
You did not report a default record for 02X in your monitoring plan that was active
during current hour.
The Default Value reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.
You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.
You did not report an active C02N diluent cap default record in your monitoring plan
for the hour.
The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
D
Critical Error Level 1
E
Critical Error Level 1
F
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Environmental Protection Agency
Page 336 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-13
Check Name:
Related Former Checks:
Calculate Unadjusted NOx Emissions Rate
Applicability:
Description:
CEM Check
Based on equation code in NOx Emission Rate record and reported values, calculate the NOx Emissions Rate
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
NOXR Calculated Unadjusted Value = null
Derived Hourly Unadjusted Calculation Status = false
If {Current NOx Rate Method Code== "CEM" AND Current DHV Record. ModcCode in set {01, 02, 03, 14, 22, 53})
If {Current DHV Record. SystemTypeCode == "NOX")
RATA Status Required = true
case {NOx Rate Equation Code)
"19-1" or "F-5":
If {Current DHV Record Valid == true AND Calculated Diluentfor NOXR is not null AND NOX Cone for NOx Rate
Calc is not null AND Valid FD Factor Exists == true)
if {Calculated Diluent for NOXR == 20.9)
return result A
else
NOXR Calculated Unadjusted Value = 0.0000001194* NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FdFactor * [20.9 / (20.9 - Calculated Diluent for NOXR)], rounded to 3 decimal
places.
else
return result B
"19-2":
Moisture Fraction = null
BWA Default Record Count = count active MonitoringDefaultData Records for the location where ParameterCd = 'BWA'
If {BWA Default Record Count == 0)
Moisture Fraction = 0.027
else If {BWA Default Record Count == 1 AND MonitorDefaultData.Default Value >0 AND
MonitorDefaultData.Default Value < 1)
Moisture Fraction = MonitorDefaultData.Default Value
else
return result D
If {Current DHV Record Valid == true AND Calculated Diluentfor NOXR is not null AND NOX Cone for NOx Rate
Calc is not null AND Valid FWFactor Exists == true AND Moisture Fraction is not null)
if {Calculated Diluent for NOXR ==20.9 * (1 - Moisture Fraction))
return result A
else
NOXR Calculated Unadjusted Value = 0.0000001194* NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FwFactor * [20.9 / (20.9 *(1 - Moisture Fraction) - Calculated Diluent for NOXR)],
rounded to 3 decimal places.
else
Environmental Protection Agency
Page 337 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result B
"19-3":
If (Current DHV Record Valid == true AND Calculated Diluentfor 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 Diluentfor NOXR == 20.9*(100 - Calculated Moisture for NOXR) / 100 )
return result A
else
denom = (20.9*(100 - Calculated Moisture for NOXR )/100 - Calculated Diluentfor 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 Diluentfor 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 Diluentfor 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 Diluentfor NOXR == 20.9 OR Calculated Moisture for NOXR == 100)
return result A
else
NOXR Calculated Unadjusted Value = 0.0000001194* NOX Cone for NOx Rate Calc * Current
Hourly Op Record.FdFactor / [ (100 - Calculated Moisture for NOXR) / 100.0] * (20.9 / (20.9 -
Calculated Diluent for NOXR)), rounded to 3 decimal places.
else
return result B
"19-5":
If (Current DHV Record Valid == true AND Calculated Diluentfor 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
Environmental Protection Agency
Page 338 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
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 Diluentfor 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 Diluentfor NOXR is not null AND NOX Cone for NOx Rate
Calc is not null AND Valid FC Factor Exists == true)
if (Calculated Diluent for NOXR == 0.0)
return result A
else
NOXR Calculated Unadjusted Value = 0.0000001194* NOX Cone for NOx Rate Calc * Current
Hourly Op /?6'cmy/.FcFactor * 100.0 / Calculated Diluent for NOXR, rounded to 3 decimal places.
else
return result B
"19-:
If (Current DHV Record Valid == true AND Calculated Diluentfor 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 Diluentfor 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 Diluentfor 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
Environmental Protection Agency
Page 339 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 /)//K/?6'cwY/.UnadjustcdHourly Value - NOXR Calculated Unadjusted Value) > Tolerance)
return result C
else
Derived Hourly Unadjusted Calculation Status = true
else if (Current NOx Rate Method Code== "PEM" AND Current DHVRecord.ModcCode in set {01, 02, 03})
If (Current DHV Record. SystemTypeCode == "NOXP")
RATA Status Required = true
If Current /)//K/?6'cw= 0
NOXR Calculated Unadjusted Value = Current /)//K/?6'cw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
The NOx emission rate could not be recalculated, because the diluent and/or moisture
value would result in division by zero. You should report an MODC of 14 indicating
the use of a diluent cap to prevent this.
The UnadjustedHourlyValue 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 BWAfor
the hour.
Severity
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Usage:
Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Environmental Protection Agency
Page 341 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-15
Check Name:
Related Former Checks:
Determine Moisture for NOx Mass Calculation Verification
Applicability:
Description:
CEM Check
Verifies that all elements are present to support the equation code indicated by the current NOx Mass Rate
record
Specifications:
If {NOx Mass Monitor Method Code begins with "CEM")
If (NOxMass Equation Code== "F-26B")
If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHVCalculated
Adjusted Value is not null)
Calculated Moisturefor NOX = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisturefor 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 Moisturefor 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 Moisturefor NOX = H20 Default Value
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Mass Rate Calculation Verification
Environmental Protection Agency
Page 342 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-16
Check Name: Calculate NOx Mass Emissions
Related Former Checks:
Applicability: CEM Check
Description: Based on Formula Code and all reported values, the NOx Mass Calculation is verified
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecon/.OperatingTime is between 0 and 1 (inclusive))
NOX Mass Total Reported Value = Current /)//K/?6'cwcn\{\\\gY\mc.
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 FLOWCalculated
Adjusted Value is not null)
NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * Stack Flow Calculated
Adjusted Value, ROUNDED to one decimal place.
else
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
return result A
else if (NOXMass Equation Code== "F-26B")
If (Current DHV Record Valid == true AND NOXC Calculated Adjusted Value is not null AND FLOWCalculated
Adjusted Value is not null AND Calculated Moisturefor NOX is not null)
NOX Calculated Adjusted Value = 0.0000001194 * NOXC Calculated Adjusted Value * FLOWCalculated
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
else if (NOXMass Equation Code== "F-24A")
if (Heat Input Method Code NOT in set {CALC, ADCALC})
If (Current DHV Record Valid == true AND NOXR Calculated Adjusted Value is not null
Environmental Protection Agency
Page 343 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
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
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.Opcn\\\ngY\mc is between 0 and 1 inclusive)
NOxMass 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 NOXMass Calculated Accumulator Array for this location = Rpt Period NOX Mass
Calculated Accumulator Array for this location + NOXMass Total Calculated Value
else
Rpt Period NOX Mass Calculated Accumulator Array for this location = NOXMass Total Calculated
Value
if {Current Month is April)
if {April NOX Mass Calculated Accumulator Array for this location is not null)
April NOX Mass Calculated Accumulator Array for this location = April NOX Mass Calculated
Accumulator Array for this location + NOXMass Total Calculated Value
else
April NOX Mass Calculated Accumulator Array for this location = NOXMass Total Calculated
Value
else
if {Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
If {Derived Hourly Adjusted Value Status == true AND Current DHV Method in set {CEM, NOXR, CEMNOXR})
NOX Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "NOX" AND
UOM = "LBHR"
if (ABS(Current /)//K/?6'cwY/.AdjustcdHourly Value - NOX Calculated Adjusted Value) > NOX Tolerance)
If {Legacy Data Evaluation == false)
return result B
Environmental Protection Agency
Page 344 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (Current Hourly Op Data.OpTime is greater than 0 and less than or equal to 1)
if (ABS(Current DHV Record. AdjustedHourlyValue - NOX Calculated Adjusted Value) > NOX
Tolerance / Current Hourly Op Record.OperatingTime)
return result B
else if {NOX Mass Equation Code<> "F-24A" OR Current DHVRecord Valid == false OR NOXR Calculated Adjusted Value is null OR
Heat Input Method Code NOT in set {CALC, ADCALC})
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period NOX Mass Calculated Accumulator Array for this location = -1
Results:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
B The AdjustedHourlyValue reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Mass Rate Calculation Verification
Environmental Protection Agency
Page 345 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-18
Check Name: Determine Diluent Cap and Moisture for C02 Mass Calculation Verification
Related Former Checks:
Applicability: CEM Check
Description: For each possible formula, ensure that all required components are available. Note that no responses are
output, because each missing part should have generated an earlier error message.
Specifications:
If (C()2 Method Code == "CEM")
if (CO2 Mass Equation Code== "F-2")
If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHVCalculated
Adjusted Value is not null)
Calculated Moisture for C02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisture for C02 = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)
Calculated Moisture for C02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == 'MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is
not null)
Calculated Moisture for C02 = H20 Default Value
if (Use C02 Diluent Cap for C02 Mass Calc == true)
C02N Count = # of active MonitoringDefault records for location where
ParameterCode = 'C02N' AND DefaultPurposeCode = 'DC' AND
FuelCode = 'NFS'
if (C02N Count > 1)
return result A
else if (C02N Count == 0)
return result B
else if MonitoringDefault.DefaultValue <= 0
return result C
else
Calculated Diluentfor C02 = MonitoringDefault. Default Value
else if {C02 Cone Derived Checks Needed ==true)
Calculated Diluentfor C02 = C02C DHV Calculated Adjusted Value
else if (CO2 Cone Checks Needed for C02 Mass == true)
if (Current C02 Cone Missing Data Monitor Hourly Record is not null)
Calculated Diluentfor C02 = C02C SD Calculated Adjusted Value
else
Calculated Diluentfor C02 = C02C MHV Calculated Adjusted Value
Results:
Result
A
B
C
Response
You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.
A DHV record indicates use of a diluent cap to calculate C02, but you did not report an
active C02N default record in your monitoring plan for the hour. Please note that the
use of the diluent cap to calculate C02 is only applicable to legacy data.
The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 346 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Mass Rate Calculation Verification
Environmental Protection Agency
Page 347 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-19
Check Name: Calculate C02 Mass Emissions
Related Former Checks:
Applicability: CEM Check
Description: Based on values from C02 Monitor Hourly and Stack Flow Monitor Hourly, plus moisture values if applicable
and the current equation code, the C02 Mass emissions rate is calculated
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if (Derived Hourly Adjusted Value Status == true AND Current Hourly Op Ttecon/.OperatingTime is between 0 and 1 (inclusive))
C02 Total Reported Value = Current /)//K/?6'cwcn\{\\\gY\mc.
if (Rpt Period C02 Mass Reported Accumulator Array for this location is not null)
if {Rpt Period C02 Mass Reported Accumulator Array for this location >= 0)
Rpt Period C02 Mass Reported Accumulator Array for this location = Rpt Period C02 Mass Reported
Accumulator Array for this location + C02 Total Reported Value
else
Rpt Period C02 Mass Reported Accumulator Array for this location = C02 Total Reported Value
else
Rpt Period C02 Mass Reported Accumulator Array for this location = -1
If (C02 Method Code == "CEM")
if (C02 Mass Equation Code == "F-ll")
If {Current DHV Record Valid == true AND Calculated Diluentfor C02 is not null AND FLOWCalculated Adjusted
Value is not null)
CO 2 Calculated Adjusted Value = 0.00000057 * Calculated Diluent for C02 * FLOWCalculated Adjusted
Value, ROUNDED to one decimal place.
else
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A
else if (C02 Mass Equation Code== "F-2")
If {Current DHV Record Valid == true AND Calculated Diluentfor C02 is not null AND FLOWCalculated Adjusted
Value is not null AND Calculated Moisture for C02 is not null)
CO 2 Calculated Adjusted Value = 0.00000057 * Calculated Diluent for C02 * FLOWCalculated Adjusted
Value* [(100.0 - Calculated Moisture for C02) /100.0], ROUNDED to one decimal place.
else
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A
else
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A
else if (CO2 App D Method Active for Hour == true)
if {C02 App D Accumulator >= 0 AND Current Hourly Op Ttecon/.OperatingTime is between 0 and 1 (inclusive))
CO 2 Calculated Adjusted Value = C02 App D Accumulator / Current Hourly Op Record .0\~>cn\{\\\gY\\lie. rounded to
one decimal place.
Environmental Protection Agency
Page 348 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
if (Legacy Data Evaluation == false)
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A
else
Rpt Period C02 Mass Calculated Accumulator Array for this location = -2
else
CO 2 Calculated Adjusted Value = Current DHV Calculated Adjusted Value
If (CO 2 Calculated Adjusted Value is not null)
If (Current Hourly Op /?6'tw= 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 {DerivedHourly 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 /fecwf/. AdjustedHourly Value - C02 Calculated Adjusted Value) > C02 Tolerance)
return result B
else
if {Rpt Period C02 Mass Calculated Accumulator Array for this location <> -2)
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
Results:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
B The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Mass Rate Calculation Verification
Environmental Protection Agency
Page 349 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-25
Check Name: Determine BAF Value for NOx Emission Rate System
Related Former Checks:
Applicability: CEM Check
Description: Retrieves and sets as an output parameter the Bias Adjustment factor for the NOX Rate Monitoring System
Specifications:
Current NOX System BAF = null
If (Current NOx System Status == true AND NOXR Calculated Unadjusted Value is not null AND Current NOx Rate Method Code in
set {CEM, PEM}) AND Current DHVRecord.ModcCodc in set {01, 02, 03, 14, 22, 53})
If {RATA Status BAF is not null)
Current NOX System BAF = RA TA Status BAF
else
return result A
Results:
Result Response Severity
A The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, because Informational Message
the prior RATA had critical errors or because of a RATA Status error listed on this
report.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOX RATA Status Evaluation
Environmental Protection Agency
Page 350 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-30
Check Name: Initialize S02 Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for S02.
Specifications:
Current DHVParameter = "S02"
Current DHVRecord Valid = SO2 Derived Hourly Status
S02 Calculated Adjusted Value = null
Calculated Moisture for S02 = null
Current DHV Record = Current S02 Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Calculation Verification
Environmental Protection Agency
Page 351 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-31
Check Name: Initialize NOX Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for NOX.
Specifications:
Current DHV Parameter = "NOX"
Current DHVRecord Valid = NOX Derived Hourly Status
NOX Calculated Adjusted Value = null
Calculated Moisturefor NOX = null
Current DHV Record = Current NOx Rate Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Mass Rate Calculation Verification
Environmental Protection Agency
Page 352 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-32
Check Name: Initialize NOXR Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for NOXR.
Specifications:
Current DHV Parameter = "NOXR"
Current DHVRecord Valid = NOXR Derived Hourly Status
NOXR Calculated Adjusted Value = null
Calculated Diluent for NOXR = null
Calculated Moisture for NOXR = null
Current DHVHBHA Value = Current NOXR HBHA Value
Current DHV Record = Current NOx Rate Derived Hourly Record
Current Appendix E Status = null
RATA Status Required = false
RA TA Status BAF = null
Current Hourly Recordfor RATA Status = Current NOx Rate Derived Hourly Record
Set QaStatusComponentld = null
Set QaStatusComponentldentifier = null
Set QaStatusComponentTypeCode = null
Set QaStatusSystemDesignationCode = CurrentDH VRecord.S\s\cmDcs\gm\\\onCoA.c
Set QaStatusSystemld = CurrentDH VRecord.Systemld
Set QaStatusSystemldentifier = CurrentDHVRecord_Sy stemIdentifiler
Set QaStatusSystemTypeCode = CurrentDHVRecord.SyslcmTypcCodc
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Environmental Protection Agency
Page 353 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-33
Check Name: Initialize C02 Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02.
Specifications:
Current DHVParameter = "C02"
Current DHVRecord Valid = CO2 Derived Hourly Status
C02 Calculated Adjusted Value = null
Calculated Diluent for C02 = null
Calculated Moisture for C02 = null
Current DHV Record = Current C02 Mass Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Mass Rate Calculation Verification
Environmental Protection Agency
Page 354 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-34
Check Name: Initialize C02C Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02C.
Specifications:
Current DHV Parameter = "C02C"
Current DHVRecord Valid = C02C Derived Hourly Status
C02C DHV Calculated Adjusted Value = null
Calculated Diluent for C02C = null
Calculated Moisture for C02C = null
Current DHVHBHA Value = Current C02C DHVHBHA Value
Current DHV Record = Current C02 Cone Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Calculation Verification
Environmental Protection Agency
Page 355 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-35
Check Name: Initialize H20 Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for C02C.
Specifications:
Current 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 QaStatusComponentldentifier = null
Set QaStatusComponentTypeCode = null
Set QaStatusSystemDesignationCode = CurrentDH VRecord.S\s\cmDcs\gm\\\onCoA.c
Set QaStatusSystemld = CurrentDH VRecord.Systemld
Set QaStatusSystemldentifier = CurrentDHVRecord_Sy stemIdentifiler
Set QaStatusSystemTypeCode = CurrentDHVRecord.SyslcmTypcCodc
if {Current DHV Record. MODCCode in set {01, 02, 03, 21, 53} AND Current DHV Record. SystemTypeCode == "H20")
RATA Status Required = true
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report H20 Calculation Verification
Environmental Protection Agency
Page 356 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-36
Check Name: Initialize HI Calculated Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HI.
Specifications:
Current DHVParameter = "HI"
Current DHVRecord Valid = HI Derived Hourly Status
HI Calculated Adjusted Value = null
Calculated Diluent for HI = null
Calculated Moisturefor HI = null
Current DHV Record = Current Heat Input Derived Hourly Record
RATA Status Required = false
Current Hourly Recordfor RATA Status = Current Heat Input Derived Hourly Record
Set QaStatusComponentld = null
Set QaStatusComponentldentifier = null
Set QaStatusComponentTypeCode = null
Set QaStatusSystemDesignationCode = CurrentI)HVRecord.S\s\cmDcs\gm\\\onCoA.c
Set QaStatusSystemldentifier = CurrentDHVRecord_ Sy stem Identi filer
Set QaStatusSystemTypeCode = CurrentDHVRecord.SyslcmTypcCodc
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Heat Input Calculation Verification
Environmental Protection Agency
Page 357 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-37
Check Name:
Related Former Checks:
Check Unadjusted Value
Applicability:
Description:
Specifications:
CEM Check
This check ensures that the UnadjustedValue in the DHV record for NOXR is valid.
Derived Hourly Unadjusted Value Status = false
If (Current NOx Rate Method Code in set { CEM, PEM})
If {Current DHV Record. ModcCode in set {01, 02, 03, 04, 14, 21, 22, 53, 54})
If (Current /)//K/?6'cwY/.UnadjustcdHourly Value is not null)
If (Current /)//K/?6'cwY/.UnadjustcdHourly Value < 0.0 AND
Current DHVRecord.ModcCode <> "21" )
return result A
Else if {Current DHVRecord.UnadjustedHourlyValue > 0 AND
Current DHV Record. ModcCode == 21)
return result B
Else if {Current /)/f^7?ecor Current DHV Max Min Value)
return result C
Else If {Current DHV Record. ModcCode not in set {04, 53, 54})
return result A
Else
Derived Hourly Unadjusted Value Status = true
Else if {DerivedHourly Mode Status == true)
If (Current /)//K/?6'cwy/. UnadjustedHourly Value is not null)
return result D
Else
Derived Hourly Unadjusted Value Status = true
Else If (Current /)//K/?6'cwy/. UnadjustedHourly Value is not null)
return result E
Else
Derived Hourly Unadjusted Value Status = true
Environmental Protection Agency Page 358 of 959
Else
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
Usage:
1
Response
The UnadjustedHourlyValue reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.
You reported an MODCCode of 21 in the DHV record for [param], but the
UnadjustedHourly Value is greater than 0.
Warning: The UnadjustedHourly Value reported in the DHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You should
investigate the cause of these exceedances and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
You reported an MODCCode of [modcCode] in the DHV record for [param], so you
should not have reported a value for the UnadjustedHourly Value.
You reported an UnadjustedHourly Value in the DHV record for [param], A value in
this field should not be reported for the [param] [method] method.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Environmental Protection Agency
Page 359 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-38
Check Name: Determine Maximum or Minimum Value for Parameter in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check determines the maximum or minimum value for the parameter from the span or default table based
on MODC.
Specifications:
Current DHV Max Min Value = null
If {Current DHV Record Valid == true AND
{{Current DHV Parameter == "H20" AND H20 Method Code == "MWD") OR
{Current DHV Parameter == "NOXR" AND Current NOx Rate Method Code in set {CEM,PEM}) OR
Current DHV Parameter == "C02C" OR
Current DHV Parameter =="HI")
If {Current DHV Parameter == "H20")
If {H20 Fuel Specific Missing Data == true)
Current DHV Fuel Specific Hour = true
If (H20 Missing Data Approach == 'MAX")
Current 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 = true
else
Current DHV Fuel Specific Hour = false
else if {NOx Rate Fuel Specific Missing Data == true)
Current DHV Fuel Specific Hour = true
else
Current DHV Fuel Specific Hour = false
else if {Current DHV Parameter == "C02C")
Current DHV Default Parameter = "C02X"
If (CO 2 Fuel Specific Missing Data == true)
Current DHV Fuel Specific Hour = true
If {Current DHV Parameter == "HI")
Locate all active UnitCapacity records linked to the location where MaxHourlyHeatlnputCapacity > 0.
If any are found,
Set Current DHV Max Min Value to the sum of MaxHourlyHeatlnputCapacity in all records found,
else if {Current DHV Default Parameter is not null)
If {Current DHV Record.ModcCode in set {12, 23, 25} AND Current DHV Fuel Specific Hour = true)
Environmental Protection Agency
Page 360 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If {Current Hourly Op Record.FuelCode is not null)
Current DHVMissing 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. Default Value > 0)
Current DHV Max Min Value = Default Record. Default Value
else
return result D
else if (Current DHVRecord.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
FuelCode = Current Hourly Op Record .FuelCode
DefaultPurposeCode = 'MD" //Missing Data
OperatingCode in == "C" // Controlled
if (count >1)
return result B
else if (count == 0)
return result C
else
Default Record = the single matched record
if (Default Record. Default Value > 0)
Current DHV Max Min Value = Default Record. Default Value
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
Environmental Protection Agency
Page 361 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (count >1)
return result B
else if (count == 0)
return result C
else
Default Record = the single matched record
if (Default Record. Default Value > 0)
Current DHV Max Min Value = Default Record. Default Value
else
return result D
else if {Current DHV Record. ModcCode <> "15"
Current DHV Missing Data Fuel = "NFS"
Count active MonitoringDefaultData record for location where
ParameterCode = Current DHV Default Parameter
FuelCode = "NFS"
DefaultPurposeCode = "MD" //Missing Data
OperatingCode in set {A,U} // Not Controlled
if (count >1)
return result B
else if (count == 0 AND Current DHV Parameter == "C02C")
Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "C02" AND
MonitoringSpanData. SpanScaleCode = "H"
if (Monitor Span Record Count > 1)
return result E
else if (Monitor Span Record Count = 0)
return result F
else
Current Monitor Span Record = the single matched record
If (Current Monitor Span Record. DefaultHighRange is null AND Current DHV
Record.ModcCode not in set {13, 24})
if (Current Monitor Span Record.MPCValue > 0)
Current DHV Max Min Value = Current Monitor Span Record.MPCValus
else
return result G
else if (count == 0 ANDCurrent DHV Parameter == "NOXR")
Count active MonitoringDefaultData record for location where
ParameterCode = "MNNX"
FuelCode = "NFS"
DefaultPurposeCode = 'MD" //Missing Data
OperatingCode in set {A,U} // Not Controlled
if (count > 1)
Current DHV Default Parameter = 'MNNX"
return result B
Environmental Protection Agency
Page 362 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (count = 0)
return result C
else
Current DHVDefault Parameter = 'MNNX"
Default Record = the single matched record
if (Default Record. Default Value >= 0)
Current DHV Max Min Value = Default Record. Default Value
else
return result D
else if (count == 0)
return result C
Default Record = the single matched record
if (Default Record. Default Value > 0)
Current DHV Max Min Value = Default Record .Default Value
else
return result D
Results:
Result
Response
Severity
A
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.
Critical Error Level 2
B
You reported more than one applicable [param] Default record with a FuelCode of
[FuelCode] in your monitoring plan for the hour.
Critical Error Level 1
C
You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].
Critical Error Level 1
D
The values reported in the applicable [param] Default record with a FuelCode of
[FuelCode] are invalid.
Critical Error Level 1
E
You reported more than one active span record for [key] in your monitoring plan for
the hour.
Critical Error Level 1
F
You did not report a missing data maximum default for C02 in a span or default
record in your monitoring plan.
Critical Error Level 1
G
The values reported in the applicable span record for [key] are invalid.
Critical Error Level 1
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— H20 Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— Heat Input Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— NOx Emissions Rate Calculation Verification
Environmental Protection Agency
Page 363 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-39
Check Name: Check Adjusted Hourly Value in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that AdjustedHourlyValue is valid and does not conflict with the reported MODC codes.
Validation Tables:
Parameter UOM (Complex Lookup Table)
Specifications:
Derived Hourly Adjusted Value Status = false
Current DHV Calculated Adjusted Value = null
if (Current DHV Record Valid == true)
Locate Parameter Units of Measure lookup table record where ParameterCode = Current DHV Parameter.
If (Hourly Fuel Flow Count For Gas is greater than 0 AND Current DHV Parameter == "S02")
Set Current DHV Precision to 4.
else
Set Current DHV Precision to the Parameter Lin its of Measure. D ec i m a 1 s_ H r 1 y.
if (Current DHV Record.ModcCode is not null)
case (Current DHV Record.ModcCodc)
= 21: Current DHV Calculated Adjusted Value = 0
if (Current DHV Record. AdjustedHourlyValue == 0)
Derived Hourly Adjusted Value Status = true
else
return result A
= 12 OR 23 OR 25:
If (Current DHV Max Min Value is not null)
Current DHV Calculated Adjusted Value = Current DHV Max Min Value
if (Current DHV Record. AdjustedHourlyValue == Current DHV Max Min Value)
Derived Hourly Adjusted Value Status = true
else
return result B
= 13 OR 24:
If (Current DHV Max Min Value is not null)
Current DHV Calculated Adjusted Value = Current DHV Max Min Value
if (Current DHV Record. AdjustedHourlyValue == Current DHV Max Min Value)
Derived Hourly Adjusted Value Status = true
else
return result C
= 06:
If (Current DHV Parameter in set {C02C, H20} AND (Current DHV Record. AdjustedHourlyValue is null or
Current DHV Record. AdjustedHourlyValue < 0 or Current DHV Record. AdjustedHourlyValue > 100))
return result L
else if (Current DHVHBHA Value is not null)
Environmental Protection Agency
Page 364 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Current DHV Calculated Adjusted Value = Current DHV HBHA Value
If (Current AdjustedHourly Value >= 0)
if ( Current AdjustedHourly Value == Current DHV Calculated Adjusted Value)
Derived Hourly Adjusted Value Status = true
else
return result D
else
return result E
else
If (Current /)//K/?6'«.>/y/. AdjustedHourly Value >= 0)
If (Current /)//K/?6'cmy/. AdjustedHourly Value is not rounded to Current DHV Precision)
return result M
else
Current DHV Calculated Adjusted Value = Current /)//K/?6'cmy/. 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 H2() Missing Data Approach ==
"MIN")
if {Current DHV Record. AdjustedHourlyValue < Current DHV Max
Min Value)
return result H
else
if {Current DHV Record. AdjustedHourlyValue > Current DHV Max
Min Value)
If {Current DHV Parameter == "NOXR" and Current DHV
Record. AdjustedHourlyValue > Current DHV Max Min Value
*2)
return result O
Otherwise,
return result G
Else
return result E
08 OR 09:
If {Current DHV Parameter in set {C02C, H20} AND {Current DHV Record. AdjustedHourlyValue is null or
Current DHV Record. AdjustedHourlyValue < 0 or Current DHV Record. AdjustedHourlyValue > 100))
return result L
else if {Current DHV Record. AdjustedHourlyValue >= 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. AdjustedHourlyValue)
Current DHV Calculated Adjusted Value = Current DHV HBHA Value
return result N
else if {Current DHV HBHA Value is not null AND {Current DHV Parameter <> "H20" OR H20
Missing Data Approach == 'MAX") AND Current DHV HBHA Value > Current DHV
Ttecon/.AdjustedHourlyValue AND {Unit is Load Based == true or Current DHV Parameter <>
"NOXR"))
Current DHV Calculated Adjusted Value = Current DHV HBHA Value
Environmental Protection Agency
Page 365 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result F
elseif (Current AdjustedHourly Value is not rounded to Current DHVPrecision)
return result M
else
Current DHV Calculated Adjusted Value = Current 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 H2() Missing Data Approach == 'MIN")
if {Current DHV Record. AdjustedHourlyValue < Current DHV Max Min
Value)
return result H
else
if {Current DHV Record. AdjustedHourlyValue > Current DHV Max Min
Value)
If {Current DHV Parameter == "NOXR" and Current DHV
Record. AdjustedHourlyValue > Current DHV Max Min Value * 2)
return result O
Otherwise,
return result G
Else
return result E
04, 05, 07, 10, 11, 15, 53, 54, OR 55:
If {Current DHV Parameter in set {C02C, H20} AND {Current DHV Record. AdjustedHourlyValue is null or
Current DHV Record. AdjustedHourlyValue < 0 or Current DHV Record. AdjustedHourlyValue > 100))
return result L
elseif {Current DHV Record. AdjustedHourlyValue >= 0)
If {Current DHV Record. AdjustedHourlyValue is not rounded to Current DHV Precision)
return result M
else
Current DHV Calculated Adjusted Value = Current DHV Record. AdjustedHourlyValue
Derived Hourly Adjusted Value Status = true
if {Current DHV Parameter in set {C02C, H20, NOXR} AND Current DHV Max Min Value
is not null)
If {Current DHV Parameter == "H20" AND H2() Missing Data Approach == 'MIN")
if {Current DHV Record. AdjustedHourlyValue < Current DHV Max Min
Value)
return result H
else
if {Current DHV Record. AdjustedHourlyValue > Current DHV Max Min
Value)
If {Current DHV Parameter == "NOXR" and Current DHV
Record. AdjustedHourlyValue > Current DHV Max Min Value * 2)
return result O
Otherwise,
return result G
Else
return result E
Environmental Protection Agency
Page 366 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
= 26: If (Current AdjustedHourly Value == 1)
Derived Hourly Adjusted Value Status = true
else
return result I
= All Other Codes except 40:
If {CurrentDHVParameter in set {C02C, H20} AND (Current AdjustedHourly Value is null or
Current DHV/fecwf/. AdjustedHourly Value < 0 or Current DHV/fecwf/. AdjustedHourly Value > 100))
return result L
else if (Current /)//K/?6'cmy/. AdjustedHourly Value >= 0)
If (Current /)//K/?6'cmy/. AdjustedHourly Value is not rounded to Current DHV Precision)
return result M
else
Derived Hourly Adjusted Value Status = true
If {Current DHV Parameter in set {C02C, H20} AND Current DHV Max Min Value is not
null)
If {Current DHV Parameter == "H20" AND H2() Missing Data Approach == 'MIN")
if {Current DHV Record. AdjustedHourlyValue < Current DHV Max Min
Value)
return result H
else
if {Current DHV Record. AdjustedHourlyValue > Current DHV Max Min
Value)
return result G
Else
return result E
else
If {Current DHV Record. AdjustedHourlyValue >= 0)
If {Current DHV Record. AdjustedHourlyValue 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. AdjustedHourlyValue
If {Current DHV Record. AdjustedHourlyValue == 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. AdjustedHourlyValue > Current DHV Max Min Value)
Environmental Protection Agency
Page 367 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result G
else if {Current DHVParameter == "NOXR")
if {Current NOx Rate Method Code <> "AE")
Current DHV Calculated Adjusted Value = Current /)//K/?6'cw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
H
I
J
K
L
M
N
O
Response
You reported an MODCCode of 21 in the DHV record for [param], but the
AdjustedHourlyValue does not equal 0.
You reported an MODCCode of [modcCode] in the DHV record for [param], but the
AdjustedHourly Value does not equal the maximum potential value reported in the span
or default record in your monitoring plan.
You reported an MODCCode of 13 or 24 in the DHV record for NOXR, but the
AdjustedHourly Value does not equal the maximum controlled emission rate reported in
the NORX default record in your monitoring plan.
You reported an MODCCode of 06 in the DHV record for [param], but the
AdjustedHourly Value does not equal average of measured hour before and measured
hour after.
The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.
You reported an MODCCode of [MODCCode] in the DHV record for [param], but you
reported an AdjustedHourly Value that is less than the average of the measured hour
before and measured hour after.
Warning: The AdjustedHourly Value reported in the DHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span, Default, and/or Unit Capacity
values. You should investigate the cause of these exceedances and determine whether
adjustments to your monitoring systems or monitoring plan are necessary.
Warning: The AdjustedHourly Value reported in the DHV record for [param] is lower
than the minimum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these minimum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span Default values. You should
investigate the cause of these low values and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
You reported an MODCCode of 26 in the DHV record for [param], but the
AdjustedHourly Value does not equal 1.
You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you operated
more than 0.25 hour.
You reported an AdjustedHourly Value of 0 in the DHV record for HI, but you had
operating time during the hour. If you operated, you must report a heat input rate of at
least 1 mmBtu/hr.
The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be between 0 and 100.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported an MODCCode of [MODCCode] in the DHV record for [param], but you
reported an AdjustedHourly Value that is greater than the average of the measured hour
before and measured hour after.
The AdjustedHourly Value reported in the DHV record for NOXR is in excess of 200%
of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You should
investigate the cause of these exceedances and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Informational Message
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Environmental Protection Agency
Page 369 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
C02 Concentration Calculation Verification
C02 Mass Rate Calculation Verification
H20 Calculation Verification
Heat Input Calculation Verification
NOx Emissions Rate Calculation Verification
NOx Mass Rate Calculation Verification
S02 Calculation Verification
Environmental Protection Agency
Page 370 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURCV-40
Check Name:
Related Former Checks:
Determine Moisture for S02 Mass Calculation Verification
Applicability:
Description:
CEM Check
Verifies that all elements are present to support the equation code indicated by the current S02 Mass Rate
record
Specifications:
If (S02 Method Code begins with "CEM")
if (S02 Mass Equation Code== "F-2")
If (H20 Method Code == "MWD" AND H20 Derived Hourly Checks Needed == true AND H20 DHVCalculated
Adjusted Value is not null)
Calculated Moisture for S02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code in set {MMS, MTB} AND H20 Monitor Hourly Checks Needed == true AND H20MHV
Calculated Adjusted Value is not null)
Calculated Moisture for S02 = H20 MHV Calculated Adjusted Value
else if (H20 Method Code == "MDF" AND H20 Derived Hourly Checks Needed == true AND H20 DHV Calculated
Adjusted Value is not null)
Calculated Moisture for S02 = H20 DHV Calculated Adjusted Value
else if (H20 Method Code == 'MDF" AND H20 Derived Hourly Checks Needed == false AND H20 Default Value is
not null)
Calculated Moisture for S02 = H20 Default Value
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Calculation Verification
Environmental Protection Agency
Page 371 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-41
Check Name: Calculate Adjusted NOx Rate in DHV Record
Related Former Checks:
Applicability: General Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
if (Derived Hourly Adjusted Value Status == true)
if {Rpt Period NOx Rate Reported Accumulator Array for this location is not null)
if {Rpt Period NOx Rate Reported Accumulator Array for this location >= 0)
Rpt Period NOx Rate Reported Accumulator Array for this location = Rpt Period NOx Rate Reported
Accumulator Array for this location + Current DHV 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
/?6'ewY/.0pcrati ngTi mc is between 0 and 1 (inclusive))
If {NOXRApp EAccumulator == 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
Calculated Adjusted Value * NOXR Calculated Adjusted Value)
else
Config NOxRateTimesHeatlnput Accumulator = -1
if {Config NOxRateTimesOpTime Accumulator >= 0 AND Current Hourly Op Ttecon/.OperatingTime is between 0 and
1 (inclusive))
Config NOxRateTimesOpTime Accumulator = Config NOxRateTimesOpTime Accumulator + {Current Hourly
Op Record.0\~>cn\{\\\gY\mc * NOXR Calculated Adjusted Value)
Config OpTime Accumulator = Config OpTime Accumulator + Current Hourly Op Record.OperatingTime
Environmental Protection Agency
Page 372 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Config NOxRateTimesOpTime 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(N()XR Calculated Adjusted Value - Current 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:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for [param] could not be recalculated due Informational Message
to errors listed above.
B The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
Environmental Protection Agency
Page 373 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Calculation Verification
Conditions: RATA Status Required Equals false
2 Process/Category: Emissions Data Evaluation Report NOX RATA Status Evaluation
Environmental Protection Agency
Page 374 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-42
Check Name: Check HI System in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that a valid Monitoring System is indicated in the DHV record.
Specifications:
If Current DHV Parameter == "HI" AND Heat Input Method Code in set {CEM, AMS} )
If (Current DHV Record Momtoxmg'SystemSD is null
If (Heat Input Method Code == "CEM" )
If (CO2 Cone Checks Needed for Heat Input == true AND Current C02 Cone Monitor Hourly Record is not
null AND Current C02 Cone Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20, 21}) OR
(02 Wet Checks Needed for Heat Input == true AND Current 02 Wet Monitor Hourly Record is not null
AND Current 02 Wet Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20}) OR
(02 Dry Checks Needed for Heat Input == true AND Current 02 Dry Monitor Hourly Record is not null
AND Current 02 Dry Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20})
return result A
Else
return result E
Else
HIDHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHVTtecon/.MonitoringSystemID
If (HI DHVMon Sys Record is null)
return result C
Else If (HIDHVMon ,SV.v Record.SystcmTypcCodc not in set {C02, 02} )
return result D
Else If (Heat Input Method Code != "CEM") OR
( CO2 Cone Checks Needed for Heat Input == true AND Current C02 Cone Monitor Hourly Record is not
null AND Current C02 Cone Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20, 21} ) OR
( 02 Wet Checks Needed for Heat Input == true AND Current 02 Wet Monitor Hourly Record is not null
AND Current 02 Wet Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20} ) OR
( 02 Dry Checks Needed for Heat Input == true AND Current 02 Dry Monitor Hourly Record is not null
AND Current 02 Dry Monitor Hourly Record.ModcCode in set {01, 02, 03, 04, 17, 20} )
If (CO2 RATA Required == true )
RATA Status Required = true
Environmental Protection Agency
Page 375 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Usage:
1
Response
You did not report MonitoringSystemID in the DHV record for HI. While this was
acceptable for legacy data, this field is required when you report measured data.
You reported a MonitoringSystemID in the DHV record for [param]. This field should
be blank when missing data substitution is used.
You reported MonitoringSystemID [ID] in the DHV record for [param], but according
to your monitoring plan this system was not active during the hour.
You reported MonitoringSystemID [ID] in the DHV record for HI, but this system is
not a C02 or 02 monitoring system.
You did not report MonitoringSystemID in the DHV record for HI.
MonitoringSystemID is required when you report missing data.
Severity
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Informational Message
Process/Category: Emissions Data Evaluation Report Heat Input Calculation Verification
Environmental Protection Agency
Page 376 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURCV-43
Check Name: Determine DHV Measure Code
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Set Current Measure Code to null.
If {Current DHV Parameter in set {C02C, H20})
If (Current DHV Record. ModcCode in set {01, 02, 03, 04, 21, 53, 54})
Set Monitor Measure Code Array for the Current DHV Parameter to "MEASURE"
if {Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F-14B" AND Monitor Measure
Code Array for "H20" == "SUB")
Set Monitor Measure Code Array for "C02C" to "MEASSUB".
else if {Current DHV Record. ModcCode in set {06, 07, 08, 09, 10, 12, 55})
Set Monitor Measure Code Array for the Current DHV Parameter to "SUB"
if {Current DHV Parameter == "C02C" AND CO 2 Cone CEM Equation Code == "F-14B" AND Monitor Measure
Code Array for "H20" == 'MEASURE")
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 DHVParameter == "HI")
If {Heat Input Method Code == "CEM")
if {Heat Input Equation Code in set {F-15, F-16})
If {Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
Environmental Protection Agency
Page 377 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 "02 W" 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 {OTHER, MEASSUB})
set Current Measure Code to Monitor Measure Code Array for "FF".
else if {Monitor Measure Code Array for "FF" and "GCV" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
else if {Monitor Measure Code Array for "FF" and "GCV" are both equal to "SUB")
set Current Measure Code to "SUB".
else if {Monitor Measure Code Array for "FF" and "GCV" are both not null)
set Current Measure Code to "MEASSUB".
if {Monitor Measure Code Array for "DENSITY" is not null)
If {{Current Measure Code == 'MEASURE" AND Monitor Measure Code Array for "DENSITY" == "SUB")
OR {Current Measure Code == "SUB" AND Monitor Measure Code Array for "DENSITY" == "MEASURE"))
set Current Measure Code to "MEASSUB".
Set HI Measure Code to the Current Measure Code.
Environmental Protection Agency
Page 378 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if {Current DHVParameter == "S02")
If (SO2 CEM Method Active for Hour == true)
If (Monitor Measure Code Array for "S02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
else if (Monitor Measure Code Array for "S02C" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".
else if (Monitor Measure Code Array for "S02C" and "FLOW" are both not null)
set Current Measure Code to "ME AS SUB".
if (SO2 Equation Code == "F-2" AND Monitor Measure Code Array for "H20" is not null)
If ((Current Measure Code == 'MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == 'MEASURE"))
set Current Measure Code to "ME AS SUB".
else if (SO2 F23 Method Activefor Hour == true)
set Current Measure Code to HI Measure Code.
else if (SO2 App D Method Active for Hour == true)
If (Monitor Measure Code Array for "FF" in set {OTHER, ME AS SUB} 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 (C02 Method Code == "CEM")
If (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
else if (Monitor Measure Code Array for "C02C" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".
else if (Monitor Measure Code Array for "C02C" and "FLOW" are both not null)
set Current Measure Code to "ME AS SUB".
if (CO2 Mass Equation Code == "F-2" AND Monitor Measure Code Array for "H20" is not null)
If ((Current Measure Code == 'MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == 'MEASURE"))
set Current Measure Code to "ME AS SUB".
Environmental Protection Agency
Page 379 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (CO 2 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-24A")
If (HIMeasure Code andNOXRMeasure Code are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
else if (HIMeasure Code and NOXR Measure Code are both equal to "SUB")
set Current Measure Code to "SUB".
else if (HI Measure Code and NOXR Measure Code are both not null)
set Current Measure Code to "ME AS SUB".
else if (NOx Mass Equation Code in set {F-26A, F-26B})
If (Monitor Measure Code Array for "NOXC" and "FLOW" are both equal to "MEASURE")
set Current Measure Code to "MEASURE".
else if (Monitor Measure Code Array for "NOXC" and "FLOW" are both equal to "SUB")
set Current Measure Code to "SUB".
else if (Monitor Measure Code Array for "NOXC" and "FLOW" are both not null)
set Current Measure Code to "ME AS SUB".
if (NOxMass Equation Code == "F-26B" AND Monitor Measure Code Array for "H20" is not null)
If ((Current Measure Code == 'MEASURE" AND Monitor Measure Code Array for "H20" == "SUB") OR
(Current Measure Code == "SUB" AND Monitor Measure Code Array for "H20" == 'MEASURE"))
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".
Results:
Result
Response
Severity
Environmental Protection Agency
Page 380 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
2
Process/Category:
3
Process/Category:
4
Process/Category:
5
Process/Category:
6
Process/Category:
7
Process/Category:
8
Process/Category:
9
Process/Category:
10
Process/Category:
11
Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
C02 Concentration 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 381 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Derived Data
Environmental Protection Agency
Page 382 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-1
Check Name: Initialize S02 Derived Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for S02.
Specifications:
Current DHVParameter = "S02"
SO2 Derived Hourly Status = true
Current DHV Record = Current S02 Derived Hourly Record
Current DHV Method = SO2 Method Code
Current DHV System Type = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Derived Hourly Evaluation
Environmental Protection Agency
Page 383 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-2
Check Name: Initialize NOX Derived Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for NOX.
Specifications:
Current DHV Parameter = "NOX"
NOX Derived Hourly Status = true
Current DHV Record = Current NOx Mass Derived Hourly Record
Current DHV Method = NOx Mass Monitor Method Code
Current DHV System Type = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Mass Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 384 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-3
Check Name: Initialize NOXR Derived Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for NOXR.
Specifications:
Current DHV Parameter = "NOXR"
NOXR Derived Hourly Status = true
Current DHV System Type = null
Current DHV Record = Current NOx Rate Derived Hourly Record
Current DHV Method = Current NOx Rate Method Code
NOx Emission Rate MODC = Current NOx Rate Derived Hourly Mode Code
if {Current DHV Method == "CEM")
Current DHV System Type= "NOX"
else if {Current DHV Method == "PEM")
Current DHV System Type= "NOXP"
if {Current DHV Method == "AE")
Current DHV System Type= "NOXE"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 385 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-4
Check Name: Initialize C02 Derived Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for C02.
Specifications:
Current 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
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Mass Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 386 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-5
Check Name: Initialize C02C Derived Hourly Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for C02C.
Specifications:
Current DHV Parameter = "C02C"
C02C Derived Hourly Status = true
Current DHV Record = Current C02 Cone Derived Hourly Record
Current DHV System Type = 'C02'
Current DHVMethod = "CEM"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Derived Hourly Evaluation
Environmental Protection Agency
Page 387 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-6
Check Name: Initialize H20 Derived Hourly Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for H20.
Specifications:
Current 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 Recordfor RATA Status = Current H20 Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report H20 Derived Hourly Evaluation
Environmental Protection Agency
Page 388 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-7
Check Name: Initialize HI Derived Hourly Data
Related Former Checks:
Applicability: General Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HI.
Specifications:
Current 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
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Heat Input Derived Hourly Evaluation
Environmental Protection Agency
Page 389 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-8
Check Name: Initialize S02R Derived Hourly Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for S02R.
Specifications:
Current DHV Parameter = "S02R"
S02R Derived Hourly Status = true
Current DHV System Type = null
Current DHV Record = Current S02R Derived Hourly Record
Current DHV Method = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 390 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-9
Check Name: Initialize S02M Derived Hourly Data
Related Former Checks:
Applicability: LME Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for S02M.
Specifications:
Current DHV Parameter = "S02M"
S02M Derived Hourly Status = true
Current DHV System Type = null
Current DHVMethod = "LME"
Current DHV Record = Current S02 Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 391 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-10
Check Name: Initialize NOXM Derived Hourly Data
Related Former Checks:
Applicability: LME Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for NOXM.
Specifications:
Current DHV Parameter = "NOXM"
NOXM Derived Hourly Status = true
Current DHV System Type = null
Current DHVMethod = "LME"
Current DHV Record = Current NOx Mass Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXM Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 392 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-11
Check Name: Initialize C02M Derived Hourly Data
Related Former Checks:
Applicability: LME Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for C02M.
Specifications:
Current DHV Parameter = "C02M"
C02M Derived Hourly Status = true
Current DHV System Type = null
Current DHVMethod = "LME"
Current DHV Record = Current C02 Mass Derived Hourly Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 393 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-12
Check Name: Initialize HIT Derived Hourly Data
Related Former Checks:
Applicability: LME Check
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HIT.
Specifications:
Current 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
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report HIT Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 394 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-13
Check Name: Check MODC in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: Basic check to ensure that MODC reported in the DHV record is valid for the parameter. Also initializes
variables for the category.
Specifications:
Derived Hourly Mode Status = false
case {Current DHV Parameter)
S02: If {Current DHV Method == "AMS")
If {Current DHV Record. ModcCode is not null and is not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 13,
15, 16,21,23, 53, 54, 55})
return result A
Else
Derived Hourly Mode Status = true
else
If (Current DHV Record.ModcCode is not null)
return result B
Else
Derived Hourly Mode Status = true
NOX: 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 DHVMethod == "AE")
If {Current DHV Record. ModcCode is not null)
return result C
Else
Derived Hourly Mode Status = true
else
if {Current DHV Reeord.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
Environmental Protection Agency
Page 395 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
C02: If {CurrentDHVMethod == "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
Derived Hourly Mode Status = true
H20: H20 DHVMODC = Current DHV Record. ModcCode
if {Current DHV Method == "MWD")
If {CurrentDHVRecord.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:
Environmental Protection Agency
Page 396 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
If (Current DHVRecord.ModcCode is not null)
return result B
Else
Derived Hourly Mode Status = true
Results:
Result
A
B
C
D
Usage:
Response
The MODCCode reported in the DHV record for [param] is invalid.
You reported an MODCCode in the DHV record for [param]. This field should be
blank.
You reported an MODCCode in the DHV record for NOXR. This field should be
blank when you use the Appendix E method to determine the NOx emission rate.
You reported an MODCCode of 45 in the DHV record for HIT, but you have not
reported a SubstituteDataCode of MHHI in the active heat input method record in your
monitoring plan.
Severity
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Derived Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02 Mass Rate Derived Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— C02M Derived Hourly Evaluation (LME)
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Derived Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— Heat Input Derived Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— HIT Derived Hourly Evaluation (LME)
7
Process/Category:
Emissions Data Evaluation Report —
— NOx Emissions Rate Derived Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— NOx Mass Rate Derived Hourly Evaluation
9
Process/Category:
Emissions Data Evaluation Report —
— NOXM Derived Hourly Evaluation (LME)
10
Process/Category:
Emissions Data Evaluation Report —
— S02 Derived Hourly Evaluation
11
Process/Category:
Emissions Data Evaluation Report —
— S02M Derived Hourly Evaluation (LME)
12
Process/Category:
Emissions Data Evaluation Report —
— S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 397 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-14
Check Name: Check Percent Monitor Availability in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: Performs a series basic checks to ensure that the reported monitor percent available is between 0 and 100,
inclusive, then checks to see that percent available is within permitted ranges for specific MODC codes
Specifications:
Derived Hourly Pma Status = false
Derived Hourly Missing Data Status = true
If (Derived Hourly Mode Status == true)
If ( Current DHV Record.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 DHVParameter == "NOXR" and Current DHVMethod == "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. PercentAvailable> 100.0 OR
Current DHV Record. PercentAvailable < 0.0)
return result D
Else
case ( Current DHV Record. ModcCode)
= 06: If Current DHVRecord.Percent Available >= 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
Environmental Protection Agency
Page 398 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
return result E
= 10: If Current Percent Available >=80.0 AND Current Percent Available < 90,0
Derived Hourly Pma Status = true
Else If Current DHVParameter == "NOXR" and Current Percent Available >=90.0
Derived Hourly Pma Status = true
return result F
Else
return result E
= 11: If Current DHV Record. PercentAvailable >=90.0
Derived Hourly Pma Status = true
Else
return result E
All other MODC Codes:
Derived Hourly Pma Status = true
Results:
Result
A
B
C
D
E
F
Response
You reported an MODCCode of [ModcCode] in the DHV record for [param], but you
did not report a value for PercentAvailable. While this is not required for legacy EDR
data, it is required in all [param] DHV records for ECMPS.
You did not report PercentAvailable in the DHV record for [param].
You reported PercentAvailable in the DHV record for [param]. This field should be
blank.
The PercentAvailable reported in the DHV record for [param] is invalid. This value
must be between 0 and 100.
You reported an MODCCode of [modcCode] in the DHV for [param], but the
PercentAvailable is not appropriate for this MODC.
You reported an MODCCode of 10 in the [type] record for [param], but the
PercentAvailability is greater than or equal to 90. When the PMA is greater than or
equal to 90, you should only report an MODC of 10 to indicate that you used the
maximum hourly value in the lookback period for the next available higher load bin,
because there were no quality-assured data in the bin corresponding to the current load
range. (See Part 75.33(c)(5).)
Severity
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Environmental Protection Agency
Page 399 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
2
Process/Category:
3
Process/Category:
4
Process/Category:
5
Process/Category:
6
Process/Category:
7
Process/Category:
8
Process/Category:
9
Process/Category:
10
Process/Category:
11
Process/Category:
12
Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 400 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-15
Check Name: Check Prior QA'd Hours for MODC 07
Related Former Checks:
Applicability: CEM Check
Description: For Method of Determination Code 07, all prior hours in reporting period are checked to ensure that total of
QA'd hours is below a certain threshold
Specifications:
if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
if (Current DHV Record.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 Response Severity
A You reported an MODCCode of 07 in the DHV record for [param], but too many prior Critical Error Level 1
quality assured hours exist in evaluation period for use of this missing data approach.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report H20 Derived Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 401 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-16
Check Name:
Related Former Checks:
Check for Correct Use of Missing Data MODCs
Applicability:
Description:
Specifications:
CEM Check
Current DHVHBHA Value = null
if (Derived Hourly Mode Status == true AND Derived Hourly PMA Status == true)
case (Current DHV Parameter)
NOXR: MODCSet = {01, 02, 03, 04, 14, 21, 22, 53, 54}
C02C: MODCSet = {01, 02, 03, 04, 21, 53, 54}
H20: MODCSet = {01, 02, 03, 04, 21, 53, 54}
if (Current DHV Record. ModcCode in set {06, 08, 09})
If (CurrentMHVParameter in set {C02C, H20})
Prior Record = latest DerivedHourlyValueData record or MonitorHourlyValueData record where
ParameterCode = Current DHV Parameter AND
ModcCode in set MODCSet 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 MODCSet AND
(Date > Current Date OR
(Date = Current Date AND Hour > Current Hour ))
If Next Record is not null and is in current reporting period
If Pr/'ori?ecor(i.AdjustedHourlyValue >= 0 AND Xext AdjustedHourlyValue >= 0
Current DHV HBHA Value = (Prior .Record. AdjustedHourlyValue + Next
/tecrw/. Adjust edHourlv Value) / 2, ROUNDED to a single decimal.
else
Derived Hourly Missing Data Status = false
return result A
Prior DHV Record = latest DerivedHourlyValueData record where
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
DerivedHourValueData.ModcCode in set MODCSet 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
else
Environmental Protection Agency
Page 402 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Next DHVRecord = earliest DerivedHourlyValueData record where
DerivedHourlyValueData.ParameterCode = Current MHVParameter AND
DerivedHourValueData.ModcCode in set MODCSet AND
[DerivedHourlyValueData.Date > Current Date OR
(DerivedHourlyValueData.Date = Current Date AND DerivedHourlyValueData.Hour > Current
Hour)]
If Next DHVRecord is not null and is in current reporting period
If Prior Dili Adjust cdHourlvValuc >= 0 AND Xexi Dili Adjust cdHourlvValuc
>=0
Current DHVHBHA Value = {Prior DHVRecord. AdjustedHourlyValue + NextDHV
/tecrw/. Adjust edHourlv Value) / 2, ROUNDED to three decimal places.
else
Derived Hourly Missing Data Status = false
return result A
else if {Current DHV Record. ModcCode == "11")
Prior Measured DHV Record = DerivedHourlyValueData record at latest time for the location where
DerivedHourlyValueData.ModcCode in set MODCSet AND
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate < Current Date OR
(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour < Current
Hour))
If Prior Measured DHVRecord is not null and is in the current reporting period
PriorDate = Prior Measured DHVRecord.BeginDate
PriorHour = Prior Measured Dili 'Record. Begi riHour
else
PriorDate = the day prior to the beginning of the current reporting period
PriorHour = 23
Next Measured DHVRecord = DerivedHourlyValueData record at earliest time for the location where
DerivedHourlyValueData.ModcCode in set MODCSet AND
DerivedHourlyValueData.ParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate > Current Date OR
(DerivedHourlyValueData.BeginDate = Current Date AND DerivedHourlyValueData.BeginHour > Current
Hour))
If Next Measured DHVRecord is not null and is in the current reporting period
NextDate = Next Measured DHVRecord .BeginDate
NextHour = Next Measured DHVRecord.BeginHour
else
NextDate = the day after the end of the current reporting period
NextHour = 0
Missing Data Period Length = Count of DerivedHourlyValueData records for the location where
DerivedHourlyValueDataParameterCode = Current DHV Parameter AND
(DerivedHourlyValueData.BeginDate > PriorDate OR
(DerivedHourlyValueData.BeginDate = PriorDate AND DerivedHourlyValueData.BeginHour >
PriorHour)) AND
(DerivedHourlyValueData.BeginDate < NextDate OR
Environmental Protection Agency
Page 403 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
(DerivedHourlyValueData.BeginDate = NextDate AND DerivedHourlyValueDataBeginHour <
NextHour))
if {Current DHV Record. Percent Available 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
3
Response Severity
The AdjustedHourlyValue reported in the DHV record for [param] either before or after Critical Error Level 1
the current hour is invalid.
You reported an MODCCode of 11 in the DHV record for [param], but the length of Critical Error Level 1
the missing data period exceeds the allowable value for use of this missing data
procedure.
Process/Category:
Process/Category:
Process/Category:
Emissions Data Evaluation Report C02 Concentration Derived Hourly Evaluation
Emissions Data Evaluation Report H20 Derived Hourly Evaluation
Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 404 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-17
Check Name: Check Extraneous Data in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that certain fields are null in the DHV record.
Specifications:
Derived Hourly Null Status = false
Hourly Extraneous Fields = null
if (Current /)//K/?6'cwY/.UnadjustcdHourly Value is not null)
append "UnadjustedHourly Value" to Hourly Extraneous Fields
if (Current DHV Record.SQgmsiaXNwtfoQX is not null)
append "SegmentNumber" to Hourly Extraneous Fields
if (Current /)/f^7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
2
Process/Category:
3
Process/Category:
4
Process/Category:
5
Process/Category:
6
Process/Category:
7
Process/Category:
8
Process/Category:
9
Process/Category:
10
Process/Category:
11
Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 406 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-18
Check Name: Check System in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that a valid Monitoring System is indicated in the DHV record.
Specifications:
Current DHVMon Sys Record = null
Derived Hourly System Status = false
if {Current DHV Parameter == "NOXR")
App E Constant Fuel Mix = false
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 Momtoxmg'SystQmSD is NOT null
return result A
else
Derived Hourly System Status = true
Else If ( Current DHV Parameter <> "HI" )
case {Current DHV Parameter)
NOXR: MODCSet = {01, 02, 03, 04, 14, 21, 22}
C02C: MODCSet = {01, 02, 03, 04, 21}
H20: MODCSet={01,02,03,04,21}
If {Current DHV Record.MomtoringSystemlD is null)
If {Current DHV Method == "AMS")
Derived Hourly System Status = true
Else If (Current DHV Method == "AE")
If Current /)/f^7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
AND NOT {Current DHV Parameter == "H20" AND Current DHVMethod == "MWD" ))
return result B
else
Current DHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current DHVTtecon/.MonitoringSystemID
if {Current DHV Mon Sys Record is null)
return result D
else if {Derived MHVMon Sys Record. SystcmTypcCodc <> Current DHV System Type)
return result E
else if {Current DHV Method == "AE" AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Countfor
Oil > 0)
If {Derived DHV Mon Sys Record.Fuc\Co&c == 'MIX" OR Current DHV
Record. Opcrat i ngCondi t ionCode is not null)
if (Current /)//K/?6'ewY/.OpcratingConditionCodc == "E")
return result F
else
App E Constant Fuel Mix = true
App E Reporting Method = "CONSTANT"
App E Reported Value = Current DHV Record. Adjust cdHourly Value
App E Segment Number = Current DHV Record. SegmentNumber
App E Fuel Code = 'MIX"
App E NOXE System ID = Current DHV Record Mo\\\{ox'\ ngSystcm ID
App E NOXE System Identifier = Current System Identifier
Derived Hourly System Status = true
if (Current /)//K/?6'cwY/.OperatingConditionCode in set {X, Y, Z, U, W, N, M})
App E Op Code = Current /)//K/?6'ewY/.OpcratingConditionCodc
if {Derived DHV Mon Sys Record.¥uc\CoAc <> "MIX")
return result G
else
return result H
else
return result I
else
Derived Hourly System Status = true
Environmental Protection Agency
Page 408 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
H
I
K
Response
You reported [fieldnames] in the DHV record for [param]. This data should be blank.
You reported a MonitoringSystemID in the DHV record for [param]. This field should
be blank when missing data substitution is used.
You did not report a MonitoringSystemID in the DHV record for [param]. This
information is required when you report measured data.
You reported MonitoringSystemID [ID] in the DHV record for [param], but according
to your monitoring plan this system was not active during the hour.
You reported MonitoringSystemID [ID] in the DHV record for [param], but the
SystemTypeCode of this system is not appropriate.
You reported an OperatingConditionCode of E in the DHV record for NOXR. You
should report the NOx emission rate for emergency fuels in an HPFF record, not a
DHV record.
You reported an OperatingConditionCode in the DHV record for NOXR, which
indicates that you are determining NOx emission rate from a mixed fuel Appendix E
curve, but the FuelCode of NOXE MonitoringSystemID [ID] is not equal to "MIX". If
a NOXE system measures an individual fuel, the emissions from this system should be
reported in an HPFF record, not a DHV record.
The OperatingConditionCode reported in the DHV record for NOXR is missing or
invalid.
You reported NOXE MonitoringSystemID [ID] in the DHV record for NOXR, but the
FuelCode of this system is not equal to "MIX". If a NOXE system measures an
individual fuel, the emissions from this system should be reported in an HPFF record.
If this data represents unit-level emissions based on fuel-specific emissions data that
have been reported in one or more HPFF records, then the MonitoringSystemID should
be blank.
You reported an OperatingConditionCode in the DHV record for NOXR, which
indicates that you are determining NOx emission rate using Appendix E, but you did
not report a MonitoringSystemID in this record. If you determined the NOx emission
rate from a mixed fuel curve or via heat input apportionment, you should report the
MonitoringSystemID of the NOXE system for the curve. If you determined the NOx
emission rate from one or more individual fuel curves, you should not report an
OperatingConditionCode in the NOXR DHV record.
You did not report a MonitoringSystemID in the DHV record for [param]. This
information is required when you report missing data.
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
Informational Message
Environmental Protection Agency
Page 409 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
2
Process/Category:
3
Process/Category:
4
Process/Category:
5
Process/Category:
6
Process/Category:
7
Process/Category:
8
Process/Category:
9
Process/Category:
10
Process/Category:
11
Process/Category:
12
Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
C02M Derived Hourly Evaluation (LME)
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
HIT Derived Hourly Evaluation (LME)
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
NOXM Derived Hourly Evaluation (LME)
S02 Derived Hourly Evaluation
S02M Derived Hourly Evaluation (LME)
S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 410 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-19
Check Name: Check System Designation Code for System in DHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that the SystemDesignationCode of the monitoring system is compatible with reported
MODC.
Specifications:
If (Derived Hourly Mode Status == true AND Derived Hourly System Status == true AND Current DHVMon Sys Record is not null)
case (Current DHV Record.ModcCodc)
01: If {Current DHV Mon Sys Record. SystemDesignationCode NOT in set {P, PB})
return result A
02: If {Current DHV Mon Sys Record. SystemDesignationCode NOT in set {B, RB, DB}
return result B
04: If {Current DHV Mon Sys Record. SystemDesignationCode <> "RM")
return result C
22: If {Current DHV Mon Sys Record. SystemDesignationCode <> "CI")
return result D
Results:
Result
A
B
C
D
Response
You reported 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
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report H20 Derived Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 411 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-24
Check Name:
Related Former Checks:
Check Formula in DHV Record
Applicability:
Description:
CEM Check
Checks the Formula ID in the DerivedHourly Value record and ensures that it can be used for the calculation.
Specifications:
Derived Hourly Formula Status = false
Derived Hourly Equation Status = false
Current DHV Multiple Fuel Equation Code == null
Current DHV Formula Record = null
If (Current DHV Record .Form u 1 a ID K cy is null)
If {Current DHV Method in set {AMS, LME}) OR
{DerivedHourly Mode Status == true AND Current DHVRecord.ModcCode == "40") OR
LME HI Method is not null)
Derived Hourly Formula Status = true
else if {Current DHV Parameter = "AE" AND App E Constant Fuel Mix == true)
Derived Hourly Formula Status = true
else if {Current DHV Parameter in set {NOXR, S02, HI, C02}) AND Current DHV Method in set {AD, AE})
Derived Hourly Formula Status = true
If {Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil >1)
case {Current DHV Parameter)
NOXR: Current DHV Multiple Fuel Equation Code = "E-2"
S02: Current DHV Multiple Fuel Equation Code = "D-12"
C02: Current DHV Multiple Fuel Equation Code = "G-4 A"
HI: Current DHV Multiple Fuel Equation Code = "D-15A"
Locate active Formula Record for location WHERE
ParameterCode == Current DHV Parameter AND
EquationCode == Current DHV Multiple Fuel Equation Code
else if {Current DHV Method = "PEM")
Derived Hourly Formula Status = true
else if {Current DHV Parameter == "NOX" AND Current NOx Rate Method Code == "AE" AND Hourly Fuel Flow Countfor
Gas + Hourly Fuel Flow 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 {DerivedHourly Mode Status == true)
If {Current DHV Record. ModcCode in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
return result C
else
If found,
If (Legacy Data Evaluation == true)
return result A
else
return result B
Derived Hourly Formula Status = true
return result K
Environmental Protection Agency
Page 412 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
return result C
else
If {CurrentDHVParameter in set {S02R, H20} AND CurrentDHVRecord.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. Formula I DKcy
If (Current DHV Formula Record is null)
return result E
else if {Current DHVFormula 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. Pa ra mctc rCodc == "HIT"
AND Current DHVFormula Record.EquationCode == "D-15" AND Legacy Data Evaluation == true)
return result I
else
return result F
else
Derived Hourly Formula Status = true
if Current DHV Parameter == "HI" AND Current DHV Method = "ADCALC" and Current DHV Formula
EquationCode not in {F-21A,F-21B,F-21D}
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 DHVMethod == "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
Environmental Protection Agency
Page 413 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Response
You did not report a FormulalD in the DHV record for [param]. While this is
acceptable for legacy EDR data, the FormulalD will be required for ECMPS.
You did not report a FormulalD in the DHV record for [param]. This formula is
required when you burn multiple fuels during the hour.
You did not report a FormulalD in the DHV record for [param].
You reported an MODC of 40, but you reported a FormulalD in the DHV record for
[param]. This field should be blank when reporting a default value.
You reported FormulalD [ID] in the DHV record for [param], but there is no active
Formula record for this formula in your monitoring plan.
You reported FormulalD [ID] in the DHV record for [param], but this is not a [param]
formula.
(Obsolete) 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.
You did not report a FormulalD in the DHV record for [param].
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
Informational Message
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Derived Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02 Mass Rate Derived Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— C02M Derived Hourly Evaluation (LME)
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Derived Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— Heat Input Derived Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— HIT Derived Hourly Evaluation (LME)
7
Process/Category:
Emissions Data Evaluation Report —
— NOx Emissions Rate Derived Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— NOx Mass Rate Derived Hourly Evaluation
9
Process/Category:
Emissions Data Evaluation Report —
— NOXM Derived Hourly Evaluation (LME)
10
Process/Category:
Emissions Data Evaluation Report —
— S02 Derived Hourly Evaluation
11
Process/Category:
Emissions Data Evaluation Report —
— S02M Derived Hourly Evaluation (LME)
12
Process/Category:
Emissions Data Evaluation Report —
— S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 414 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-25
Check Name: Check Heat Input Equation Code
Related Former Checks:
Applicability: General Check
Description: Looks up the equation code for the current Heat Input Derived Hourly Record and verifies that it is appropriate
for heat input calculations.
Specifications:
CO 2 Cone Checks Needed for Heat Input = false
02 Wet Checks Needed for Heat Input = false
02 Dry Checks Needed for Heat Input = false
if {Heat Input App D Method Active For Hour == true)
Hourly Fuel Flow Checks needed for Heat Input = true
else
Hourly Fuel Flow Checks needed for Heat Input = false
Heat Input Equation Code = null
if {DerivedHourly Formula Status == true)
if {Current DHVFormula Record is not null)
Heat Input Equation Code = Current DHV Formula Record. E q ua t i o n C ode
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
Flow Needed For Part 75 = 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" )
CO2 Cone Checks Needed for Heat Input = true
FC Factor Needed = true
else if {Heat Input Equation Code = "F-17")
02 Wet Checks Needed for Heat Input = true
FD Factor Needed = true
else if {Heat Input Equation Code = "F-18")
02 Dry Checks Needed for Heat Input = true
FD Factor Needed = true
else if {Heat Input Equation Code is null)
return result A
else
return result B
else if {Heat Input App D 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-2H3, 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"
elseif (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
Environmental Protection Agency
Page 415 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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-21D" OR Current DHVMethod == "ADCALC")
Derived Hourly Equation Status = true
Apportionment HI Method Array for the location = "NOCALC"
else if (Heat Input Equation Code is null)
return result A
else
return result B
else
Derived Hourly Equation Status = true
else
Derived Hourly Equation Status = true
Results:
Result Response Severity
A You reported FormulalD [ID] in the DHV record for [param], but you did not report a Critical Error Level 1
FormulaCode for this formula in your monitoring plan.
B You reported FormulalD [ID] in the DHV record for HI, but the FormulaCode of this Critical Error Level 1
formula is not appropriate for calculating HI.
C You reported FormulalD [ID] in the DHV record for HI, but a formula with a Informational Message
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.
Usage:
1 Process/Category: Emissions Data Evaluation Report Heat Input Derived Hourly Evaluation
Environmental Protection Agency
Page 416 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-26
Check Name: Check NOX Equation Code
Related Former Checks:
Applicability: CEM Check
Description: Retrieves and validates NOx Mass Equation Code as a valid formula code for calculating NOx Mass
Specifications:
NOx Rate Checks Needed for NOx Mass Calc = false
Heat Input Checks Needed for NOx Mass Calc = false
NOx Mass Equation Code = null
if {DerivedHourly Formula Status == true)
if {Current DHVFormula Record is not null)
NOx Mass Equation Code= Current DHV Formula Record. EquationCode
if {CurrentDHVMethod == "CEM")
if {NOx Mass Equation Code i n set {F-26A, F-26B} )
Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true
Flow Needed For Part 75 = true
if {NOxMass 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
else
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"
Environmental Protection Agency
Page 417 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Usage:
1
Response
You reported FormulalD [ID] in the DHV record for [param], but you did not report a
FormulaCode for this formula in your monitoring plan.
You reported FormulalD [ID] in the DHV record for NOX, but the FormulaCode of
this formula is not appropriate for calculating NOX from a NOXC system.
You reported FormulalD [ID] in the DHV record for NOX, but the FormulaCode of
this formula is not appropriate for calculating NOX from a NOx-diluent system.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report NOx Mass Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 418 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-27
Check Name: Check NOXR Equation Code
Related Former Checks:
Applicability: CEM Check
Description: Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for
calculation of NOx Rate.
Specifications:
02 Dry Checks Needed for NOx Rate Calc = false
02 Wet Checks Needed for NOx Rate Calc = false
CO2 Diluent Checks Needed for NOx Rate Calc = false
if {CurrentDHVMethod == "AE")
Hourly Fuel Flow Needed for NOx Rate Calc = true
else
Hourly Fuel Flow Needed for NOx Rate Calc = false
NOx Rate Equation Code = "" // null string
if {DerivedHourly Formula Status == true)
if {Current DHV Formula Record is not null)
NOx Rate Equation Code = Current DHV Formula Record. E q ua t i 011C ode
if {Current DHV Method == "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 ModcCodc != "23")
If {NOx Rate Equation Code in set {19-1, 19-4, F-5} )
02 Dry Checks Needed for NOx Rate Calc = true
If (Current DHV Record ModcCodc in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
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
If (Current DHV Record ModcCodc in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
FD Factor Needed = true
else if (NOx Rate Equation Code in set {19-3D, 19-5D} )
If (Current DHV Record ModcCodc in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
FD Factor Needed = true
else if {NOx Rate Equation Code in set {19-6, 19-7, 19-8, 19-9, F-6} )
CO2 Diluent Checks Needed for NOx Rate Calc = true
If (Current DHV Record ModcCodc in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
FC Factor Needed = true
Environmental Protection Agency
Page 419 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (TVOx Rate Equation Code== "19-2" )
02 Wet Checks Needed for NOx Rate Calc = true
If {CurrentDHVRecord ModcCode in set {01, 02, 03, 04, 05, 14, 21, 22, 53, 54})
FWFactor Needed = true
if (NOx Rate Equation Code inset {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
else if (Current DHVMethod == "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
Derived Hourly Equation Status = true
Results:
Result
A
B
C
Response
You reported FormulalD [ID] in the DHV record for [param], but you did not report a
FormulaCode for this formula in your monitoring plan.
You reported FormulalD [ID] in the DHV record for NOXR, but the FormulaCode of
this formula is not appropriate for calculating NOXR.
You reported FormulalD [ID] in the DHV record for NOXR, but the FormulaCode of
this formula is not appropriate for calculating NOXR from multiple fuels. The
FormulaCode should be E-2.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 420 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-28
Check Name: Check C02C Equation Code
Related Former Checks:
Applicability: CEM Check
Description: Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for
calculation of C02 Cone (Either F-14A or F-14B)
Specifications:
CO 2 Cone CEM Equation Code = "" // null string
if {DerivedHourly Formula Status == true)
if {Current DHVFormula Record is not null)
CO 2 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 Response Severity
A You reported FormulalD [ID] in the DHV record for C02C, but the FormulaCode of Critical Error Level 1
this formula is not appropriate for calculating C02C.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Derived Hourly Evaluation
Environmental Protection Agency
Page 421 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-29
Check Name: Check C02 Equation Code
Related Former Checks:
Applicability: General Check
Description: Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for
calculation of C02 Mass (Either F-2 or F-l 1)
Specifications:
CO 2 Cone Checks Neededfor C02 Mass Calc = false
Use C02 Diluent Cap for Co2 Mass Calc = false
Use 02 Diluent Cap for Co2 Cone Calc = false
if (C02 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 {DerivedHourly Formula Status == true)
if {Current DHVFormula Record is not null)
CO 2 Mass Equation Code = Current DHV Formula Record.Form u 1 a Code
if (CO2 CEM Method Active For Hour ==true)
Flow Monitor Hourly Checks Needed = true
Flow Needed For Part 75 = true
CO2 Cone Checks Neededfor C02 Mass Calc = true
if (CO2 Mass Equation Code== "F-2" OR CO2 Mass Equation Code== "F-ll")
Derived Hourly Equation Status= true
If (C02 Mass Equation Code== 'F-2')
Moisture Needed = true
append "MIN" to H20 Missing Data Approach
if (Current /)//K/?6'cwY/.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 (CO 2 App D Method Active For Hour == true)
if (CO2 Mass Equation Code== "G-4A")
Derived Hourly Equation Status= true
else if (CO2 Mass Equation Code== "G-4" AND {Legacy Data Evaluation == true OR Hourly Fuel Flow
Count for Gas + Hourly Fuel Flow Count for Oil == 1))
Derived Hourly Equation Status= true
return result B
else
return result A
else
Derived Hourly Equation Status = true
else
Derived Hourly Equation Status= true
Environmental Protection Agency
Page 422 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You reported FormulalD [ID] in the DHV record for C02, but the FormulaCode of this Critical Error Level 1
formula is not appropriate for calculating C02.
B You reported FormulalD [ID] in the DHV record for C02, but a formula with a Informational Message
FormulaCode [EQCODE] is no longer appropriate in this record. For ECMPS, if you
are calculating C02 from multiple fuels using Appendix D, you should report a
formula with a FormulaCode of G-4A in the DHV record; otherwise, do not report a
FormulalD.
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Mass Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 423 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-30
Check Name: Check S02 Equation Code
Related Former Checks:
Applicability: CEM Check
Description: Gets Equation Code from Active Monitor Formula Record and verifies that it is an appropriate equation for
calculation of S02 Mass (Either F-l or F-2)
Specifications:
S02 Monitor Hourly Checks Needed = false
if (S02 App D Method Active For Hour == true)
Hourly Fuel Flow Checks Needed for SQ2 = true
else
Hourly Fuel Flow Checks Needed for S02 = false
S02 Equation Code = "" // null string
if {DerivedHourly Formula Status == true)
If {Current DHVFormula Record is not null)
S02 Equation Code= Current DHV Formula Record .FormulaCode
if {SO2 CEM Method Active For Hour ==true)
if {S02 Equation Code== "F-l" OR SO2 Equation Code== "F-2")
Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true
Flow Needed For Part 75 = true
If (SO2 Equation Code== "F-2")
Moisture Needed = true
append "MIN" to H20 Missing Data Approach
if {S02 Monitor Hourly Count == 0)
return result A
else
SO2 Monitor Hourly Checks Needed = true
else if {S02 Equation Code== "F-23" AND S02 F23 Method Active For Hour == true)
Derived Hourly Equation Status = true
else
return result B
else if {S02 F23 Method Active For Hour == true)
if {S02 Equation Code== "F-23")
Derived Hourly Equation Status = true
else
return result B
else if {S02 App D Method Active For Hour == true)
if (S02 Equation Code= "D-12")
Derived Hourly Equation Status = true
else if (SO2 Equation Code in {D-2, D-4, D-5 } AND Hourly Fuel Flow Count for Gas + Hourly Fuel Flow
Countfor Oil == 1))
Derived Hourly Equation Status = true
return result C
else
return result B
else
Derived Hourly Equation Status = true
Environmental Protection Agency
Page 424 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Derived Hourly Equation Status = true
Results:
Result Response Severity
A You did not report an MHV record for [param] for the hour. Critical Error Level 1
B You reported FormulalD [ID] in the DHV record for S02, but the FormulaCode of this Critical Error Level 1
formula is not appropriate for calculating S02.
C You reported FormulalD [ID] in the DHV record for S02, but a formula with a Informational Message
FormulaCode [EQCODE] is not appropriate in this record. If you are calculating S02
from multiple fuels using Appendix D, you should report a formula with a
FormulaCode of D-12 in the DHV record; otherwise, do not report a FormulalD.
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Derived Hourly Evaluation
Environmental Protection Agency
Page 425 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-31
Check Name: Check H20 Equation Code
Related Former Checks:
Applicability: CEM Check
Description: Looks up the Formula Identifier defined in the H20 Derived Hourly Record and ensures that it is a valid
formula for H20 calculations
Specifications:
H20 CEM Equation Code = "" // null string
if {DerivedHourly Formula Status == true)
If {Current DHVFormula Record is not null)
H20 CEM Equation Code= Current DHV Formula Record .FormulaCode
if {H20 CEM Equation Code in set (F-31, M-1K)
Derived Hourly Equation Status = true
else
return result A
else
Derived Hourly Equation Status = true
Results:
Result Response Severity
A You reported FormulalD [ID] in the DHV record for H20, but the FormulaCode of this Critical Error Level 1
formula is not appropriate for calculating H20.
Usage:
1 Process/Category: Emissions Data Evaluation Report H20 Derived Hourly Evaluation
Environmental Protection Agency
Page 426 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-32
Check Name: Verify Correct Reporting of NOXC MHV Record
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
If {CurrentDHVMethod in set {CEM, CEMNOXR})
If {Current DHV Parameter == "NOXR")
Nox Cone Needed for NOx Rate Calc = false
If Derived Hourly MODC Status == true
If {NOx Cone Monitor Hourly Count == 0)
If Current DHV Record. ModcCode in set {01, 02, 03, 04, 14, 21, 22, 53, 54}
return result A
Else
return result C
else
Nox Cone Needed for NOx Rate Calc = true
Else if {Current DHV Parameter == "NOX")
Nox Cone Needed for NOx Mass Calc = false
If {DerivedHourly Equation Status == true AND NOx Mass Equation Code begins with "F-26")
if {NOx Cone Monitor Hourly Count ==0)
return result A
else
Nox Cone Needed for NOx Mass Calc = true
Results:
Result
A
B
C
Response
You did not report an MHV record for NOXC for the hour.
(Obsolete) You reported an MHV record for NOXC, but you reported a MODCCode of
[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.
You did not report an MHV record for NOXC for the hour. An MHV record is
required for missing data.
Severity
Critical Error Level 1
Non-Critical Error
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Process/Category: Emissions Data Evaluation Report NOx Mass Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 427 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-33
Check Name: Determine Default Value for MODC 40
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
Derived Hourly Default Status == true
If (Derived Hourly Mode Status == true AND Current DHVRecord.ModcCode == 40)
If {Current DHV Parameter == "H20")
If Current /)//K/?6'cw= 100
Derived Hourly Default Status == false
return result A
If H20 Default Max Value is null
If (H20 Default Value > 0 AND H20 Default Value < 100)
if (Current DHV Record. AdjustedHourlyValue <> H20 Default Value)
Derived Hourly Default Status == false
return result B
else if (H20 Default Max Value > 0 AND H20 Default Max Value <100 AND H20 Default Min Value > 0 AND H20
Default Min Value < 100)
If Current DHV Record. AdjustedHourlyValue < H20 Default Min Value OR
Current DHV Record. AdjustedHourlyValue > H20 Default Max Value)
Derived Hourly Default Status == false
return result C
Else
H20 Default Value = Current DHV Record. AdjustedHourlyValue
Else if (Current DHV Parameter == "S02R")
If Current DHV Record. AdjustedHourlyValue is null OR
Current DHV Record. AdjustedHourlyValue <= 0
Derived Hourly Default Status == false
return result D
If F23 Default Max Value is null
If (F23 Default Value > 0)
if (Current DHV Record. AdjustedHourlyValue <> F23 Default Value)
Derived Hourly Default Status == false
return result B
else if (F23 Default Max Value > 0 AND F23 Default Min Value > 0)
If Current DHV Record. AdjustedHourlyValue < F23 Default Min Value OR
Current DHV Record. AdjustedHourlyValue > F23 Default Max Value)
Derived Hourly Default Status == false
return result C
Else
F23 Default Value = Current DHV Record. AdjustedHourlyValue
Environmental Protection Agency
Page 428 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Usage:
1
Response
The AdjustedHourlyValue 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.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report H20 Derived Hourly Evaluation
Process/Category: Emissions Data Evaluation Report S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 429 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-34
Check Name:
Determine Derived Hourly Record Status
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
If {CurrentDHVParameter == "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 DHVParameter == "H20")
Current H20 DHV HBHA Value = Current DHV HBHA Value
If (Derived Hourly Mode Status == false OR Derived Hourly Equation Status == false OR Derived Hourly Missing Data Status == false
OR (Current DHV Record. MODCCode in set {06, 07, 08, 09, 10, 11) AND Derived Hourly Pma Status == false))
Case (Current DHV Parameter)
C02C: C02C Derived Hourly Status = false
H20: H20 Derived Hourly Status = false
S02R: S02R Derived Hourly Status = false
S02M: S02M Derived Hourly Status = false
NOXM: NOXMDerived Hourly Status = false
C02M: C02M Derived Hourly Status = false
HIT: HIT Derived Hourly Status = false
S02: S02 Derived Hourly Status = false
NOXR: NOXR Derived Hourly Status = false
NOX: NOX Derived Hourly Status = false
C02: C02 Derived Hourly Status = false
HI: HI Derived Hourly Status = false
Results:
Result
Response
Severity
Environmental Protection Agency
Page 430 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
8
Process/Category:
Emissions Data Evaluation Report
C02 Concentration Derived Hourly Evaluation
C02 Mass Rate Derived Hourly Evaluation
H20 Derived Hourly Evaluation
Heat Input Derived Hourly Evaluation
NOx Emissions Rate Derived Hourly Evaluation
NOx Mass Rate Derived Hourly Evaluation
S02 Derived Hourly Evaluation
S02R Derived Hourly Evaluation
Environmental Protection Agency
Page 431 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-36
Check Name: NOx Rate DHV Extraneous Fields Check
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Hourly Extraneous Fields = null
if {Current DHV Method <> "AE" OR (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow 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 /)/f^7?ecor "LME")
if {CurrentDHVRecord.FuelCode is not null)
append "FuelCode" to Hourly Extraneous Fields
if {Hourly Extraneous Fields is not null),
return result A
Results:
Result Response Severity
A You reported [fieldnames] in the DHV record for [param]. This data should be blank. Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Emissions Rate Derived Hourly Evaluation
Environmental Protection Agency
Page 432 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-37
Check Name: Calculate Heat Input for LME Unit
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
HIT Calculated Adjusted Value = null
If (Derived Hourly Mode Status == true)
if {LME HI Method is equal to "MHHI" OR Current DHV Record.MOBCCode = "45")
Locate all Monitor Default records for the hour and location where the ParameterCode is equal to "MHHI".
If (one record is found, AND Monitor Default. Default Value is greater than 0, AND Monitor
I)efault.Defau 11UnitsO 1TVIeasureCode is equal to "MMBTUHR")
If (Current Hourly Op Record.0\iT\mc is greater than 0 and less than or equal to 1)
Calculate HIT Calculated Adjusted Value = Default Value * Current Hourly Op Record. OpTime,
rounded to one decimal place.
else
return result A
else if {LME HI Method is equal to "LTFF")
If {LME CP Total Heat Input is greater than or equal to 0, AND LME Total Heat Input Array for the location is greater
than or equal to 0, AND Current Hourly Op Record. HourLoad is greater than or equal to 0, AND Current Hourly Op
Record.OpTime is greater than 0 and less than or equal to 1)
If {LME OS is equal to true, AND the Quarter of the Current Reporting Period is equal to 2)
If the Current Month is April,
If {LMEApril 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 {LMEApril 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 fox
the location * Current Hourly Op Record .0\iT\mc / LME April OpTime Array for the
location), and round the result to 1 decimal place.
Otherwise,
If {LME Total Load is greater than 0)
Environmental Protection Agency
Page 433 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 RecordHomLoaA * 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 .0\iT\mc / (LME Total
OpTime Array for the location - LME April OpTime Array for the location)), and round
the result to 1 decimal place.
If (LME Total Load is greater than 0)
If (HourLoad is equal to 0)
Set HIT Calculated Adjusted Value = 0
else
Calculate HIT Calculated Adjusted Value = (LME CP Total Heat Input * Current
Hourly Op Record.HourLoad * Current Hourly Op Record.OpTime / LME TotalLoad)
+ (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 .0\iT\mc / LME Total OpTime Array for the location), and round the
result to 1 decimal place.
Otherwise,
Results:
Result
A
Response
You did not report a single, active, valid default record for MHHI in your monitoring
plan.
This check result is obsolete.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report HIT Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 434 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-38
Check Name: Check Reported Heat Input for LME Unit
Related Former Checks:
Applicability: LME Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
If (Current AdjustedHourly Value is null or is less than 0)
Rpt Period HI Reported Accumulator Array for this location = -1
return result A
else if (Current DHVRecordAAiustQiMomXyVdlxiQ 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 AdjustedHourly Value
else
Rpt Period HI Reported Accumulator Array for this location = Current 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. AdjustedHourlyValue is greater than 1)
Heat Input Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = "HIT" AND
UOM = "MMBTU"
if (ABS(Current DHV /?6'cwy/. AdjustedHourly Value - HIT Calculated Adjusted Value) > Heat Input Tolerance)
return result B.
Results:
Result
A
B
C
Response
The AdjustedHourly Value reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.
The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with
the recalculated value.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 435 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report HIT Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 436 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-39
Check Name:
Calculate S02 Mass for LME Unit
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
S02M Calculated Adjusted Value = null
If Current DHVRecord.FuelCode is null,
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result A.
Otherwise,
Locate MonitorDefault record for the hour and location where ParameterCd = "S02R", DefaultPurposeCd = "LM", and FuelCode
is equal to Current DHV Record. FuelCode.
If not found, or if more than one record is found, or if Default Value is less than or equal to 0, or Default ValueUnitsOfMeasure is
not equal to "LBMMBTU".
Rpt Period S02 Mass Calculated Accumulator Array for this location = -1
return result B.
S02R Default Value = MonitorDefault. Dcfau 11 Va 1 lie
Locate MonitorDefault record for the hour and location where ParameterCd = "S02R", DefaultPurposeCd = "LM",
FuelCode is in LME Fuel Code List, FuelCode is not equal to Current DHVRecord.FuelCode, Default Value is greater
than S02R Default Value, and Default ValueUnitsOfMeasure 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.
Otherwise,
if (Rpt Period S02 Mass Calculated Accumulator Array for this location is not null)
if (Rpt Period S02 Mass Calculated Accumulator Array for this location >= 0)
Rpt Period S02 Mass Calculated Accumulator Array for this location = Rpt Period
S02 Mass Calculated Accumulator Array for this location + S02M Calculated
Adjusted Value
else
Rpt Period S02 Mass Calculated Accumulator Array for this location = S02 Mass Calculated
Adjusted Value
Environmental Protection Agency
Page 437 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
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 AdjustedHourly Value in the DHV for [param] could not
be recalculated.
You reported [Fuel] as the FuelCode in the DHV record for [param], but, according to
the Monitor Default records in your monitoring plan, this fuel does not have the
highest default emissions rate of the fuels combusted during the hour. The
AdjustedHourly Value could not be recalculated.
The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report S02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 438 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-40
Check Name: Determine Fuels Burned for LME Unit
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
LME Fuel Code List = null
If (HIT Calculated Adjusted Value is not null)
Locate all 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)
if {Rpt Period HI Calculated Accumulator Array for this location >= 0)
Rpt Period HI Calculated Accumulator Array for this location = Rpt Period HI Calculated
Accumulator Array for this location + HIT Calculated Adjusted Value
else
Rpt Period HI Calculated Accumulator Array for this location = HIT Calculated Adjusted Value
if (Current Month is April)
if {April HI Calculated Accumulator Array for this location is not null)
April HI Calculated Accumulator Array for this location = April HI Calculated Accumulator Array for
this location + HIT Calculated Adjusted Value
else
April HI Calculated Accumulator Array for this location = HIT Calculated Adjusted Value
if {Current Month is not April OR LME Annual == true)
Rpt Period HI Calculated Accumulator Array for this location = -1
return result A
else
Results:
Result Response Severity
A The AdjustedHourlyValue in the DHV record for HIT could not be recalculated due to Informational Message
another error listed in this report.
Usage:
1 Process/Category: Emissions Data Evaluation Report HIT Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 439 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-41
Check Name:
Check Reported S02M for LME Unit
Related Former Checks:
Applicability:
LME Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
If (Current /)//K/?6'cwY/.AdjustcdHourly Value is null or is less than 0)
Rpt Period S02 Mass Reported Accumulator Array for this location = -1
return result A
else if (Current DHVRecordAAiustQiMomXyVdlxiQ 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 /)//K/?6'cw S02 Mass Tolerance)
else
return result B
Results:
Result
A
Response
The AdjustedHourlyValue reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.
The AdjustedHourlyValue reported in the DHV record for [param] is inconsistent with
the recalculated value.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report S02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 440 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-42
Check Name:
Calculate C02 Mass for LME Unit
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
C02M Calculated Adjusted Value = null
If Current DHVRecord.FuelCode is null,
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result A.
Otherwise,
Locate MonitorDefault record for the hour and location where ParameterCd = "C02R", DefaultPurposeCd = "LM", and FuelCode
is equal to Current DHV Record. FuelCode.
If not found, or if more than one record is found, or if Default Value is less than or equal to 0, or Default ValueUnitsOfMeasure is
not equal to "TNMMBTU".
Rpt Period C02 Mass Calculated Accumulator Array for this location = -1
return result B.
C02R Default Value = MonitorDefault. Dcfau 11 Va 1 lie
Locate MonitorDefault record for the hour and location where ParameterCd = "C02R", DefaultPurposeCd = "LM",
FuelCode is in LME Fuel Code List, FuelCode is not equal to Current DHVRecord.FuelCode, Default Value is greater
than C02R Default Value, and Default ValueUnitsOfMeasure 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.
Otherwise,
if (Rpt Period C02 Mass Calculated Accumulator Array for this location is not null)
if (Rpt Period C02 Mass Calculated Accumulator Array for this location >= 0)
Rpt Period C02 Mass Calculated Accumulator Array for this location = Rpt Period
C02 Mass Calculated Accumulator Array for this location + C02M Calculated
Adjusted Value
else
Rpt Period C02 Mass Calculated Accumulator Array for this location = CO 2 Mass Calculated
Adjusted Value
Environmental Protection Agency
Page 441 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
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 AdjustedHourly Value in the DHV for [param] could not
be recalculated.
You reported [Fuel] as the FuelCode in the DHV record for [param], but, according to
the Monitor Default records in your monitoring plan, this fuel does not have the
highest default emissions rate of the fuels combusted during the hour. The
AdjustedHourly Value could not be recalculated.
The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report C02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 442 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-43
Check Name:
Check Reported C02M for LME Unit
Related Former Checks:
Applicability:
LME Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
If (Current /)//K/?6'cwY/.AdjustcdHourly Value is null or is less than 0)
Rpt Period C02 Mass Reported Accumulator Array for this location = -1
return result A
else if (Current DHVRecordAAiustQiMomXyVdlxiQ 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 /)//K/?6'cw C02 Mass Tolerance)
else
return result B
Results:
Result
A
Response
The AdjustedHourlyValue reported in the DHV record for [param] is invalid. The
value must be greater than or equal to 0.
The AdjustedHourlyValue reported in the DHV record for [param] is inconsistent with
the recalculated value.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report C02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 443 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURDHV-44
Check Name:
Calculate NOX Mass for LME Unit
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
NOXM Calculated Adjusted Value = null
UDEFStatus = null.
UDEFExpirationDate = null.
If Current 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
Default Condition = null
If Current /)/f^7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (Monitor Default. G roup ID is null)
if {DefaultCondition == "A" or "C")
Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHVRecord.FuelCode and EndDate/EndHour is on or
before the CurrentOperatingDate/Hour.
else if {Default Condition == "B")
Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHVRecord.FuelCode, OperatingConditionCode == "A" or
"B", and EndDate/EndHour is on or before the CurrentOperatingDate/Hour.
else if {Default Condition == "P")
Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location
where FuelCode = Current DHVRecord.FuelCode, OperatingConditionCode == "A" or
"P", and EndDate/EndHour is on or before the CurrentOperatingDate/Hour.
If not found,
UDEFStatus = 'MISSING"
else
UDEFStatus = "FOUND"
Set UDEFExpiration Date to 5 years after the end of the quarter of the
UnitDefaultTestRecordsByLocationForQAStatusEndDate.
Otherwise,
UDEFStatus = "GROUP"
Set UDEFExpiration Date to 5 years after the end of the quarter of the
Monitor Default. Begi nDate.
if {Current DHV Record. OperatingConditionCode is equal to "U")
Locate MonitorDefault record for the hour and location where ParameterCd = "NORX",
DefaultPurposeCd = "MD", OperatingConditionCode is equal to Default Condition, FuelCode is in LME
Fuel Code List, FuelCode is not equal to Current DHVRecord.FuelCode, Default Value is greater than
NOXR Default Value, and DefaultValueUnitsOfMeasure is equal to "LBMMBTU".
Locate MonitorDefault record for the hour and location where ParameterCd = "NOXR",
DefaultPurposeCd = "LM", OperatingConditionCode is equal to Default Condition, FuelCode is in LME
Fuel Code List, FuelCode is not equal to Current DHVRecord.FuelCode, Default Value is greater than
NOXR Default Value, and Default ValueUnitsOfMeasure is equal to "LBMMBTU".
If found,
if {Current Month is not April OR LME Annual == true)
Rpt Period NOx Mass Calculated Accumulator Array for this location = -1
return result D
Otherwise,
If HIT Calculated Adjusted Value is null,
if {Current Month is not April OR LME Annual == true)
Environmental Protection Agency
Page 445 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Rpt Period NOx Mass Calculated Accumulator Array for this location = -1
return result E
else
Results:
Result
A
B
C
D
Usage:
1
Calculate NOXM Calculated Adjusted Value = HIT Calculated Adjusted Value * NOXRDefault
Value, and round the result to one decimal place.
if (Current Month is not April OR LMEAnnual == 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
Response
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 during the hour. The
AdjustedHourly Value could not be recalculated.
The AdjustedHourly Value in the DHV record for [param] could not be recalculated
because the heat input rate could not be determined for the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Process/Category: Emissions Data Evaluation Report NOXM Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 446 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-45
Check Name: Check Reported NOXM for LME Unit
Related Former Checks:
Applicability: LME Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
If (Current AdjustedHourly Value is null or is less than 0)
Rpt Period NOx Mass Reported Accumulator Array for this location = -1
return result A
else if (Current DHVRecordAAiustQiMomXyVdlxiQ 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 = CurrentDHV
Record. AdjustedHourlyValue
If (NOXM Calculated Adjusted Value is not null AND Current DHV Record. AdjustedHourlyValue 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 /?6'cwy/. AdjustedHourly Value - NOXM Calculated Adjusted Value) > NOX Mass Tolerance)
return result B
Results:
Result Response Severity
A The AdjustedHourly Value reported in the DHV record for [param] is invalid. The Critical Error Level 1
value must be greater than or equal to 0.
B The AdjustedHourly Value reported in the DHV record for [param] is inconsistent with Critical Error Level 1
the recalculated value.
C You reported [fieldname] in the [type] record for [param] that is not rounded to the Critical Error Level 1
appropriate precision for that parameter.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXM Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 447 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURDHV-46
Check Name: Equation Code Consistent with Moisture Basis
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02M Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 448 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
Check Name:
Related Former Checks:
Applicability:
Description:
Specifications:
If UDEF Status is not null,
If (UDEFStatus == 'MISSING")
return result A.
else if (UDEFStatus == "FOUND")
if (Current Operating Date is after the UDEF Expiration Date)
return result B.
else
Append CurrentDHV. Fuel Code to the LME Fuel Array for the location.
else if (UDEFStatus == "GROUP")
if (Current Operating Date is after the UDEF Expiration Date)
return result C.
HOURDHV-47
Unit Default Test Expiration Check
LME Check
Results:
Result
A
B
C
Response
You did not report an applicable prior LME Unit Default Test for Fuel Code [FUEL],
The applicable prior LME Unit Default Test for Fuel Code [FUEL] has expired. You
need to use a Part 75 default NOx emissions rate until you perform a new
unit-and-fuel-specific default test. You will need to put an end date on your existing
NOXR default records in your monitoring plan, and add a new NOXR default record
based on the Part 75 default value.
Warning: Based on the BeginDate in your NOXR Default record in your monitoring
plan, the LME Unit Default Test(s) that established the default NOx emission rate for
Fuel Code [FUEL] may have expired. Unit Default Tests must be performed every five
years. If your test has expired, you need to use a Part 75 default NOx emissions rate
until you perform a new unit-and-fuel-specific default test. You will need to put an end
date on your existing NOXR default records in your monitoring plan, and add a new
NOXR default record based on the Part 75 default value.
Severity
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report NOXM Derived Hourly Evaluation (LME)
Environmental Protection Agency
Page 449 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly General
Environmental Protection Agency
Page 450 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-1
Check Name: Initialize Accumulators, Dictionaries and Lists
Related Former Checks: HOUROP-27
Applicability: General Check
Description: Initializes summary value data: the operating time, operating hours, and reported and calculated values for
each parameter. Also initializes dictionaries and lists used to collect information during processing.
Specifications:
For each location in Monitoring Plan, initialize arrays with size Current Location Count
Rpt Period C02 Mass Reported Accumulator Array for the location = 0
Rpt Period C02 Mass Calculated Accumulator Array for the location = 0
Expected Summary Value C02 Array for the location = false
Rpt Period HI Reported Accumulator Array for the location =0
Rpt Period HI Calculated Accumulator Array for the location = 0
Expected Summary Value HI Array for the location = false
Rpt Period NOx Rate Reported Accumulator Array for the location = 0
Rpt Period NOx Rate Calculated Accumulator Array for the location = 0
Rpt Period NOx Rate Hours Accumulator Array for the location = 0
Expected Summary Value NOx Array for the location = false
Rpt Period S02 Mass Reported Accumulator Array for the location = 0
Rpt Period S02 Mass Calculated Accumulator Array for the location = 0
Expected Summary Value S02 Array for the location = false
Rpt Period NOx Mass Reported Accumulator Array for the location = 0
Rpt Period NOx Mass Calculated Accumulator Array for the location = 0
Expected Summary Value NOx Mass Array for the location = false
Rpt Period Op Time Accumulator Array for the location = 0
Rpt Period Op Hours Accumulator Array for the location = 0
Rpt Period Op Days Accumulator Array for the location = 0
Rpt Period Load Accumulator Array for the location = 0
Daily Op Time Accumulator Array for this location = 0
April HI Calculated Accumulator Array for the location = 0
April NOx Mass Calculated Accumulator Array for the location = 0
April Op Time Accumulator Array for the location = 0
April Op Hours Accumulator Array for the location = 0
April Op Days Accumulator Array for the location = 0
LME Total Load Array for the location = 0
LME April Load Array for the location = 0
LME Total Heat Input Array for the location = 0
LME April Heat Input Array for the location = 0
LME Total Op Time Array for the location = 0
LME April Op Time 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
Environmental Protection Agency
Page 451 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
Initialize InvalidCylinderldList as a list with string values.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 452 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-2
Check Name: Reporting Period Details
Related Former Checks:
Applicability: General Check
Description: Checks the current reporting period to see if the monitoring plan is active. Also sets a parameter indicating
whether legacy data is being processed.
Specifications:
Abort Hourly Checks = false
Legacy Data Evaluation = false
LME HI Method = null
LME HI Substitute Data Code= null
Annual Reporting Requirement = false
OS Reporting Requirement = false
LME Annual = false
LME OS = false
Reported Emissions Value = null
Multiple Stack Configuration = false
Ignored Daily Calibration Tests = false
Ignored Daily Interference Tests = false
if ({Current Reporting Period < Current Monitoring Plan 7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (the associated First ECMPS Reporting Period for the monitoring plan is null)
If Current Reporting Period is on or prior to 2008)
Legacy Data Evaluation = true
Else
If Current Reporting Period is prior to the First ECMPS Reporting Period)
Legacy Data Evaluation = true
Locate a Hourly Op Data record for the configuration and reporting period where OperatingTime is greater than 0,
If found,
Reporting Period Operating = true
else,
Reporting Period Operating = false
Set LMEAnnual to false.
Set LME OS to false.
Set AnyMonitoringMethodFound to false.
Set OsMonitoringMethodFound to false.
Locate MonitorMethod record for ANY location in the file where:
1) ParameterCode in set {S02M, NOXM, C02M}.
2) MethodCode = "LME".
3) BeginDate is on or before the first day of the Current Reporting Period.
4) EndDate is null or is on or after the last day of the Current Reporting Period.
If found,
Set AnyMonitoringMethodFound to true
If Current Reporting Period is for the 2nd or 3rd Quarter,
Set OsMonitoringMethodFound to true
Locate all MonitorQualification records for all units in the monitoring configuration where:
1) QualificationTypeCode is equal to "LMEA".
2) BeginDate is on or before the last day of the reporting period.
3) EndDate is null or is on or after January 1 of the year of the Current Reporting Period.
If found,
Set LME Annual to true.
If OsMonitoringMethodFound is false, AND Current Reporting Period is for the 2nd Quarter,
Locate MonitorMethod record for ANY location in the file where:
1) ParameterCode in set {S02M, NOXM, C02M}.
2) MethodCode = "LME".
3) BeginDate is on or before May 1st of the year of the Current Reporting Period.
4) EndDate is null OR is on or after the last day of the Current Reporting Period.
If found,
Set AnyMonitoringMethodFound to true.
Set OsMonitoringMethodFound to true.
Environmental Protection Agency
Page 454 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If OsMonitoringMethodFound ,
Locate all MonitorQualification records for all units in the monitoring configuration where:
1) QualificationTypeCode is equal to "LMES".
2) BeginDate is on or before the last day of the reporting period.
3) EndDate is null OR is on or after January 1 of the year of the Current Reporting Period.
If found,
Set LME OS to true.
If AnyMonitoringMethodFound,
If {LMEAnnual == 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 (LMEAnnual == false and LME OS == false)
Abort Hourly Checks = true
return result F
Otherwise,
Locate MonitorMethod records for all locations in the file where:
1) ParameterCode = "HIT".
2) BeginDate is on or before:
a) If Current Reporting Period is for the 2nd quarter AND LME Annual is false, then May 1st of the year of
the Current Reporting Period.
b) Otherwise, the first day of the Current Reporting Period.
3) EndDate is null OR is on or after the last day of the Current Reporting Period.
If not found for any location,
Abort Hourly Checks = true
return result G
Else
If MethodCode = "MHHI" for all locations,
LME HI Method = 'MHHI"
If MethodCode in set {LTFF, CALC, LTFCALC} for all locations,
LME HI Method = "LTFF"
If SubstituteDataCode is equal to "MHHI" for any location,
LME HI Substitute Data Code= 'MHHI".
Otherwise,
Abort Hourly Checks = true
return result H
If {Abort Hourly Checks == false)
Environmental Protection Agency
Page 455 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 is NOT in Program Uses RUE List,
Locate all Unit Operating Status records for all units in the configuration where the Op Status Code is equal to "RET", the
year of the Begin Date is prior to Current Reporting Period, and the End Date is null or is on or after the last day of the
Current Reporting Period.
If found,
return result I
Otherwise,
For each Unit Program record retrieved above where the ProgramCode is in Program Uses RUE List,
If ProgramCode is in Program is Ozone Season List 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 aft unit programs,
return result I
Environmental Protection Agency
Page 456 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A The locations in the file do not represent a valid monitoring configuration during the Fatal
reporting period. The file will not be evaluated.
B The active Reporting Frequency records for this configuration are missing or invalid. Fatal
The file will not be evaluated. Please contact ECMPS technical support for assistance
with this matter.
C According to the Reporting Frequency records, this monitoring configuration is an Fatal
ozone-season-only reporter, however the reporting period is not within the ozone
season. The file will not be evaluated.
D You have reported an LME Annual Qualification record in your monitoring plan, but, Fatal
according to the Reporting Frequency records, this configuration is not an annual
reporter. The file will not be evaluated.
E You have reported an LME Ozone Season Qualification record in your monitoring Fatal
plan, but, according to the Unit Program records, this configuration does not report
ozone season totals. The file will not be evaluated.
F You have reported an LME method in your monitoring plan for one or more units in Fatal
this configuration, but you have not reported an LME qualification record. The file
will not be evaluated.
G You did not report an active heat input method for one or more locations in the file. Fatal
The file will not be evaluated.
H The active heat input methods reported for the locations in the file are inconsistent. Fatal
The file will not be evaluated.
I This file contains at least one unit that is retired. Please contact EPA if you believe that Critical Error Level 2
all units in this configuration should report emissions data during this reporting
period.
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 457 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-3
Check Name: Calculate Total Load for LME Configuration for Reporting Period
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
LME Total Load = 0
LME April Load = 0
LME CP Total Heat Input = 0
LME CP April Heat Input = 0
LME Total Optime = 0
LME April Optime = 0
If {LME HI Method is not null)
If {LME HI Method == "MHHI")
Locate an LTFF record for any location in the monitoring configuration during the reporting period.
If found,
set Abort Hourly Checks to true, and return result A.
else
For each Hourly Op Data record for every unit in the monitoring configuration.
If Hourly Op /)ata 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 /,)«f«.OpTimc 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 DerivedHourlyVhlue.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.
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,
Environmental Protection Agency
Page 458 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 LMEApril 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 (LMEAprilLoad is greater than 0 or LME April Optime is greater than 1),
return result F.
Locate an LTFF record for any location in the monitoring configuration during the reporting period
where the FuelFlowPeriodCode is equal to "MJ".
If found,
If (LME Total Load - LMEAprilLoad) 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 - LMEAprilLoad) is greater than 0 or (LME Total Optime - LME April
Optime) is greater than 1,
return result G.
Locate an LTFF record for any location in the monitoring configuration during the reporting period.
If found,
If LME Total Load is equal to 0 and LME Total Optime is equal to 0,
set Abort Hourly Checks to true, and return result B.
else
If LME Total Load is greater than 0 or LME Total Optime is greater than 1,
return result D.
else
else
Results:
Result
A
You have reported MHHI as the heat input method for this configuration, but you have Fatal
reported a long-term fuel flow record.
You have reported a long-term fuel flow record for this reporting period, but the sum of Fatal
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 Fatal
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 Critical Error Level 1
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 Fatal
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 Critical Error Level 1
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 Critical Error Level 1
configuration, but you have not reported a long-term fuel flow record for May/June.
Response
Severity
B
C
D
E
F
G
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 459 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-7
Check Name: Validate LME Eligibility
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
If {LME HI Method is not null)
Set LME Exceeding Parameter to null.
Set Final LME Year to false.
For each unit in the monitoring configuration:
If {LMEAnnual == true)
Locate the latest MonitorQualification record where location is the unit being evaluated, the
QualificationTypeCode is equal to "LMEA", BeginDate is on or before the first day of the Current Reporting
Period, and the EndDate is null or is on or after December 31 of the year prior to the Current Reporting Period.
If (not found)
return result A.
If (found and the BeginDate of the retrieved qualification record is prior to the Current Reporting Period Year)
For each year from three years prior to the Current Reporting Period Year until the year prior to the
Current Reporting Year.
Set AnnualNOx to 0.
Set Annual 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 Op Value to Annual NOx.
Locate an Op Supp Data record for the location and quarter/year being checked where
the OpTypeCode = "S02M".
If (found)
add Op Value to Annual S02.
If (the year being evaluated is the year prior to the Current Reporting Period Year)
If {AnnualNOx is greater than 100 or Annual S02 is greater than 25)
set Final LME Year to true.
Else
If (Annual XOx is greater than 100)
append "AnnualNOx" to LME Exceeding Parameter.
If {Annual S02 is greater than 25)
Environmental Protection Agency
Page 460 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
append "Annual S02" to LME Exceeding Parameter.
If (LMEOS == true)
Locate the latest MonitorQualification record where the location is the unit being evaluated,
QualificationTypeCode is equal to "LMES", BeginDate is on or before the later of the first day of the Current
Reporting Period and May 1 of the year of the Current Reporting Period, and the EndDate is null or is on or
after December 31 of the year prior to the Current Reporting Period.
If (not found)
return result B.
If (found and the BeginDate of the retrieved qualification record is prior to the Current Reporting Period Year)
For each year from three years prior to the Current Reporting Period Year until the year prior to the
Current Reporting Period Year.
Set OS NOx to 0.
Locate an Op Supp Data record for the location and quarter 2 of the year being checked where
the OpTypeCode = "NOXMOS".
If found,
add Op Value 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 Op Value to OS NOx.
If (the year being evaluated is the year prior to the Current Reporting Period Year)
If (OS NOx is greater than 50)
set Final LME Year to true.
Else
If (OS NOx is greater than 50)
append "Ozone Season NOx" to LME Exceeding Parameter.
if (LMEExceeding Parameter is not null)
return result C.
else if (Final LME Year == true)
return result D.
Environmental Protection Agency
Page 461 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You have reported an active LMEA qualification record for this configuration in your
monitoring plan, but you have not reported an active LMEA qualification record for at
least one unit in the configuration.
You have reported an active LMES qualification record for this configuration in your
monitoring plan, but you have not reported an active LMES qualification record for at
least one unit in the configuration.
You have reported that this configuration has an active LME qualification, but this
configuration is no longer eligible to qualify for an LME methodology, because at least
one unit in the configuration has exceeded the eligibility limit for [param] in a prior
year.
The emissions from at least one unit in this configuration exceeded the applicable
number of tons necessary to qualify as an LME unit in the previous reporting year.
According to Part 75.19(b), you must install the appropriate monitoring systems by
December 31 of this reporting year.
Severity
Fatal
Fatal
Critical Error Level 2
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 462 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-8
Check Name:
Monitor Plan Evaluation Check
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
Set MpSuccessfulfyEvaluated = false.
If the SeverityLevelCd of the monitoring plan record for this configuration is equal to "CRIT1" or "FATAL",
return result A.
Otherwise,
If the NeedsEvalFlag and MustSubmitFlag of the monitoring plan record for this configuration are equal to "Y",
return result B.
Otherwise,
Set MpSuccessfulfyEvaluated = true.
Results:
Result
A
Response
The Monitoring Plan associated with this quarterly emissions file has critical errors.
You must correct the Monitoring Plan for this monitoring configuration in order to
submit this emissions file to be loaded on EPA's host system.
The Monitoring Plan associated with this quarterly emissions file has not been
evaluated. You must evaluate the Monitoring Plan for this monitoring configuration in
order to complete the evaluation of this emissions file.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 463 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-9
Check Name: QA/Cert Test Evaluation Check
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Locate any QA/Cert Test record for the monitoring configuration where the EndDate is on or before the last day of the Current Reporting
Period, MustSubmitFlag is equal to 'Y' or CanSubmitFlag and UpdatedStatusFlag are equal to "Y", and the SeverityCd is equal to
"CRIT1" or "FATAL".
If found,
return result A.
Otherwise,
Locate any QA/Cert Test record for the monitoring configuration where the EndDate is on or before the last day of the Current
Reporting Period, MustSubmitFlag is equal to Y' or CanSubmitFlag and UpdatedStatusFlag are equal to "Y", and the
NeedsEvalFlag are equal to "Y".
If found,
return result B.
Otherwise,
Locate any QA Supp Data record for the monitoring configuration without any associated Test Summary record where the
EndDate is on or before the last day of the Current Reporting Period and MustSubmitFlag is equal to Y'.
If found,
return result C.
Results:
Result
A
B
C
Response
At least one QA/certification test associated with this monitoring configuration has
critical errors. You must correct all prior or concurrent QA/certification tests in order
to submit this quarterly emissions file to be loaded on EPA's host system.
At least one QA/certification test associated with this monitoring configuration has not
been evaluated. You must evaluate all prior or concurrent QA/certification tests in
order to complete the evaluation of this quarterly emissions file.
The emissions quarterly reported cannot be submitted, because EPA has required the
resubmission of a QA/certification test that is not present in the Client Tool. Please
review the Submission Access report for more information about what needs to be
submitted.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 464 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-10
Check Name:
Q A/Cert Event Evaluation Check
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
Locate any QA/Certification Event record for the monitoring configuration where the QACertEventDate is on or before the last day of the
Current Reporting Period, the MustSubmitFlag is equal to "Y", and the SeverityCd is equal to "CRIT1" or "FATAL".
If found,
return result A.
Otherwise,
Locate any QA/Certification Event record for the monitoring configuration where the QACertEventDate is on or before the last
day of the Current Reporting Period and the MustSubmitFlag and NeedsEvalFlag are equal to "Y".
If found,
return result B.
Results:
Result
A
Response
At least one QA/certification event associated with this monitoring configuration has
critical errors. You must correct all prior or concurrent QA/certification events in
order to submit this quarterly emissions file to be loaded on EPA's host system.
At least one QA/certification event associated with this monitoring configuration has
not been evaluated. You must evaluate all prior or concurrent QA/certification event in
order to complete the evaluation of this quarterly emissions file.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 465 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-11
Check Name:
Related Former Checks:
Test Extension/Exemption Evaluation Check
Applicability:
Description:
Specifications:
General Check
Locate any Test Extension/Exemption record for the monitoring configuration where the ReportingPeriod is on or before the Current
Reporting Period, the MustSubmitFlag is equal to "Y", and the SeverityCd is equal to "CRIT1" or "FATAL".
If found,
return result A.
Otherwise,
Locate any Test Extension/Exemption record for the monitoring configuration where the ReportingPeriod is on or before the
Current Reporting Period and the MustSubmitFlag and NeedsEvalFlag are equal to "Y".
If found,
return result B.
Results:
Result
A
Response
At least one test extension/exemption associated with this monitoring configuration
has critical errors. You must correct all prior or concurrent test extension/exemption
records in order to submit this quarterly emissions file to be loaded on EPA's host
system.
At least one test extension/exemption associated with this monitoring configuration
has not been evaluated. You must evaluate all prior or concurrent test
extension/exemption records in order to complete the evaluation of this quarterly
emissions file.
Severity
Critical Error Level 1
B
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 466 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-12
Check Name: Prior Emissions File Evaluation Check
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Locate any Emissions File for any location in the current monitoring configuration where the ReportingPeriod is prior to the Current
Reporting Period, and either the Submission Availability Code = 'CRITERR' or (CANSUBMIT = 'Y' and SeverityCd is equal to "CRIT1"
or "FATAL").
If found,
return result A.
Otherwise,
Locate any Emissions File for any location in the current monitoring configuration where CAN SUBMIT = 'Y', the
ReportingPeriod is prior to the Current Reporting Period, and the NeedsEvalFlag is equal to "Y".
If found,
return result B.
If not found,
Locate any Emissions File for any location in the current monitoring configuration where the ReportingPeriod is prior to
the Current Reporting Period, and either the Submission Availability Code = 'NOTSUB' or (CANSUBMIT = Y' and
UpdatedStatusFlag = 'NOD ATA').
If found,
return result C.
Results:
Result
A
B
C
Response
At least one prior quarterly emissions file for at least one location in this monitoring
configuration has critical errors. You must correct all prior quarterly emissions files in
order to submit this quarterly emissions file to be loaded on EPA's host system.
At least one prior quarterly emissions file for at least one location in this monitoring
configuration has not been evaluated. You must evaluate all prior quarterly emissions
files in order to complete the evaluation for this quarterly emissions file.
At least one prior quarterly emissions file for at least one location in this monitoring
configuration has not been submitted and has been authorized for resubmission. You
must submit all prior quarterly emissions files in order to submit this quarterly
emissions file to be loaded on EPA's host system.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 467 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-13
Check Name: Determine If File Can Be Submitted
Related Former Checks:
Applicability: General Check
Description:
Specifications:
Locate the Emission Submission Access record for the configuration and reporting period.
If not found, or the Submission Availability Code is null,
return result A.
else if the Submission Availability Code is not equal to "GRANTED" or "REQUIRE",
return result B.
Results:
Result
A
B
Usage:
1
Response
The emissions quarterly report cannot be submitted, either because the EPA has not yet
opened the submission window, you have not logged into the EPA host system, or you
are no longer a representative or agent for this facility. If you are a representative or
agent for this facility, when EPA opens the submission window you should log in to the
EPA host system to receive automatic permission to submit. You will then need to
reevaluate this file prior to submitting.
The emissions quarterly report cannot be resubmitted until you contact the EPA for
permission. After the EPA grants permission, you will need to log in to the EPA host
system to retrieve the permission record. You will then need to reevaluate this file
prior to submitting.
Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Severity
Informational Message
Informational Message
Environmental Protection Agency
Page 468 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-14
Check Name: Ignored Offline Daily Calibration Check
Related Former Checks:
Applicability:
Description:
Specifications:
If (IgnoredDaily Calibration Tests == true)
set Ignored Daily Calibration Tests to false
return result A.
Results:
Result Response Severity
A You reported one or more daily calibration tests that will not fulfill your daily Informational Message
calibration testing requirement, because these tests were performed while the unit was
not operating and you have not reported a prior online-offline calibration
demonstration. These tests have been assigned a CalculatedTestResult of
"IGNORED", and they can be viewed on the Daily Calibration tab of the View Detailed
Emissions Screen. If you intend to use offline tests to fulfill your daily calibration
testing requirement, you must conduct an online-offline calibration demonstration.
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 469 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-15
Check Name:
Expiring Test Check
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
Set Expired Systems and Expiring Systems to null.
Set Expiration Text to "have expired"
If FLOW System ID Array for the location is not null,
For each SystemID in the FLOW System ID Array for the location:
Locate the latest RATATestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
SystemID being checked and the number of operating levels the OpLevelCodeList is equal to 3,
If found,
If RATATestRecords/iy Locat'umForOAStatus.TestRcasonCode 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 TestRecords/iy Location ForOAStatus.EndDMc
Set ExpirationDate to five years after the end of the quarter of the
OACertEventforEMEvaluation.TcslComp\cUonD'Mc
Else
Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecords/iy Location ForOAStatus.EndDMc
Set ExpirationDate to five years after the end of the quarter of the
RA TA TestRecords/iy Location ForQAStatus.EndDMc.
If ExpirationDate is prior to the current calendar date,
Append the Systemldentifier being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the Current Reporting Period,
Set Expiration Text to "will be expiring at the end of the reporting period".
Append the Systemldenitifier being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the Systemldentifier being checked to Expiring Systems.
If both Expired Systems and Expiring Systems are not null,
return result A
else if Expired Systems is not null,
return result B
else if Expiring Systems is not null,
return result C
else if NOXE System ID Array for the location is not null,
For each SystemID in the NOXE System ID Array for the location:
Locate the latest AppendixETestRecordsByLocationForQAStatus for the location where the SystemID is equal to the
Else
Environmental Protection Agency
Page 470 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
SystemID being checked,
If found,
Set ExpirationDate to five years after the end of the quarter of the
AppendixETestRecordsByLocationForQAStatusEndDats.
If ExpirationDate is prior to the current calendar date,
Append the Systemldentifier being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the Current Reporting Period,
Set Expiration Text to "will be expiring at the end of the reporting period".
Append the Systemldentifier being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the Systemldentifier being checked to Expiring Systems.
If both Expired Systems and Expiring Systems are not null,
return result D
else if Expired Systems is not null,
return result E
else if Expiring Systems is not null,
return result F
else if LME Fuel Array for the location is not null,
For each FuelCode in the LME Fuel Array for the location:
Locate the latest UnitDefaultTestRecordsByLocationForQAStatus for the location where the FuelCode is equal to the
FuelCode being checked,
If found,
Set ExpirationDate to five years after the end of the quarter of the
UnitDefaultTestRecordsIiy Location ForQAStatusM\\(\Dc\{c.
If ExpirationDate is prior to the current calendar date,
Append the FuelCode being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the Current Reporting Period,
Set Expiration Text to "will be expiring at the end of the reporting period".
Append the FuelCode being checked to Expired Systems.
else if ExpirationDate is on or before the last day of the quarter following the Current Reporting Period,
Append the FuelCode being checked to Expiring Systems.
If both Expired Systems and Expiring Systems are not null,
return result G
else if Expired Systems is not null,
return result H
else if Expiring Systems is not null,
return result I
Environmental Protection Agency
Page 471 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
H
Usage:
1
Response
Warning: The three-level RATA conducted for each of the following monitoring
systems [TEXT]: System ID(s) [EXPIRED], Except for a 720 operating-hour grace
period extension, you will need monitor stack flow with another FLOW system or
report substitute data until you perform another three-level RATA. In addition, the
three-level RATA conducted for each of the following monitoring systems will expire at
the end of the next reporting period: System ID(s) [EXPIRING]. Three-level RATAs
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.
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.
Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Severity
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 472 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-16
Check Name: Ignored Offline Daily Interference Check
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
If {IgnoredDaily Interference Tests == true)
return result A.
Results:
Result Response Severity
A You reported one or more daily interference checks that will not fulfill your daily Informational Message
testing requirement for your stack flow monitors, because these tests were performed
while the unit was not operating. These tests have been assigned a
CalculatedTestResult of "IGNORED". They can be viewed on the Other Daily Tests
tab of the View Detailed Emissions Screen.
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 473 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-17
Check Name:
Related Former Checks:
Missing Peaking or Gas Fired Qualification Percent Check
Applicability:
Description:
General Check
This check determines whether qualification percent rows are missing for a Year Round or Ozone Season
Monitor Qualification record.
Specifications:
If MpSuccessfulfyEvaluated equals true,
Set QualificationPercentMissingList = null.
For each QualificationRecord record in MpQualiflcationRecords where QualificationTypeCode is equal to "PK", "SK" or "GF",
BeginDate is on or before CurrentReportingPeriodEndHour, and EndDate is null or or is on or after
CurrentReportingPeriodBeginHour:
Locate the Qualification?ercentRecord record in MpQualiflcationPercentRecords where MonitorQualificationld is equal
to QualificationRecord.MonitorQualificationld, and QualificationDataYear is equal to CurrentReportingPeriodYear.
If not found,
If QualificationRecord.QuaiificationlYpeCo&e is equal to "GF",
Add "Gas-Fired Unit" concatenated with QualificationRecord Locationld to
QualificationPercentMissingList.
Else if QualificationRecord.QuaiificationlYpeCo&e is equal to "PK",
Add "Year-Round Peaking Unit" concatenated with QualificationRecord.Locationld to
QualificationPercentMissingList.
Else if QualificationRecord.QuaiificationlYpeCo&e is equal to "SK",
Add "Ozone-Season Peaking Unit" concatenated with QualificationRecord.Locationld to
QualificationPercentMissingList.
If QualificationPercentMissingList is not null,
return result A.
Results:
Result
A
Response
You did not report a current year percent record for [QualPctMissingList].
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 474 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-18
Check Name: Validate Unit Fuel
Related Former Checks:
Applicability:
Description: Validate that the fuel designated as primary is used at least 60 percent for the entire year of the time for a unit
which has operated greater 168 op hours
Specifications:
If Quarter of the Current Reporting Period is equal to I,
For each unit in MonitoringPlanLocationRecords
Locate all Facility Unit Fuel Records for the unit where :
1) Indicator Code is equal to "P"
2) BeginDate is prior to the end date of Current Reporting Period.
3) EndDate is null OR is after the begin date of Current Reporting Period.
If found,
Set Sum of Op Hours to 0
Locate all Facility Operating Supp Data Records for the unit where:
a) The calendar year is the year prior to the calendar year of Current Reporting Period.
b) Parameter Code is equal to "OPHOURS".
c) Fuel Code is equal to NULL.
For each located record
Increment Sum of Op Hours by Facility Operating Supp Data Records. O p Va 1 lie
If Sum of Op Hours > 168
Set Sum of Op Hours by Fuel to null
Locate all Facility Operating Supp Data Records for the unit where:
a) The calendar year is the year prior to the calendar year of Current Reporting Period.
b) Parameter Code is equal to "OPHOURS".
c) Fuel Code is NOT equal to NULL.
For each located record
Increment Sum of Op Hours by Fuel for Facility Operating Supp Data Records. Fuel Code by
Facility Operating Supp Data Records. O p Va 1 lie
For each FuelCode in Sum of Op Hours by Fuel
If (Sum of Op Hours by Fuel / Sum of Op Hours is greater than or equal to 0.60)
For each located Facility Unit Fuel Records record
If Facility Unit Fuel Records. Fuel Code is not equal to the FuelCode for Sum of
Op Hours by Fuel
Environmental Protection Agency
Page 475 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
return A
Result Response Severity
A The current active primary fuel type defined in the monitoring plan is inconsistent with Informational Message
the prior year operating hours by fuel type. Please update the primary fuel type in the
monitoring plan to match the prior year predominant fuel type by operating hours.
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 476 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-19
Check Name: Initialize Sorbent Trap Check Parameters
Related Former Checks:
Applicability:
Description: Initializes Sorbent Trap Dictionary and Sorbent Trap Record. Sorbent Trap Record is always initialized to
null, but is initialized here so that it always exists and is owned by an ancestor category.
Specifications:
Initialize MatsSorbentTrapDictionary to an empty dictionary.
Initialize MatsSamplingTrainDictionary to an empty dictionary.
Initialize MatsSorbentTrapListByLocationArray with the number of elements equal to CurrentLocationCount.
Set MatsSorbentTrapEvaluationNeeded to false.
If Count of records in MatsSorbentTrapRecords where SupplementalDatalndicator is false is greater than 0,
Set MatsSorbentTrapEvaluationNeeded to true.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 477 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-20
Check Name: Initialize Weekly System Integrity Test Dictionary
Related Former Checks:
Applicability:
Description: Initializes the weekly system integrity test dictionary to have a Componentld key and an entry with the
following fields:
1) MostRecentTestRecord to hold a Current Weekly Systemlntegrity record.
2) LastEvaluatedTestRecord to hold a CurrentWeeklySystemlntegrity record.
3) OpertingDateList to hold a date list.
4) LastOperatingDate to hold a date.
Specifications:
Initialize WsiTestDictionary with a string key for Componentld, and an entry with the following fields:
1) MostRecentTestRecord to hold a CurrentWeeklySystemlntegrify record.
2) LastEvaluatedTestRecord to hold a CurrentWeeklySystemlntegrify record.
3) OperatingDateList to hold a date list.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 478 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-21
Check Name: Initialize General Information
Related Former Checks:
Applicability: General Check
Description: Initializes list used during the evaluation process by individual checks.
Validation Tables:
Test Result Code (Lookup Table)
Specifications:
Append each TestResultCodeLookupTable.TestResultCode to TestResultCodeList delimited by a comma.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 479 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-22
Check Name:
Related Former Checks:
Initialize System Parameters
Applicability:
Description:
General Check
Initializes values based on system parameters.
Validation Tables:
Vw System Parameter (Lookup Table)
Specifications:
Set MatsDailyCalRequiredDate to null.
Locate SystemParameterLookupTable record where Sys Param Name is equal to 'MATSRULE.
Set MatsDailyCalRequiredDate to the located System Parameter Lookup Table. Pa ramVa 1 ue2.
If found,
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 480 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-23
Check Name:
Related Former Checks:
Initialize Program Lists
Applicability:
Description:
General Check
Initializes program code lists that contain programs that:
1) Are ozone season programs
2) Use RUEs.
3) Require S02 System certification.
4) Require NOX System certification.
5) Require NOX Concentration System certification.
Specifications:
Set ProgramlsOzoneSeasonList to
Set ProgramRequiresNoxSystemCertificationList to
Set ProgramRequiresNoxcSystemCertificationList to
Set ProgramRequiresSo2SystemCertiJicationList to
Set ProgramUsesRueList to
For each ProgramCodeRow in ProgramCodeTable,
If l'rogram( V«/c/^;\r,OzoncScasonIndicator is equal to 1,
Append ProgramCodeRow.ProgramCode to ProgramlsOzoneSeasonList.
If l'rogram( V«/£'/^;\r,No\CcrtificationRcquircdIndicator is equal to 1,
Append ProgramCodeRow.ProgramCode to ProgramRequiresNoxSystemCertificationList.
If Progra/wCWe.Row.NoxcCertificationRequiredIndicator is equal to 1,
Append ProgramCodeRow.ProgramCode to ProgramRequiresNoxcSystemCertificationList.
If l'rogram( V;c/c.'/toir.So2CcrtificationRcqiiircdIndicator is equal to 1,
Append ProgramCodeRow.ProgramCode to ProgramRequiresSo2SystemCertiJicationList.
If l'rogram( 'w/W^ir.UscsRucIndicator is equal to 1,
Append ProgramCodeRow .ProgramCode to ProgramUsesRueList.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 481 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-24
Check Name:
Related Former Checks:
Store Constant Values
Applicability:
Description:
General Check
This check stores values that will not change during the evaluation session, but are not readily accessible.
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
Set MwLoadHourlyTolerance to Tolerance from the HourlyEmissionsTolerancesCrossCheckTable record where Parameter equals
"LOAD" and UOM equals "MW".
Initialize the number of elements in LocationNameArray to the number of records in MonitorPlanLocationRecords.
Set each element in LocationNameArray to either LocationName in the corresponding record in MonitorPlanLocationRecords.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 482 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-25
Check Name:
Related Former Checks:
Return Results for Invalid Daily Calibration Cylinder Ids
Applicability:
Description:
General Check
Returns a result when invalid cylinder ids were encountered during daily calibration evaluation.
Specifications:
Set FormattedCylinderldList to
When InvalidCylinderldList is not null and contains ids,
Append each id in InvalidCylinderldList to FormattedCylinderldList.
Return result A.
Results:
Result Response Severity
A The format is invalid for daily calibration cylinder id(s) [CylinderldList]. A cylinder id Informational Message
can only contain alphanumeric capitalized characters, hyphens, and periods.
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Evaluation
Environmental Protection Agency
Page 483 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-26
Check Name:
Related Former Checks:
Initialize QA Certification Event Supplemental Data Storage
Applicability:
Description:
Specifications:
General Check
Initializes the storage for QA Certification Event Supplemental Data.
Initialize QaCertEventSuppDataDictionaryArray to an array with the number of elements matching the number of records in
MonitoringPlanLocationRecords.
Initialize QaCertEventSuppDataDictionaryBySystem to an empty dictionary.
Initialize QaCertEventSuppDataDictionaryByComponent to an empty dictionary.
For each LocationPosition in MonitoringPlanLocationRecords,
Set MonitoringPlanLocationRecord to the record at LocationPosition.
Initialize the QaCertEventSuppDataDictionaryArray element at LocationPosition to an empty dictionary.
For each QaCertEventRecord in QaCertEventsForEmEvaluation records where:
1) MonitorLocationKey is equal to MonitoringPlanLocationRecord.MonitorLocationKey.
2a) QaCertEventDate is between CurrentReportingPeriodBeginDate and CurrentReportingPeriodEndDate, OR
2b) ConditionalDataBeginDate is between CurrentReportingPeriodBeginDate and CurrentReportingPeriodEndDate.
Perform the following for both QaCertEventRecord.QaCQXtEventDatehowwA
Oa( 'm/'.Vt'^/tecwi:/. Conditional DataBcginDatehour.
For QaCertEventRecord Q&CQxtEvQntD&tQhow:
1) Set TargetDatehourCode = "QaCertEventDate".
2) Set TargetDatehourValue to QaCertEventRecord.Q&CQxtEvQntD&tQhow
3) Set TimeType to "Date".
4) Note that QaCertEventDatehour will never have a null value.
For QaCertEventRecord.ConditiondXDataBQginDstQhow.
1) Set Targe tDatehourCode = "ConditionalDataBeginHour".
2) Set Targe tDatehourValue to QaCertEventRecord.ConditiondXDataBQginDstQhow
3) Set TimeType to "Hour".
4) Note that ConditionalDataBeginDatehour may have a null value.
If Targe tDatehourValue is not null AND the quarter of Targe tDatehourValue matches
CurrentReportingPeriodYear/CurrentReportingPeriodQuarter,
Create QaCertEventSuppDataRecord with:
1) QaCertEventKey set to QaCertEventRecord.QaCertEventKey.
2) MonitorLocationKey set to QaCertEventRecord.MonitorLocationKey.
3) ReportingPeriodKey set to CurrentReportingPeriod.
4) TargetDatehourCode set to TargetDatehourCode.
5) TargetDatehourValue set to Targe tDatehourValue.
6) TimeType set to TimeType.
7) OpCount set to 0.
8) SystemQualityAssuredCount set to 0 if QaCertEventRecord.MonSysKey is not null, otherwise
Environmental Protection Agency
Page 484 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set to null.
9) ComponentQualityAssuredCount set to 0 if Oa( 'eril'A'eniReconl.ComponcnlKcy is not null,
otherwise set to null.
10) MayAndJuneOpCount set to 0 if CurrentReportingPeriodQuarter is equal to 2, otherwise set
to null.
11) MayAndJuneSystemQualityAssuredCount set to 0 if CurrentReportingPeriodQuarter is
equal to 2 AND QaCertEventRecord.MonSysKey is not null, otherwise set to null.
12) MayAndJuneComponentQualityAssuredCount set to 0 CurrentReportingPeriodQuarter is
equal to 2 AND Oa( 'eril'A'eniReconl.ComponcnlKcy is not null, otherwise set to null.
Add QaCertEventSuppDataRecorcl to the dictionary at LocationPosition in
QaCertEventSuppDataDictionaryArray using QaCertEventRecord .QaCertEventKey and
TargetDatehourCode as the key.
If QaCertEventRecord.MonSysKey is not null,
If QaCertEventSuppDataDictionaryBySystem does not contain a key equal to
QaCertEventRecord. MonSysKey,
Add QaCertEventRecord. MonSysKey to QaCertEventSuppDataDictionaryBy System
with an empty list.
Add QaCertEventSuppDataRecord to the list in QaCertEventSuppDataDictionary By System for
QaCertEventRecord. MonSysKey,
If Oa( 'eri/'A'eniReconl.ComponcnlKcy is not null,
If QaCertEventSuppDataDictionaryByComponent does not contain a key equal to
QaCertEventRecord. ComponentKey,
Add QaCertEventRecord. ComponentKey to
QaCertEventSuppDataDictionaryByComponent with an empty list.
Add QaCertEventSuppDataRecord to the list in
QaCertEventSuppDataDictionaryByComponent for QaCertEventRecord. ComponentKey ,
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 485 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-27
Check Name:
Related Former Checks:
Initialize System Operating Supplemental Data Storage
Applicability:
Description:
Specifications:
General Check
Initializes the storage for System Operating Supplemental Data.
Initialize SystemOperatingSuppDataDictionaryArray to an array with the number of elements matching the number of records in
MonitoringPlanLocationRecords.
For each LocationPosition in MonitoringPlanLocationRecords,
Set MonitoringPlanLocationRecord to the record at LocationPosition.
Initialize the SystemOperatingSuppDataDictionaryArray element at LocationPosition to an empty dictionary.
For each MonitorSystemRecord in MonitorSystemsForEmEvaluation records where:
1) MonitorLocationID is equal to MonitoringPlanLocationRecord.MonitorLocationID.
2) SystemTypeCode is in the set { "C02", "FLOW", "H20", "H20M", "H20T", "HCL", "HF", "HG", "NOX", "NOXC",
"NOXP", "02", "S02", "ST" }.
3) BeginDate is on or before CurrentReportingPeriodEndDote.
4) EndDate is null OR is on or after CurrentReportingPeriodBeginDate.
If SupplementalDataDictionary does NOT contain MonitorSystemRecord.MomtoringSystQmK),
Create SystemOperatingtSuppDataRecord with:
1) MonitoringSystemID set to MonitorSystemRecordMomtoxmg'SystQmSD.
2) ReportingPeriodID set to CurrentReportingPeriod.
3) MonitorLocationID set toMonitorSystemRecordMonitoring^oc&tionLD
4) OpDays set to 0.
5) OsDays set to 0.
6) OpHours set to 0.
7) OsHours set to 0.
Add a SystemOperatingtSuppDataRecord to the dictionary at LocationPosition in
SystemOperatingSuppDataDictionaryArray using System OperatingtSuppDataRecord.MonitoringSystemID as
the key.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 486 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-28
Check Name:
Related Former Checks:
Initialize Component Operating Supplemental Data Storage
Applicability:
Description:
Specifications:
General Check
Initializes the storage for Component Operating Supplemental Data.
Initialize ComponentOperatingSuppDataDictionaryArray to an array with the number of elements matching the number of records in
MonitoringPlanLocationRecords.
For each LocationPosition in MonitoringPlanLocationRecords,
Set MonitoringPlanLocationRecord to the record at LocationPosition.
Set SupplementalDataDictionary to an empty dictionary.
Initialize the ComponentOperatingSuppDataDictionaryArray element at LocationPosition to SupplementalDataDictionary .
For eachMonitorSystemComponentRecord in MonitorSystemComponentsForEmEvaluat'wn records where:
1) MonitorLocationID is equal to MonitoringPlanLocationRecord.MomtorLocationlD.
2) ComponentTypeCode is in the set { "C02", "FLOW", "HCL", "HF", "HG", "H20", "NOX", "02", "S02" }.
3) BeginDate is on or before CurrentReportingPeriodEndDote.
4) EndDate is null OR is on or after CurrentReportingPeriodBeginDate.
If SupplementalDataDictionary does NOT contain key MonitorSystemComponentRecord.ComponentlT>,
Create ComponentOperatingtSuppDataRecord with:
1) ComponentID settoMonitorSystemComponentRecord.ComponentlD.
2) ReportingPeriodID set to CurrentReportingPeriod.
3) MonitorLocationID set toMonitorSystemComponentRecord.MomtorLocationlD.
4) OpDays set to 0.
5) OsDays set to 0.
6) OpHours set to 0.
7) OsHours set to 0.
Add a ComponentOperatingtSuppDataRecord to SupplementalDataDictionary using
ComponentOperatingtSuppDataRecord.ComponenSD as the key.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 487 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-29
Check Name:
Related Former Checks:
Initialize Last Quality Assured Value Supplemental Data Storage
Applicability:
Description:
General Check
Initializes the storage for Last Quality Assured Value Supplemental Data.
Specifications:
Initialize LastQualityAssuredValueSuppDataDictionaryArray to an array with the number of elements matching the number of records in
MonitoringPlanLocationRecords.
For each LastQualityAssuredValueSuppDataDictionary in LastQualityAssuredValueSuppDataDictionaryArray,
Initialize the LastQualityAssuredValueSuppDataDictionary to an empty dictionary.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 488 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-30
Check Name: Initialize Primary Bypass Information
Related Former Checks:
Applicability: General Check
Description: Initializes check parameters used to indicate whether processing primary bypass stacks implemented as
systems should occur, and initializes information needed by that processing.
Specifications:
Set PrimaryBypassActivelnQuarter to false.
Locate records in MonitorSystemsForEmEvaluation where:
1) SystemDesignationCode equals "PB".
2) BeginDate is on or before CurrentReportingPeriodEndDate.
3) EndDate is on or after CurrentReportingPeriodBeginDate.
If found,
Set PrimaryBypassActivelnQuarter to true.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 489 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-4
Check Name: Emission Comment Reporting Period Valid
Related Former Checks:
Applicability: General Check
Description: This check determines whether or not Emission Comment Reporting Period is valid.
Specifications:
For a Emission Comment record:
If ReportingPeriod is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation
Environmental Protection Agency
Page 490 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURGEN-5
Check Name: Submission Comment Valid
Related Former Checks:
Applicability: General Check
Description:
Specifications:
For the Emission Comment record:
If SubmissionComment is null,
return result A.
Results:
Result Response Severity
A You did not provide [fieldname], which is required for [key]. Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation
Environmental Protection Agency
Page 491 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURGEN-6
Check Name:
Related Former Checks:
Duplicate Emission Comment Records
Applicability:
Description:
General Check
This check determines if there is another EmissionComment record with the same key fields.
Specifications:
For a Emission Comment record:
Locate another EmissionComment record for the monitoring plan with a ReportingPeriod equal to the ReportingPeriod in the
current record.
If found,
return result A.
Results:
Result
A
Response
Another [recordtype] record already exists with the same [fieldnames].
Severity
Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Emission Comments Evaluation
Environmental Protection Agency
Page 492 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Monitor Data
Environmental Protection Agency
Page 493 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-1
Check Name: Initialize S02C Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameters and output parameters for subsequent monitor hourly checks for S02C.
Specifications:
Current MHV Parameter = "S02C"
S02C Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 494 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-2
Check Name: Initialize H20 Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for H20.
Specifications:
Current MHV Parameter = "H20"
H20 MHV Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report H20 Monitor Hourly Evaluation
Environmental Protection Agency
Page 495 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-3
Check Name: Initialize NOXC Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for NOXC.
Specifications:
Current MHV Parameter = "NOXC"
NOXC Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOx Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 496 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-4
Check Name: Initialize Flow Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameters and output parameters for subsequent monitor hourly checks for FLOW.
Specifications:
Current MHV Parameter = "FLOW"
FLOW Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report FLOW Monitor Hourly Evaluation
Environmental Protection Agency
Page 497 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-5
Check Name: Initialize C02C Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for C02C.
Specifications:
Current MHV Parameter = "C02C"
C02C MHV Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02 Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 498 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-6
Check Name: Initialize 02 Dry Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02 Dry.
Specifications:
Current MHV Parameter = "02D"
02 Dry Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report 02 Dry Monitor Hourly Evaluation
Environmental Protection Agency
Page 499 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-7
Check Name: Initialize 02 Wet Hourly Monitor Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02C Wet.
Specifications:
Current MHV Parameter = "02 W"
02 Wet Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report 02 Wet Monitor Hourly Evaluation
Environmental Protection Agency
Page 500 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-8
Check Name: Check MODC in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: Basic check to ensure that MODC reported in the MHV record is valid for the parameter. Also initializes
variables for the category.
Specifications:
Monitor Hourly Mode Status = false
Current MHV Parameter Description = Current MHV Parameter
Complete MHV Record Needed = true
case {Current MHV Parameter)
S02C: Current MHV Record = Current S02 Monitor Hourly Record
Current MHV Component Type = 'S02'
Current MHV System Type = 'S02'
Current MHV Default Parameter = 'S02X'
If (Current MHV Record. ModcCode == "23")
If (S02 Bypass Code == "BYMAXFS")
Current MHV Fuel Specific Hour = true
else
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 {Current MHV Record. ModcCode in set {23, 24})
If {NOx Mass Bypass Code == "BYMAXFS")
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
else if (NOx Mass Fuel Specific Missing Data == true)
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If {NOx Cone Neededfor 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})
Environmental Protection Agency
Page 501 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result A
Else
Monitor Hourly Mode Status = true
Else
Complete MHVRecord Needed = false
If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54})
If ( Current MHV Record. ModcCode == 46)
Monitor Hourly Mode Status = true
Else
return result B
Else
Monitor Hourly Mode Status = true
NOx Cone MODC = Current MHV Record. ModcCode
FLOW: Current MHV Record = Current Stack Flow Hourly Record
Current MHV Component Type = 'FLOW'
Current MHV System Type = 'FLOW'
Current MHV Default Parameter = 'FLOX'
If (SO2 Fuel Specific Missing Data == true OR CO 2 Fuel Specific Missing Data == true OR NOx Mass Fuel Specific
Missing Data == true OR Heat Input Fuel Specific Missing Data == true)
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If (FlowNeededForPart75 is true)
If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 20, 53, 54, 55})
return result A
Else
Monitor Hourly Mode Status = true
Else /* Flow Needed for MATS */
If (Current MHV Record. ModcCode not in set {01, 02, 03, 04, 20, 46, 53, 54})
return result F
Else
Monitor Hourly Mode Status = true
C02C: Current MHV Record = Current C02 Cone Monitor Hourly Record
Current MHV Component Type = 'C02'
Current MHV System Type = 'C02'
Current MHV Default Parameter = 'C02X'
C02C MHV MODC = Current C02 Cone Monitor Hourly Record .ModcCode
If {{C02 Fuel Specific Missing Data == true AND CO 2 Cone Checks Neededfor C02 Mass Calc == true) OR {Heat
Input Fuel Specific Missing Data == true AND CO2 Cone Checks Neededfor Heat Input == true))
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If {{C02 Cone Checks Needed for Heat Input == true) OR (CO2 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, 20, 21, 23, 53, 54,
55})
Environmental Protection Agency
Page 502 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result A
Else
Monitor Hourly Mode Status = true
If ( Current C02 Cone Missing Data Monitor Hourly Record is not null)
If ((C02 Diluent Checks Needed for NOx Rate Calc == true) OR (CO2 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, 20, 21, 53, 54} )
If ( Current MHV Record. ModcCode == 46)
Monitor Hourly Mode Status = true
Else
return result C
Else
Monitor Hourly Mode Status = true
02D: Current MHV Record = Current 02 Dry Monitor Hourly Record
Current MHV Component Type = '02'
Current MHV System Type = null
Current MHV Default Parameter = '02N'
02 Dry MODC = Current 02 Dry Monitor Hourly Record.ModcCode
If (Current MHV Record.MoistureBasis is null)
Current 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 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 ( Current 02 Dry Missing Data Monitor Hourly Record is not null)
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} )
If ( Current MHV Record. ModcCode == 46)
Monitor Hourly Mode Status = true
Environmental Protection Agency
Page 503 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
return result D
Else
Monitor Hourly Mode Status = true
02 W: Current MHVRecord = Current 02 Wet Monitor Hourly Record
Current MHVComponent Type = '02'
Current MHV System Type = null
Current MHV Default Parameter = '02N'
02 WetMODC = Current 02 Wet Monitor Hourly Record.ModcCode
If (Current MHV Record.MoistureBasis is null)
Current MHV Parameter Description = "02C"
else
Current MHV Parameter Description = "02C with a MoistureBasis of " + Current MHV Record. 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
Current MHV Fuel Specific Hour = false
If (()2 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 ( Current 02 Wet Missing Data Monitor Hourly Record is not null)
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} )
If ( Current MHV Record. ModcCode == 46)
Monitor Hourly Mode Status = true
Else
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
Environmental Protection Agency
Page 504 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Current MHVDefault Parameter = null'
If (H20 Fuel Specific Missing Data == true)
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If {Current MHV Record. ModcCode not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
return result A
else
Monitor Hourly Mode Status = true
C02CSD:
Current MHV Record = Current C02 Cone Missing Data Monitor Hourly Record
Current MHV Component Type = 'C02'
Current MHV System Type = 'C02'
Current MHV Default Parameter = 'C02X'
Current MHVParameter Description = "C02C (Substitute Data)"
If ((C02 Fuel Specific Missing Data == true AND CO 2 Cone Checks Neededfor C02 Mass Calc == true) OR (Heat
Input Fuel Specific Missing Data == true AND CO2 Cone Checks Neededfor Heat Input == true))
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If {Current MHV Record. ModcCode not in set {06, 07, 08, 09, 10, 12, 55})
return result A
Else
Monitor Hourly Mode Status = true
02CSD:
if {Current 02 Dry Missing Data Monitor Hourly Record is not null)
Current MHV Record = Current 02 Dry Missing Data Monitor Hourly Record
else
Current MHV Record = Current 02 Wet Missing Data Monitor Hourly Record
Current MHV Component Type = '02'
Current MHV System Type = null
Current MHV Default Parameter = '02N'
Current MHVParameter Description = "02C (Substitute Data)"
If {Heat Input Fuel Specific Missing Data == true AND 02 Dry Checks Neededfor Heat Input == true)
Current MHV Fuel Specific Hour = true
else
Current MHV Fuel Specific Hour = false
If {Current MHV Record. ModcCode not in set {06, 07, 08, 09, 10, 12, 55})
return result A
Else
Monitor Hourly Mode Status = true
Environmental Protection Agency
Page 505 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
The MODCCode reported in the MHV record for [param] is invalid.
You reported a MODCCode of [MODC] in the MHV record for NOXC, but this
MODC is not appropriate when NOX concentration is used in a NOx-diluent system to
calculate the NOx emission rate.
You reported a MODCCode of [MODC] in the MHV record for C02C, but this MODC
is not appropriate when C02 concentration is only used to calculate 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.
You reported a MODCCode of [MODC] in the MHV record for [param], but this
MODC is not appropriate for MATS-only units.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 506 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-9
Check Name: Check Percent Monitor Availability in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: Performs a series basic checks to ensure that the reported monitor percent available is between 0 and 100,
inclusive, then checks to see that percent available is within permitted ranges for specific MODC codes
Specifications:
Monitor Hourly Pma Status = false
Monitor Hourly Missing Data Status = true
If (Monitor Hourly Mode Status == true)
If ( Current MHV Record.Percent Available is NULL)
if {Complete MHV Record Needed == false)
Monitor Hourly Pma Status = true
else
if (Current MHV Record.ModcCode not in set {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54} AND Legacy
Data Evaluation == true)
Monitor Hourly Pma Status = true
return result A
else
return result B
else
if {Complete MHV Record Needed == false)
return result C
else if (Current MH VRecord. Pcrcclit A\ ailab 1 e> 100.0 OR
Current MHVRecord.Pcrcclit A\ ailable < 0.0)
return result D
Else
case ( Current MHV Record. ModcCode)
= 06:
If Current MH VRecoril. Pc rcc lit A\ ailable >= 90.0
Monitor Hourly Pma Status = true
Else
return result E
= 08:
If Current MHV Record.Percent Available >= 95.0
Monitor Hourly Pma Status = true
Else
return result E
= 09:
If Current MHV Record.Percent Available >= 90.0 AND Current MHVRecord.Percent Available < 95.0
Monitor Hourly Pma Status = true
Else
return result E
= 10:
If Current MH V Record. Pc rcc lit A\ ailable >=80.0 AND Current MH V Record. Pc rcc lit A\ ailable < 90.0
Monitor Hourly Pma Status = true
Else if Current MHV Parameter in {FLOW,NOXC} and Current MH V Record. Pc rcc lit A\ ailable >=
90.0
Monitor Hourly Pma Status = true
Environmental Protection Agency
Page 507 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result F
Else
return result E
= 11:
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
Results:
Result
A
B
C
D
E
F
Usage:
Response
You reported an MODCCode of [ModcCode] in the MHV record for [param], but you
did not report a value for PercentAvailable. While this is not required for legacy EDR
data, it is required in all MHV records for ECMPS.
You did not report PercentAvailable in the MHV record for [param].
You reported PercentAvailable in the MHV record for [param], but this value should
not be reported when the monitoring system is only being used to calculate the NOX
emission rate, moisture, and/or C02 concentration. In that case, the percent monitor
availability should be reported in the appropriate DHV record.
The PercentAvailable reported in the MHV record for [param] is invalid. This value
must be between 0 and 100.
You reported an MODCCode of [modcCode] in the MHV record for [param], but the
PercentAvailable is not appropriate for this MODC.
You reported an MODCCode of 10 in the [type] record for [param], but the
PercentAvailability is greater than or equal to 90. When the PMA is greater than or
equal to 90, you should only report an MODC of 10 to indicate that you used the
maximum hourly value in the lookback period for the next available higher load bin,
because there were no quality-assured data in the bin corresponding to the current load
range. (See Part 75.33(c)(5).)
Severity
Informational Message
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Informational Message
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 508 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-10
Check Name:
Related Former Checks:
Check Prior QA'd Hours for MODC 07
Applicability:
Description:
CEM Check
For Method of Determination Code 07, all prior hours in reporting period are checked to ensure that total of
QA'd hours is below a certain threshold
Specifications:
if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if (Current MHVRecord.ModcCode == 07)
if {Current MHV Parameter in set {02D, 02W, 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))
else
case {Current MHV Parameter)
S02C: MODC Set = {01, 02, 04, 16, 17, 19, 20, 21, 22, 53}
NOXC: MODC Set = {01, 02, 04, 17, 19, 20, 21, 22, 53}
C02C: MODC Set = {01, 02, 04, 17, 20, 21, 53}
FLOW: MODC Set = {01, 02, 04, 20, 53}
H20: MODC Set = {01, 02, 04, 21, 53}
Prior QA Hours = count MonitorHourlyValueData records where
MonitorHourlyValueData.ModcCode in set MODC Set AND
MonitorHourlyValueData.ParameterCode = Current MHV Record. ParameterCode AND
(MonitorHourlyValueData.BeginDate < Current Date OR
(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour <
Current Hour))
if {Current MHV Parameter in set {NOXC, FLOW})
if {Prior QA Hours > 2160)
Monitor Hourly Missing Data Status = false
return result A
else
if {Prior QA Hours > 720)
Monitor Hourly Missing Data Status = false
return result A
Environmental Protection Agency
Page 509 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You reported an MODCCode of 07 in the MHV record for [param], but too many prior Critical Error Level 1
quality assured hours exist in evaluation period for use of this missing data approach.
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 510 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-11
Check Name: Check Extraneous Data in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that certain fields are null in the MHV record.
Specifications:
Monitor Hourly Null Status = false
Hourly Extraneous Fields = null
if (Current M//K/?6'cwY/.AdjustcdHourly Value is not null AND Current MHV Parameter not in set {S02C, NOXC, FLOW})
append "AdjustedHourly Value" to Hourly Extraneous Fields
if (Current MHV Record.MoistureBasis is not null AND Current MHV Parameter not in set {02D, 02W, 02CSD})
append "MoistureBasis" to Hourly Extraneous Fields
if (Hourly Extraneous Fields is not null)
return result A
else
Monitor Hourly Null Status = true
Results:
Result Response Severity
A You reported [fieldnames] in the MHV record for [param]. This data should be blank. Non-Critical Error
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 511 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-12
Check Name: Check For Correct Use of MODCs
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
Current MHVHBHA Value = null
if (Monitor Hourly Mode Status == true AND Monitor Hourly PMA Status == true)
if {CurrentMHVRecord.ModcCode in set {06, 08, 09})
if (Current MHV Parameter in set {02D, 02W, 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
NextMHVRecord = 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 MHVRecord is not null and is in current reporting period
If Prior Mill Vtecw^/.UnadjustcdHourlv Value >= 0 AND Next MHV
UnadjustedHourly Value >= 0
Current MHV HBHA Value = (I'nor Mill Vtecw^/.UnadjustcdHourlv Value + Next MHV
UriadjustedHourly Value) / 2, ROUNDED to a single decimal.
else
Monitor Hourly Missing Data Status = false
return result A
case (Current MHV Parameter)
S02C:
NOXC:
FLOW:
C02C OR C02CSD:
H20:
MODCSet={01, 02, 03, 04, 16, 17, 19, 20, 21, 22, 53, 54}
MODCSet = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}
MODCSet = {01, 02, 03, 04, 20, 53, 54}
MODC Set ={01, 02, 03, 04, 17, 20, 21, 53, 54}
MODC Set ={01, 02, 03, 04, 21, 53, 54}
Environmental Protection Agency
Page 512 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if {CurrentMHVParameter in set {H20, C02C})
Prior Record = latest MonitorHourlyValueData record or DerivedHourlyValueData record where
ParameterCode = Current MHV Parameter AND
ModcCode in set MO DC 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 MO DC Set AND
(Date > Current Date OR
(Date = Current Date AND Hour > Current Hour ))
If Next Record is not null and is in current reporting period
If Pr/'ori?ecor(i.UnadjustedHourlyValue >= 0 AND Xext UnadjustedHourlyValue
>=0
Current MHVHBHA Value = (Prior i?ecor Current Date OR
(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour > Current
Hour)]
If NextMHVRecord is not null and is in current reporting period
If Prior \lll\ Vtecw^/.UnadjustcdHourlv Value >= 0 AND AND Next MHV
UriadjustedHourly Value >= 0
Current MHV HBHA Value = (Prior \1II\ Vtecw^/.UnadjustcdHourlv Value +
Xext \1II\ Vtecw^/.UnadjustcdHourlv Value) / 2, ROUNDED to a single decimal.
else
Monitor Hourly Missing Data Status = false
Environmental Protection Agency
Page 513 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result A
else
Prior MHVRecord = latest MonitorHourlyValueData record where
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODCSet 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
NextMHVRecord = earliest MonitorHourlyValueData record where
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourValueData.ModcCode in set MODCSet AND
[MonitorHourlyValueData.Date > Current Date OR
(MonitorHourlyValueData.Date = Current Date AND MonitorHourlyValueData.Hour >
Current Hour)]
If NextMHVRecord is not null and is in current reporting period
If Prior \lll\ AdjustedHourlyValue >= 0 AND Next MHV
/tecrw/. Adjust edHourlv Value >= 0
if {CurrentMHVParameter == "FLOW")
Current MHVHBHA Value = (Prior MHV
Record. AdjustedHourlyValue + Next MHV
AdjustedHourly Value) / 2, ROUNDED to the nearest 1000.
else
Current MHV HBHA Value = (Prior MHV
Record. AdjustedHourlyValue + Next MHV
Record.AdjustedHourlyValue) / 2, ROUNDED to a single decimal.
else
Monitor Hourly Missing Data Status = false
return result B
else if (Current MHV Record. ModcCode == "11")
case (Current MHV Parameter)
NOXC: MODCSet = {01, 02, 03, 04, 17, 19, 20, 21, 22, 53, 54}
FLOW: MODCSet = {01, 02, 03, 04, 20, 53, 54}
Prior Measured MHV Record = MonitorHourlyValueData record at latest time for the location where
MonitorHourlyValueData.ModcCode in set MODCSet 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 MHVRecord .BeginDate
PriorHour = Prior Measured MHVRecord .BeginHour
else
PriorDate = the day prior to the beginning of the current reporting period
PriorHour = 23
Environmental Protection Agency
Page 514 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Next MeasuredMHVRecord = MonitorHourlyValueData record at earliest time for the location where
MonitorHourlyValueData.ModcCode in set MODCSet AND
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
(MonitorHourlyValueData.BeginDate > Current Date OR
(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour > Current
Hour))
If Next Measured MHV Record is not null and is in the current reporting period
NextDate = Next Measured MHVRecord .BeginDate
NextHour = Next Measured MHVRecord .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
(MonitorHourlyValueData.BeginDate = PriorDate AND MonitorHourlyValueData.BeginHour >
PriorHour)) AND
(MonitorHourlyValueData.BeginDate < NextDate OR
(MonitorHourlyValueData.BeginDate = NextDate AND MonitorHourlyValueDataBeginHour <
NextHour))
if (Current MHVRecord.Pcrcclit A\ ailable is null OR Current MHVRecord.Pcrcclit A\ ailable >= 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 records for the location and reporting period
where
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourlyValueData.ModcCode == "17" AND
(MonitorHourlyValueData.BeginDate < Current Date OR
(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour< Current
Hour))
If Hours of Use of Like Kind Analyzer >= 720
First Use of Like Kind Analyzer Record = MonitorHourlyValueData record at earliest time for the location and
and reporting period where
MonitorHourlyValueData.ParameterCode = Current MHV Parameter AND
MonitorHourlyValueData.ModcCode == "17" AND
(MonitorHourlyValueData.BeginDate < Current Date OR
(MonitorHourlyValueData.BeginDate = Current Date AND MonitorHourlyValueData.BeginHour<
Current Hour))
If Current MHVRecord.MonitoringSystemID is not null,
Locate a RATATestRecordsByLocationForQAStatus for the location
where the MonitoringSystemID is equal to Current MHV Record Mo\\\{on ngSystcm ID. the
Environmental Protection Agency
Page 515 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
all Monitor System Component Records for Hour and Location
where the ComponentID is equal to Current MHVRecord. Component ID.
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 Response
A The UnadjustedHourlyValue reported in the MHV record for [param] either before or
after the current hour is invalid.
B The AdjustedHourlyValue reported in the MHV record for [param] either before or
after the current hour is invalid.
C 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.
D 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.
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
else
Locate
Locate
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 516 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-13
Check Name: Check System in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that a valid Monitoring System is indicated in the MHV record.
Specifications:
Current MHVMon Sys Record = null
Monitor Hourly System Status = false
If (Current MHV Parameter == "NOXC" AND NOx Cone Checks Neededfor Nox Mass == false)
if (Current MHV Record Mo\\\{on ngSystcm ID is NOT null AND Legacy Data Evaluation == false)
return result A
else
Monitor Hourly System Status = true
else if ( Current MHV Parameter == "C02C" AND C02 Cone Checks Neededfor Heat Input == false AND C02 Cone Checks
Neededfor C()2 Mass Calc == false AND C02 Diluent Needed for MATS == false )
if (Current MHV Record Mo\\\{on ngSystcm ID 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 ()2 Wet Checks Neededfor Heat Input == false AND 02 Wet Checks Needed to
Support C02 Calculation == false AND 02 Wet Needed for MATS == false) OR
( Current MHVParameter == "02D" AND 02 Dry Checks Needed for Heat Input == false AND 02 Dry Checks Needed to
Support C02 Calculation == false AND 02 Dry Needed for MATS == false)
if (Current MHV Record Mom\on ngSystcm ID is NOT null AND Legacy Data Evaluation == false)
return result G
else
Monitor Hourly System Status = true
else
If (Monitor Hourly MODC Status == t rue;
if Current MHVRecord.MonitoringSystemID is null
case (Current MHV Parameter)
S02C:
NOXC:
C02C, 02D, or 02W:
FLOW:
H20:
C02CSD or 02CSD:
MODC Set ={01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22}
MODC Set ={01, 02, 03, 04, 17, 18, 19, 20, 21, 22}
MODC Set = {01, 02, 03, 04, 17, 18, 20, 21}
MODC Set = {01, 02, 03, 04, 20}
MODC Set = {01, 02, 03, 04, 21}
MODC Set ={}
if (Current MHV Record. ModcCode in set MODC Set)
return result C
else
return result H
else
Environmental Protection Agency
Page 517 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Current MHVMon Sys Record = find active MonitoringSystemData record for location where
MonitoringSystemData.MonitoringSystemID = Current MHV Ttecon/.MonitoringSystemID
if Current MHVMon Sys Record is null
return result D
else
else
if {Current MHV Parameter in set {02D, 02 W, 02CSD})
if (Legacy Data Evaluation == true
if {Current MHV Mon Sys Record. SystcmTypcCodc not in set
{H20,02,C02,N0XC,N0X})
return result E
else
Monitor Hourly System Status = true
else if {Current MHV Mon Sys Record. SystcmTypcCodc not in {02, C02})
return result E
else
Monitor Hourly System Status = true
else if {Current MHVParameter = "H20")
if {Current MHV Mon Sys SystcmTypcCodc not in {H20T, H20M})
return result E
else
Monitor Hourly System Status = true
else
if {Current MHV Mon Sys SystcmTypcCodc <> Current MHV System Type)
If {Current MHV Parameter in {"C02C", "C02CSD"} AND Legacy Data Evaluation
== true AND
Current MHV Mon Sys Record. SystcmTypcCodc == "NOX")
Monitor Hourly System Status = true
else
return result E
else
Monitor Hourly System Status = true
Monitor Hourly System Status = true
Environmental Protection Agency
Page 518 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
Severity
Critical Error Level 1
C
D
E
F
G
H
Usage:
Critical Error Level 1
Critical Error Level 1
Response
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.
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, heat
input, or a MATS value.
You did not report a MonitoringSystemID in the MHV record for [param]. This
information is required when you report measured data.
You reported MonitoringSystemID [ID] in the MHV record for [param], but there is no Critical Error Level 1
Monitoring System record for this system in your monitoring plan that was active
during the hour.
You reported MonitoringSystemID [ID] in the MHV record for [param], but this
SystemTypeCode for this monitoring system is not appropriate.
You reported a MonitoringSystemID in the MHV record for [param], but this is not
appropriate when substitute data is used.
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,
heat input, or a MATS value.
You did not report a MonitoringSystemID in the MHV record for [param]. This
information is required when you report for missing data substitution.
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Informational Message
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 519 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-14
Check Name: Check System Designation Code for System in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that the SystemDesignationCode of the monitoring system is compatible with reported
MODC.
Specifications:
If (Monitor Hourly Mode Status == true AND Monitor Hourly System Status == true ANDCurrent MHVMon Sys Record is not null)
case {Current MHV Record. ModcCode)
01 OR 17: If (Current MHV Mon Sys Record. SystemDesignationCode NOT in set {P, PB})
return result A
02: If (Current MHV Mon Sys Record. SystemDesignationCode NOT in set {B, RB, DB}
return result B
04: If (Current MHV Mon Sys Record. SystemDesignationCode <> "RM")
return result C
22: If (Current MHV Mon Sys Record. SystemDesignationCode <> "CI")
return result D
Results:
Result
A
B
C
D
Response
You reported an MODCCode of [modcCode] in the MHV record for [param], but
MonitoringSystemID [ID] is not a primary system.
You reported an MODCCode of 02 in the MHV record for [param], but
MonitoringSystemID [ID] is not a backup system.
You reported an MODCCode of 04 in the MHV record for [param], but
MonitoringSystemID [ID] is not a reference method system.
You reported an MODCCode of 22 in the MHV record for [param], but
MonitoringSystemID [ID] is not a certified inlet system.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 520 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: HOURMHV-15
Check Name: Check Component in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that the component in the MHV record is valid.
Specifications:
Monitor Hourly Component Status = false
If (Monitor Hourly MODC Status == t rue;
if Current MHV Record. ComponentID is null
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, 02 W: 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}
C02CSD, 02CSD: MODC Set = { }
If {Current MHV Parameter == "FLOW" and Current MHV Record ngSystcm ID is not null)
Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location where
MonitoringSystemComponentData .ComponentTypeCode = "FLOW" AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHVTtecon/.MonitoringSystemID
If {Count Mon Sys Comp Record < 2)
If {Current MHVRecord .ModcCode in set MODC Set)
return result A
Else
return result F
else
Else
Monitor Hourly Component Status= true
Otherwise,
If {Current MHV Record.ModcCode in set MODC Set)
return result A
Else
return result F
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 Current MHV Record. ModcCode == 17 AND Current MHV Component Record. Componentldentifier does not
begin with "LK"
return result C
else if {Monitor Hourly System Status == true AND Current MHV Mon Sys Record is not null)
Count Mon Sys Comp Record = count active MonitoringSystemComponent record for location where
Environmental Protection Agency
Page 521 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
MonitoringSystemComponentData .ComponentID = Current MHVRecord. Component ID AND
MonitoringSystemComponentData.MonitoringSystemID = Current MHVTtecon/.MonitoringSystemID
If Count Mon Sys Comp Record = 0
return result D
Else
Monitor Hourly Component Status= true
Else
Monitor Hourly Component Status = true
Results:
Result
A
B
C
D
E
F
Usage:
Response
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.
You did not report a ComponentID in the MHV record for [param]. The Componentld
is required when you report for missing data substitution.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Informational Message
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 522 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMH V-16
Check Name:
Related Former Checks:
Check Unadjusted Value
Applicability:
Description:
CEM Check
This check ensures that the UnadjustedValue in the MHV record for S02C, NOXC, and FLOW is valid.
Specifications:
Monitor Hourly Preadjusted Value Status = false
S02C: MODCSet = {01, 02, 03, 04, 16, 17, 18, 19, 20, 21, 22, 53, 54}
NOXC: MODC Set = {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 53, 54}
FLOW: MODC Set = {01, 02, 03, 04, 20, 53, 54}
If {Current MHV Record. ModcCode in set MODC Set)
If (Current M//K/?6'cwY/.UnadjustcdHourly Value is null AND
Current MHV Record. ModcCode not in set {04, 19, 20, 53, 54})
return result A
else if {Current MHV Record \5naA}uste6iRom\yValue < 0.0 AND
Current MHV Record. ModcCode not in set {16, 21} )
return result A
else if {Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ == 2 AND
Current MHV Record. ModcCode == 16)
return result G
else if {Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ > 2 AND
Current MHV Record. ModcCode == 16)
return result B
else if {Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ > 0 AND
Current MHV Record. ModcCode == 21)
return result C
else if {Current MHV Parameter in set {S02C, NOXC} and Current M//K/?6'cw Current MHV Max Min Value)
return result D
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
return result E
Else
Monitor Hourly Preadjusted Value Status = true
Results:
Result
A
B
C
D
E
F
G
H
Usage:
1
Response
The UnadjustedHourlyValue reported in the MHV record for [param] is missing or
invalid.
You reported an MODCCode of 16 in the MHV record for [param], but the
UnadjustedHourly Value exceeds 2.
You reported an MODCCode of 21 in the MHV record for [param], but the
UnadjustedHourly Value is greater than 0.
Warning: The UnadjustedHourly Value reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You should
investigate the cause of these exceedances and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
You reported an MODCCode of [modcCode] in the MHV record for [param], so you
should not have reported a value for the UnadjustedHourly Value.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported an MODCCode of 16 in the MHV record for [param], but the
UnadjustedHourly Value is equal to 2. According to Part 75.1 l(e)(3)(iii) any
bias-adjusted hourly average S02 concentration of less than 2.0 ppm recorded by the
S02 monitoring system shall be adjusted to a default value of 2.0 ppm, for reporting
purposes.
You reported an MODCCode of [modcCode] in the MHV record for [param], so you
should not have reported a value for the UnadjustedHourly Value.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Informational Message
Informational Message
Process/Category:
2 Process/Category:
3 Process/Category:
Emissions Data Evaluation Report FLOW Monitor Hourly Evaluation
Emissions Data Evaluation Report NOx Concentration Monitor Hourly Evaluation
Emissions Data Evaluation Report S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 524 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-17
Check Name: Verify Consistency Between NOx Emission Rate and NOx Concentration
Related Former Checks:
Applicability: CEM Check
Description: This check ensures consistency between NOx emission rate records and NOx Concentration records based on
the MODC and reported values.
Specifications:
If (NOx Cone Needed for NOx Rate Calc == true AND Monitor Hourly Mode Status == true)
if {CurrentMHVRecord.MODCCode not in set {01, 02, 03, 04, 17, 18, 19, 20, 21, 22, 46, 53} )
if ( NOx Emission Rate MODC in set {01, 02, 03, 04, 14, 21, 22, 53, 54} )
return result A
else if (Current MHV Record.MODCCode == 21 AND NOx Emission Rate MODC not in set {14, 21})
return result A
elseif (Current MHV Record.MODCCode == 22 AND NOx Emission Rate MODC not in set{14, 22})
return result A
elseif (Current MHV Record MODCCode == 46 AND NOx Emission Rate MODC in set {01, 02, 03, 04, 05, 14, 21, 22, 53,
54})
return result B
Results:
Result
A
B
Response
You reported an MODCCode of [MODC] in the MHV record for NOXC that is
inconsistent with MODCCode of [NOX ER MODC] reported in the DHV record for
NOXR.
You reported an MODCCode of [MODC] in the MHV record for NOXC that is
inconsistent with MODCCode of [NOX ER MODC] reported in the DHV record for
NOXR.
Severity
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report NOx Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 525 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-18
Check Name: Determine Maximum or Minimum Value for Parameter in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check determines the maximum or minimum value for the parameter from the span or default table based
on MODC.
Specifications:
Current MHV Max Min Value = null
If (Current MHV Parameter == "H20")
If (H20 Missing Data Approach == 'MAX")
Current MHV Default Parameter = "H20X"
Else If (H20 Missing Data Approach == 'MIN")
Current MHV Default Parameter = "H20N"
else if (Current MHV Record. ModcCode == 12)
return result A
If (Monitor Hourly Mode Status == true AND Current MHV Default Parameter is not null)
If (Current MHV Record. ModcCode in set {12, 23} AND Current MHV Fuel Specific Hour = true)
If Current Hourly Op Record.FuelCode is not null
Current MHV Missing Data Fuel = Current Hourly Op Record. FuelCode
Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = Current Hourly Op Record .FuelCode
DefaultPurposeCode = 'MD" //Missing Data
OperatingCode in set {A,U} // Not Controlled
if (count >1)
return result B
else if (count == 0)
return result C
else
Default Record = the single matched record
if (Default Record. Default Value > 0)
Current MHV Max Min Value = Default Record. Default Value
else
return result D
else if (Current MHV Record. ModcCode in set {13, 24} AND Current MHV Fuel Specific Hour ==true)
If Current Hourly Op Record .FuelCode is not null
Current MHV Missing Data Fuel = Current Hourly Op Record. FuelCode
Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = Current Hourly Op Record .FuelCode
DefaultPurposeCode = 'MD" //Missing Data
OperatingCode in == "C" // Controlled
Environmental Protection Agency
Page 526 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (count >1)
return result B
else if (count == 0)
return result C
else
Default Record = the single matched record
if (Default Record. Default Value > 0)
Current MHV Max Min Value = Default Record. Default Value
else
return result D
else if {Current MHV Record. ModcCode <> 15)
If {Current MHV Parameter in set {H20, 02W, 02D, 02CSD})
if {Current MHV Default Parameter is not null)
Current MHV Missing Data Fuel = "NFS"
if {Current MHV Parameter in set {02 W, 02D} AND Current MHVRecord .ModcCode == 20)
Current MHV Default Parameter = "02X"
Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = "NFS"
DefaultPurposeCode = "DC" // diluent cap
else
Count active MonitoringDefaultData record for location where
ParameterCode = Current MHV Default Parameter
FuelCode = "NFS"
DefaultPurposeCode = "MD" // missing data
if {count >1)
return result B
else if {{Current MHV Parameter == "02D" AND 02 Dry Checks Neededfor Heat Input == false) OR
{Current MHV Parameter == "02 W" AND 02 Wet Checks Neededfor 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. Default Value > 0)
Current MHV Max Min Value = Defau 11R ecord. D c fa u 11 Va 1 lie
else
return result D
If {Current MHV Component Type == "FLOW")
Current MHV Span Description = "FLOW"
Environmental Protection Agency
Page 527 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Monitor Span Record Count = Find active MonitoringSpanData records for location where
MonitoringSpanData .ComponentTypeCode = "FLOW"
else
Current MHVSpan 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 MHVMax Min Value = Current Monitor Span Record.DefaultHighRange
else
return result G
else if ((Current Monitor Span Record. DefaultHighRange is null AND Current MHV Record. ModcCode
not in set {13, 24}) or Current MHV Record. ModcCode == 12)
if (Current MHVRecord.ModcCode == 20)
if (CurrentMHVParameter == "FLOW")
if Current Monitor Span Record.FlowFullScaleRange > 0)
Current MHV Max Min Value = Current Monitor Span
i?ecor 0)
Current MHV Max Min Value = Current Monitor Span
Record. Fu 11 Sea 1 cRa ngc * 2
else
return result G
else
if (Current MHV Parameter == "FLOW")
if Current Monitor Span Record.MPF Value > 0)
Current MHV Max Min Value = Current Monitor Span
Record.MPFVdluQ
else
return result G
else
if Current Monitor Span Record. IVT PC Va 1 lie > 0)
Current MHV Max Min Value = Current Monitor Span
Record. IVT PC Va 1 lie
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
Environmental Protection Agency
Page 528 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
MonitoringSpanData .ComponentTypeCode = Current MHV Component Type AND
MonitoringSpanData.SpanScaleCode = "L"
if (Monitor Span Record Count > 1)
return result E
else if (Monitor Span Record Count = 0)
return result F
else
Current Monitor Span Record = the single matched record
if (Current MHV Record.ModcCode == 20)
if Current Monitor Span Record.FullScaleRange > 0)
Current MHV Max Min Value = Current Monitor Span
Record. Fu 11 Sea 1 cRa ngc * 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. MEC Value
else
return result G
else
if Current Monitor Span Record. Span Value > 0)
Current MHV Max Min Value = Current Monitor Span
Record. Span Value
else
return result G
Results:
Result
Response
Severity
A
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.
Critical Error
Level
B
You reported more than one applicable [param] Default record with a FuelCode of
[FuelCode] in your monitoring plan for the hour.
Critical Error
Level
C
You did not report an applicable [param] Default record with a FuelCode of
[FuelCode].
Critical Error
Level
D
The values reported in the applicable [param] Default record with a FuelCode of
[FuelCode] are invalid.
Critical Error
Level
E
You reported more than one active span record for [key] in your monitoring plan for
the hour.
Critical Error
Level
F
You did not report an active span record for [key] in your monitoring plan for the hour.
Critical Error
Level
G
The values reported in the applicable span record for [key] are invalid.
Critical Error
Level
Environmental Protection Agency
Page 529 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
8
Process/Category:
Emissions Data Evaluation Report
9
Process/Category:
Emissions Data Evaluation Report
C02 Concentration Monitor Hourly Evaluation
C02C Monitor Hourly Evaluation for Substitute Data
FLOW Monitor Hourly Evaluation
H20 Monitor Hourly Evaluation
NOx Concentration Monitor Hourly Evaluation
02 Dry Monitor Hourly Evaluation
02 Wet Monitor Hourly Evaluation
02C Monitor Hourly Evaluation for Substitute Data
S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 530 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-19
Check Name: Check Adjusted Hourly Value in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This checks ensures that AdjustedHourlyValue is valid and does not conflict with the reported MODC codes.
Specifications:
Monitor Hourly Adjusted Value Status = false
if (Monitor Hourly Mode Status == true AND Monitor Hourly Missing Data Status == true AND
(Monitor Hourly Pma Status == true OR Current MHV Record MoAcCods NOT in set {06, 07, 08, 09, 10, 11}))
If (Current MHV Parameter <> "NOXC" OR NOx Cone Neededfor Nox Mass Calc == true)
If (Current MHV Parameter == "FLOW")
set Current MHV Precision to -3.
else
set Current MHV Precision to 1.
case {Current MHV Record. ModcCode)
= 21: Current MHV Calculated Adjusted Value = 0
if {Current MHV Record. AdjustedHourlyValue == 0)
Monitor Hourly Adjusted Value Status = true
else
return result A
= 16: Current MHV Calculated Adjusted Value = 2
if {Current MHV Record. AdjustedHourlyValue == 2)
Monitor Hourly Adjusted Value Status = true
else
return result B
= 12 OR = 23:
If {Current MHV Max Min Value is not null)
Current MHV Calculated Adjusted Value = Current MHV Max Min Value
if {Current MHV Record. AdjustedHourlyValue == Current MHV Max Min Value)
Monitor Hourly Adjusted Value Status = true
else
return result C
= 13 OR 24:
If {Current MHV Max Min Value is not null)
Current MHV Calculated Adjusted Value = Current MHV Max Min Value
if {Current MHV Record. AdjustedHourlyValue == 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. AdjustedHourlyValue >= 0)
if ( Current MHV Record. AdjustedHourlyValue == Current MHV Calculated Adjusted Value)
Monitor Hourly Adjusted Value Status = true
Environmental Protection Agency
Page 531 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
return result G
else
return result H
else
If (Current M//K/?6'cwY/.AdjustcdHourly Value >= 0)
If (Current M//K/?6'cwY/.AdjustcdHourly Value is not rounded to CurrentMHVPrecision)
return result L
else
Current MHV Calculated Adjusted Value = Current MHV
wy/ . A dj u s t e d H o u r ly Va 1 lie
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. AdjustedHourlyValue > Current MHV Max Min Value * 2)
return result O
Otherwise,
return result K
Else
return result H
= 08 OR 09:
If {Current MHV Record. AdjustedHourlyValue >= 0)
If {Current MHV HBHA Value is not null AND Current MHV HBHA Value > Current MHV
Ttecon/.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. AdjustedHourlyValue is not rounded to Current MHV Precision)
return result L
else
Current MHV Calculated Adjusted Value = Current MHV
Record. AdjustedHourlyValue
Monitor Hourly Adjusted Value Status = true
If {Current MHV Max Min Value is not null)
if {Current MHV Record. AdjustedHourlyValue > Current MHV Max Min
Value)
If {Current MHV Parameter == "S02C" and Current MHV
Record. AdjustedHourlyValue > 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:
Environmental Protection Agency
Page 532 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
If (Current A///K/?ec«/Y/. Adjust cdHourly Value >= 0)
If (Current A///K/?ec«/Y/. Adjust cdHourly Value is not rounded to CurrentMHVPrecision)
return result L
else
Current MHV Calculated Adjusted Value = Current MH K . A dj u st cd Ho u r ly Va 1 lie
Monitor Hourly Adjusted Value Status = true
If (Current MHV Max Min Value is not null)
if {Current MHV Record. AA]v&tQdiiom\yValue > Current MHV Max Min Value)
If {Current MHV Parameter == "S02C" and Current MHV
Ttecon/.AdjustedHourlyValue > Current MHV Max Min Value * 2)
If the Current MHV Record.ModcCode == 10
return result P
Otherwise,
return result O
Otherwise,
return result K
Else
return result H
= All Other Codes:
If (Current M//K/?6'cwY/.AdjustedHourly Value >= 0)
f (Current MHV Record. ModcCode in set {19, 20} AND Current MHV
Ttecon/.UnadjustedHourly Value is null)
If {Current MHV Max Min Value is not null)
if {Current MHV Record. AdjustedHomly'Value== Current MHV Max Min Value)
Current MHV Calculated Adjusted Value = Current MHV
wy/ . A dj u s t e d H o u r ly Va 1 lie
Monitor Hourly Adjusted Value Status = true
else
if {Current MHV Record. ModcCode == "19")
return result M
else
return result N
else if (Current M//K/?6'cwY/.AdjustedHourly Value is not rounded to Current MHV Precision)
return result L
else
Monitor Hourly Adjusted Value Status = true
Else
return result H
else
If (Current M//K/?6'cwY/.AdjustedHourly Value is not null)
return result J
Environmental Protection Agency
Page 533 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
H
I
K
L
M
N
O
Response
You reported an MODCCode of 21 in the MHV record for [param], but the
AdjustedHourlyValue does not equal 0.
You reported an MODCCode of 16 in the MHV record for [param], but the
AdjustedHourly Value does not equal 2.
You reported an MODCCode of [modcCode] in the MHV record for [param], but the
AdjustedHourly Value does not equal the maximum potential value reported in the
[comptype] span or fuel-specific default record in your monitoring plan.
You reported an MODCCode of 13 or 24 in the MHV record for [param], but the
AdjustedHourly Value does not equal the maximum expected value reported in the
[comptype] span or fuel-specific default record in your monitoring plan.
You reported an MODCCode of 06 in the MHV record for [param], but the
AdjustedHourly Value does not equal average of measured hour before and measured
hour after.
The AdjustedHourly Value reported in the MHV record for [param] is invalid.
You reported an MODCCode of [MODCCode] in the MHV record for [param], but you
reported an AdjustedHourly Value that is less than the average of the measured hour
before and measured hour after.
You reported an AdjustedHourly Value in the MHV record for NOXC. This field
should be blank when the NOX concentration is used to calculate the NOX emission
rate as part of a NOX system.
Warning: The AdjustedHourly Value reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You should
investigate the cause of these exceedances and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported an MODCCode of 19 in the MHV record for [param], but the
AdjustedHourly Value does not equal the DefaultHighRange reported in the [comptype]
span record in your monitoring plan.
You reported an MODCCode of 20 in the MHV record for [param], but the
AdjustedHourly Value does not equal 200 percent of the FullScaleRange reported in the
[comptype] span record in your monitoring plan.
The AdjustedHourly Value reported in the MHV record for [param] is in excess of the
maximum value listed in the monitoring plan. Sources are required to periodically (at
least once annually) evaluate the appropriateness of these maximum values in the
monitoring plan and make proper adjustments when necessary. Adjustments may
include the need to update Span and/or Default values. You should investigate the
cause of these exceedances and determine whether adjustments to your monitoring
systems or monitoring plan are necessary.
The AdjustedHourly Value reported in the MHV record for [param] is in excess of the
maximum value listed in the monitoring plan. Sources are required to periodically (at
least once annually) evaluate the appropriateness of these maximum values in the
monitoring plan and make proper adjustments when necessary. Adjustments may
include the need to update Span and/or Default values. You should investigate the
cause of these exceedances and determine whether adjustments to your monitoring
systems or monitoring plan are necessary.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 2
Informational Message
Environmental Protection Agency
Page 534 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report FLOW Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report NOx Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 535 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-20
Check Name: Check Unadjusted Hourly Value in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This checks ensures that UnadjustedHourlyValue is valid and does not conflict with the reported MODC codes.
Specifications:
Monitor Hourly Unadjusted Value Status = false
if (Monitor Hourly Mode Status == true AND Monitor Hourly Missing Data Status == true AND
(Monitor Hourly Pma Status == true OR Current MHV Record MoAcCods NOT in set {06, 07, 08, 09, 10, 11}))
Calculated Unadjusted Value = null
case {Current MHV Record. ModcCode)
= 21: Calculated Unadjusted Value = 0
if (Current A///K/?6'cwy/. UnadjustedHourly Value == 0)
If {Current MHV Parameter == "C02C" and Current Hourly Op Record. LoadRange is greater than 1,
return result L
else
Monitor Hourly Unadjusted Value Status = true
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 A///K/?6'cwy/. UnadjustedHourly Value == Current MHV Max Min Value)
Monitor Hourly Unadjusted Value Status = true
else
return result B
= 20: If (Current MH VRecord. U n a dj u s t cd H o u r l y Va 1 lie >= 0)
If {Current MHV Max Min Value is not null)
If {Current MHV Parameter begins with "02" AND Current MH V Record. U n a dj u s t cd H o u r ly Va 1 lie >
20.9)
Calculated Unadjusted Value = Current MHV Max Min Value
return result K
else if Current MHV Parameter == "C02C" AND Current MH V Record. U n a dj u s t cd H o u r ly Va 1 lie >
Current MHV Max Min Value)
Calculated Unadjusted Value = Current MHV Max Min Value
return result C
elseif (Current MH V Record. U n a dj u s t cd H o u r ly Va 1 uc is not rounded to one decimal place)
return result I
else
Calculated Unadjusted Value = Current MH V Record. U n a dj u s t cd H o u r ly Va 1 uc
Monitor Hourly Unadjusted Value Status = true
else
return result E
= 06: If {Current MHVHBHA Value is not null)
Calculated Unadjusted Value = Current MHVHBHA Value
Environmental Protection Agency
Page 536 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (Current M//K/?6'cwY/.UnadjustcdHourly Value >= 0)
if ( Current M//K/?6'eMY/.UnadjustcdHourly Value == Calculated Unadjusted Value)
Monitor Hourly Unadjusted Value Status = true
else
return result D
else
return result E
else
If (Current M//K/?6'cwY/.UiiadjustedHourly Value >= 0)
If (Current MHVRecord.UnadjustedHourlyValue is not rounded to one decimal place)
return result I
else
Calculated Unadjusted Value = Current MH VRecord. U n a dj u s t cd H o u r l y Va 1 lie
Monitor Hourly Unadjusted Value Status = true
if (Current MHV Max Min Value is not null)
If ((Current MHV Parameter == "H20" AND H2() Missing Data Approach == 'MIN")
OR Current MHV Parameter begins with "02")
if (Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ < Current MHV Max Min
Value)
return result H
else
if (Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ > Current MHV Max Min
Value)
return result F
Else
return result E
= 08 OR = 09:
If (Current UnadjustedHourly Value >= 0)
If (Current MHV HBHA Value is not null AND ((Current MHV Parameter == "H20" AND H20 Missing Data
Approach == 'MIN") OR Current MHV Parameter begins with "02") AND Current MHV HBHA Value <
Current MHV Record. U n a dj u s t cd H o u r ly Va 1 lie)
Calculated Unadjusted Value = Current MHV HBHA Value
return result J
else if (Current MHV HBHA Value is not null AND ((Current MHV Parameter == "H20" AND H20 Missing
Data Approach == 'MAX") OR Current MHV Parameter does not begin with "02" or "H20") AND Current
MHV HBHA Value > Current M//K/?6'cmy/. UnadjustedHourly Value)
Calculated Unadjusted Value = Current MHV HBHA Value
return result G
else
if (Current MHV Record X5mdLiustQ(Mom\yVdlxiQ is not rounded to one decimal place)
return result I
else
Calculated Unadjusted Value = Current MH V Record. U n a dj u s t cd H o u r ly Va 1 lie
Monitor Hourly Unadjusted Value Status = true
if (Current MHV Max Min Value is not null)
If ((Current MHV Parameter == "H20" AND H2() Missing Data Approach == 'MIN")
OR Current MHV Parameter begins with "02")
if (Current MHV Record \]x\a&]v&tQd&{om\yVa[\iQ < Current MHV Max Min
Value)
Environmental Protection Agency
Page 537 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result H
else
if {Current MHVRecord.UnadjustedHourlyValue > Current MHVMax Min
Value)
return result F
Else
return result E
= 46:
If (Current A///K/?6'cwy/. UnadjustedHourly Value != null)
return result M
= All Other Codes:
If (Current A///K/?6'cwy/. UnadjustedHourly Value >= 0)
If {Current MHV Parameter in set {"H20", "C02C", "02D", "02W", "C02CSD", "02CSD"} AND Current
MH V Record U n a dj u s t cd H o u r l y Va 1 lie > 100)
return result E
else if {Current MHV Record AinaAiustQdiiomXyWaXuQ is not rounded to one decimal place)
return result I
else if (Current A///K/?6'cwy/. UnadjustedHourly Value == 0 AND Current MHV Parameter == "C02C" and
Current Hourly Op Record.LoadRange is greater than I,
return result L
else
Calculated Unadjusted Value = Current MH V Record. U n a dj u s t ed H o u r ly Va 1 lie
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. U nadjustedHourly Value < Current MHV Max Min Value)
return result H
else
if (Current MHV Record. U nadjustedHourly 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
02W: 02 Wet Calculated Adjusted Value = Calculated Unadjusted Value
02D: 02 Dry Calculated Adjusted Value = Calculated Unadjusted Value
H20: H20MHVCalculatedAdjusted Value = Calculated Unadjusted Value
C02CSD: C02C SD Calculated Adjusted Value = Calculated Unadjusted Value
02CSD: 02C SD Calculated Adjusted Value = Calculated Unadjusted Value
Environmental Protection Agency
Page 538 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
H
I
J
K
M
Response
You reported an MODCCode of 21 in the MHV record for [param], but the
UnadjustedHourlyValue does not equal 0.
You reported an MODCCode of [mode] in the MHV record for [param], but the
UnadjustedHourly Value does not equal the maximum potential value reported in the
[comptype] span or default record in your monitoring plan.
You reported an MODCCode of 20 in the MHV record for [param], but the
UnadjustedHourly Value does not equal 200 percent of the FullScaleRange reported in
the C02 span record in your monitoring plan.
You reported an MODCCode of 06 in the MHV record for [param], but the
UnadjustedHourly Value does not equal average of measured hour before and measured
hour after.
The UnadjustedHourly Value reported in the MHV record for [param] is missing or
invalid.
Warning: The UnadjustedHourly Value reported in the MHV record for [param] is in
excess of the maximum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these maximum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Span and/or Default values. You should
investigate the cause of these exceedances and determine whether adjustments to your
monitoring systems or monitoring plan are necessary.
You reported an MODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourly Value that is less than the average of the measured hour
before and measured hour after.
Warning: The UnadjustedHourly Value reported in the MHV record for [param] is
lower than the minimum value listed in the monitoring plan. Sources are required to
periodically (at least once annually) evaluate the appropriateness of these minimum
values in the monitoring plan and make proper adjustments when necessary.
Adjustments may include the need to update Default values. You should investigate
the cause of these low values and determine whether adjustments to your monitoring
systems or monitoring plan are necessary.
You reported [fieldname] in the [type] record for [param] that is not rounded to the
appropriate precision for that parameter.
You reported an MODCCode of [MODC] in the MHV record for [param], but you
reported an UnadjustedHourly Value that is greater than the average of the measured
hour before and measured hour after.
You reported an MODCCode of 20 in the MHV record for [param], but the
UnadjustedHourly Value does not equal the default value reported in the 02X default
record in your monitoring plan.
You have reported an UnadjustedHourly Value of 0 in the MHV record for [param], but
the LoadRange is greater than 1. Emissions for [param] should be greater than 0
when the unit (or stack) is operating at this load level.
You reported an UnadjustedHourly Value with a MODCCode of [MODC] in the MHV
record for [param], MODCCode [MODC] requires a null UnadjustedHourly Value.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Informational Message
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Environmental Protection Agency
Page 539 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report
2 Process/Category: Emissions Data Evaluation Report
3 Process/Category: Emissions Data Evaluation Report
4 Process/Category: Emissions Data Evaluation Report
5 Process/Category: Emissions Data Evaluation Report
6 Process/Category: Emissions Data Evaluation Report
C02 Concentration Monitor Hourly Evaluation
C02C Monitor Hourly Evaluation for Substitute Data
H20 Monitor Hourly Evaluation
02 Dry Monitor Hourly Evaluation
02 Wet Monitor Hourly Evaluation
02C Monitor Hourly Evaluation for Substitute Data
Environmental Protection Agency
Page 540 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-21
Check Name: Determine BAF Value for Monitoring System in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check retrieves and sets as an output parameter the Bias Adjustment factor for the Monitoring System
Specifications:
Current S02 System BAF = null
Current NOXC System BAF = null
Current FLOW System BAF = null
Continue = true
If {Current MHV Parameter == "NOXC")
If (NOx Cone Neededfor Nox Mass Calc == false)
Continue == false
If (Continue == true AND Monitor Hourly System Status == true AND Monitor Hourly Preadjusted Value Status == true AND {Current
MHV Record. ModcCodc in set {01, 02, 03, 17, 18, 22, 53} OR {Current MHV Record. ModcCode in set {19, 20} AND Current MHV
Record. U n a dj u s t ed H o u r 1 y Va 1 lie is not null AND Current MHV Max Min Value is not null)))
If {RATA Status BAF is not null)
case {Current MHV Parameter)
S02C: Current S02 System BAF = RATA Status BAF
NOXC: Current NOXC System BAF = RATA Status BAF
FLOW: Current FLOWSystem BAF = RATA Status BAF
else
return result A
Results:
Result Response Severity
A The BAF for [ParamCode] MonitoringSystemID [ID] cannot be determined, because Critical Error Level 1
the prior RATA had critical errors or because of a RATA Status error listed on this
report.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXC RATA Status Evaluation
2 Process/Category: Emissions Data Evaluation Report S02 RATA Status Evaluation
3 Process/Category: Emissions Data Evaluation Report Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 541 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-22
Check Name: Calculate Bias Adjusted Value in MHV Record
Related Former Checks:
Applicability: CEM Check
Description: This check ensures that the reported Unadjusted Hourly Value multiplied by the BAF results in the reported
Adjusted Hourly Value
Specifications:
case {Current MHV Parameter)
S02C: Current BAF = Current S02 System BAF
NOXC: Current BAF = Current NOXC System BAF
FLOW: CurrentBAF= 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 MH V Record. U n a dj u s t cd H o u r l y Va 1 lie * Current BAF, and the result to the nearest
1000.
else
Tolerance = Lookup Tolerance from Cross-Check Table "Hourly Emissions Tolerances" where
Parameter = Current MHV Parameter AND
UOM = "PPM"
Calculated Adjusted Value = Current MH V Record. U n a dj u s t cd H o u r ly Va 1 lie * Current BAF, and the result to one decimal
place (0.1).
If {Current MHVRecord .ModcCode in set {19, 20} AND Calculated Adjusted Value > Current MHVMax Min Value)
case {Current MHV Parameter)
S02C: S02C Calculated Adjusted Value = Current MHV Max Min Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Max Min Value
FLOW: FLOW Calculated Adjusted Value = Current MHV Max Min Value
if {Monitor Hourly Adjusted Value Status == true)
if {Current MHV Record. AdjustedHourlyValue <> Current MHV Max Min Value)
If {Current MHV Record.ModcCode == 20)
return result A
else
return result C
else
case {Current MHV Parameter)
S02C: S02C Calculated Adjusted Value = Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Calculated Adjusted Value
if {Monitor Hourly Adjusted Value Status == true)
if ABS {Calculated Adjusted Value - Current MHV Record. AdjustedHourlyValue) > Tolerance
return result B
case {Current MHV Parameter)
S02C: S02C Calculated Adjusted Value = Current MHV Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Calculated Adjusted Value
else
Environmental Protection Agency
Page 542 of 959
-------
ECMPS Emissions Check Specifications
FLOW: FLOW Calculated Adjusted Value = Current MHV Calculated Adjusted Value
3/4/2020 12:00:00AM
Results:
Result
A
B
C
Response
You reported an MODCCode of 20 in the MHV record for [param], but the
AdjustedHourly Value does not equal 200 percent of the FullScaleRange reported in the
[comptype] span record in your monitoring plan.
The AdjustedHourly Value reported in the MHV record for [param] is not equal to the
UnadjustedHourlyValue times the BAF for the [systype] MonitoringSystemID [ID],
You reported an MODCCode of 19 in the MHV record for [param], but the
AdjustedHourly Value does not equal the DefaultHighRange reported in the [comptype]
span record in your monitoring plan.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXC RATA Status Evaluation
2 Process/Category: Emissions Data Evaluation Report S02 RATA Status Evaluation
3 Process/Category: Emissions Data Evaluation Report Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 543 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-23
Check Name: Initialize C02C Hourly Monitor for Substitute Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for C02C for
substitute data when two C02C are submitted for the hour.
Specifications:
Current MHV Parameter = "C02CSD"
C02C SD Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report C02C Monitor Hourly Evaluation for Substitute Data
Environmental Protection Agency
Page 544 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-24
Check Name: Initialize 02C Hourly Monitor for Substitute Data
Related Former Checks:
Applicability: CEM Check
Description: This check sets generic parameter and output parameter for subsequent monitor hourly checks for 02C for
substitute data when two 02C with the same moisture basis are submitted for the hour.
Specifications:
Current MHV Parameter = "02CSD"
02C SD Calculated Adjusted Value = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report 02C Monitor Hourly Evaluation for Substitute Data
Environmental Protection Agency
Page 545 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-26
Check Name: Determine if MHV Record Needs QA Status Evaluation
Related Former Checks:
Applicability: CEM Check
Description: Determine if MHV Record Needs QA Status Evaluation
Specifications:
Set LinearityStatusRequired = false.
Set Current Linearity Status = null.
Set RATAStatusRequired = false.
Set Current RATA Status = null.
Set RATA StatusBAF = 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 = CurrentMH VRecord. Componcn11d
Set QaStatusComponentldentifier = CurrentMH VRecord. Componcn11dcnt i ficr
Set QaStatusComponentTypeCode = CurrentMHVRecord.ComponcnlTypcCodc
Set QaStatusSystemDesignationCode = CurrentMH VRecord. Systcm Dcsi gnat ionCode
Set QaStatusSystemld = CurrentMH VRecord. Sy stem Id
Set QaStatusSystemldentifier = CurrentMHVRecord. Sy stem Identi filer
Set QaStatusSystemTypeCode = CurrentMHVRecord.SyslcmTypcCodc
If (PrimaryBypassActiveForHour is false)
Set QaStatusPrimaryOrPrimaryBypassSystemld = null.
Else If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord is not null)
Set QaStatusPrimaryOrPrimaryBypassSystemld = Curr entNoxrPrimary OrPrimaryBypassMhvRecord. Systemld.
Else If ( CurrentNoxRateDerivedHourlyRecord is not null)
Count records in MonitorSystemComponentRecordsByHourLocation where:
1) Componentld equals QaStatusComponentld.
2) Systemld equals CurrentNoxRateDerivedHourlyRecord. Systemld.
If (count is greater than 0 )
Set QaStatusPrimaryOrPrimaryBypassSystemld = CurrentNoxRateDerivedHourlyRecord. Systemld.
Else
Set QaStatusPrimaryOrPrimaryBypassSystemld = null.
Else
Set QaStatusPrimaryOrPrimaryBypassSystemld = null.
Locate the record in MonitorSystemComponentRecordsByHourLocation with the earliest BeginDate/BeginHour and Componentld equal
to QaStatusComponentld.
If found,
Set QaStatusComponentBeginDate = MonitorSystemComponentRecordsByHourLocationBQgLinDatQ
Environmental Protection Agency
Page 546 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set QaStatusComponentBeginDatehour = MonitorSystemComponentRecordsByHourLocationBsgiviDatehom:
Else
Set QaStatusComponentBeginDate = null.
Set QaStatusComponentBeginDatehour = null.
if (Monitor Hourly Mode Status == true AND
(CurrentMHVRecord.ModcCode in set {01, 02, 03, 17, 18, 21, 22, 47, 53} OR
(CurrentMHVRecord.ModcCode in set {19, 20} AND CurrentMHVRecord. U n a dj u s t ed H o u r 1 y Va 1 lie is not null AND
Current MHVMax Min Value is not null)))
if (MonitorHourlyComponentStatus = true AND CurrentMHVRecord. Component ID is not null AND CurrentMH VParameter in
set {S02C, NOXC, C02C, 02D, 02W} )
Set LinearityStatusRequired = true.
Set DailyCalStatusRequired = true.
if {MonitorHourlyComponentStatus = true AND CurrentMHVRecord. Component ID is not null AND CurrentMH VParameter in
set {FLOW})
Set DailyCalStatusRequired = true.
Set Daily Int Status Required = true.
If SampleAcqiiistionMcthodCd = 'DP"
Set Leak Status Required = true.
if (MonitorHourlySystemStatus = true AND CurrentMHVRecord.MonitoringSystemID 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 ((C02 Cone Checks Needed for Heat Input == true AND CurrentMHVParameter == "C02C") OR (02 Wet Checks
Neededfor Heat Input == true AND CurrentMHVParameter == "02 W") OR (02 Dry Checks Needed for Heat Input == true
AND CurrentMHVParameter == "02D"))
Set C02RATARequired = true.
if (RATA Status Required == false AND CurrentMHVParameter in {S02C, NOXC, FLOW})
case (CurrentMHVParameter)
S02C: S02C Calculated Adjusted Value = Current MHV Calculated Adjusted Value
NOXC: NOXC Calculated Adjusted Value = Current MHV Calculated Adjusted Value
FLOW: FLOW Calculated Adjusted Value = Current MHV Calculated Adjusted Value
if (LinearityStatusRequired == true OR DailyCalStatusRequired == true)
Set DualRangeStatus = false.
Set CurrentAnalyzerRangeUsed = null.
Set ApplicableSystemlDs = null.
Set HighRangeComponentID = null.
Set LowRangeComponentID = null.
Environmental Protection Agency
Page 547 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (CurrentMHVParameter == "FLOW")
Set ApplicableComponentID = Current MHVRecord. ComponentID
else
Set ApplicableComponentID = 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
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.ComponenHypeCode and the
SpanScaleCode is equal to "L".
if (MonitorSpanRecordsByHourLocation is not found OR if more than one
MonitorSpanRecordsByHourLocation is found OR if the
MonitorSpanRecordsHyHourLocation. Sea 1 eTra nsi t i onPoi nt is null or <= 0)
set Linearity Status Required == false
set DailyCalStatusRequired = false
return result B
else if (MonitorSpanRecordsByHourLocation is found AND
CurrentMH VRecord. U n a d j u s t ed H o u r 1 y Va 1 lie >
MonitorSpanRecordsByHourLocation. ScaleTransitionPoint AND
CurrentMHVRecord.ModcCode <> "18")
Set CurrentAnalyzerRangeUsed = "H".
Set HighRangeComponentID = CurrentMH VRecord. Componcnt ID.
Set LowRangeComponentID = CurrentMHVRecord. Componcnt ID.
else
Set CurrentAnalyzerRangeUsed = "L".
Set HighRangeComponentID = CurrentMH VRecord. Componcnt ID.
Set LowRangeComponentID = CurrentMHVRecord. Componcnt ID.
else
Set CurrentAnalyzerRangeUsed =
AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode.
if (AnalyzerRangeRecordsByHourLocation.AnalyzerRangeCode = "H")
Environmental Protection Agency
Page 548 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location
where the ComponentTypeCode is equal to the
CurrentMH VRecord.ComponcnlTypcCodc and the AnalyzerRangeCode is equal to "L"
AND the ComponentSerialNumber is equal to the
CurrentMHVRecord.ComponcntScria 1Numbcr (removing the phrases "HIGH", "HI",
"LOW", and "LO").
if (AnalyzerRangeRecordsByHourLocation is not found OR if more than one
AnalyzerRangeRecordsByHourLocation is found)
set Linearity Status Required == false
set DailyCalStatusRequired = false
return result C
else If (AnalyzerRangeRecordsByHourLocation is found)
Set HighRangeComponentID = CurrentMH VRecord. Componcnt ID.
Set LowRangeComponentlD =
AnalyzerRangeRecordsByHourLocation. Component ID.
else if (CurrentMHVRecord. AnalyzerRangeCode = "L")
Locate a record in AnalyzerRangeRecordsByHourLocation for the
CurrentMH VRecord. Hour where the ComponentTypeCode is equal to the
CurrentMHVRecord. ComponentTypeCode and the AnalyzerRangeCode is equal to "H"
AND the ComponentSerialNumber is equal to the
CurrentMH VRecord .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)
Set LowRangeComponentlD = CurrentMHVRecord. Componcnt ID.
Set HighRangeComponentID =
AnalyzerRangeRecordsByHourLocation. Component ID.
Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation. AnalyzerRangeCode.
if (CurrentAnalyzerRangeUsed = "H")
Set HighRangeComponentID = CurrentMHVRecord. Component ID.
else
Set LowRangeComponentlD = CurrentMHVRecord. Component ID.
if (CurrentAnalyzerRangeUsed = "H")
Set ApplicableComponentID = HighRangeComponentID.
Environmental Protection Agency
Page 549 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set ApplicableComponentID = LowRangeComponentlD.
For each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the
ApplicableComponentID
Append MonitorSystemComponentRecordsByHourLocation.SystemlD to ApplicableSystemlDs.
if (MonitorSystemComponentRecordsByHourLocation is not found)
set Linearity Status Required == false
set DailyCalStatusRequired = false
return result D
Results:
Result
A
B
C
D
Response
You did not report one (and only one) valid Analyzer Range record in your monitoring
plan for ComponentID [COMPID] for this hour. The QA Status of the linearity and/or
daily calibration tests for this component will not be evaluated.
You reported that ComponentID [COMPID] is a dual-range analyzer, but 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 Q A
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 Q A Status of the linearity and/or daily calibration
tests for this component will not be evaluated.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOXR Unused P-PB Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 550 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-27
Check Name: Determine MHV Measure Code
Related Former Checks:
Applicability: CEM Check
Description:
Specifications:
If {Current MHV Parameter == "C02CSD")
Set Monitor Measure Code Array for "C02C" to "SUB"
else If {Current MHV Parameter == "02CSD")
Set Monitor Measure Code Array for "02D" to "SUB"
Set Monitor Measure Code Array for "02W" to "SUB"
else if {Current MHV Parameter in set {S02C, NOXC, C02C, 02D, 02W, FLOW, H20} AND Monitor Measure Code Array for the
Current MHV Parameter is null)
If {Current MHV Record. 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"
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— C02 Concentration Monitor Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— C02C Monitor Hourly Evaluation for Substitute Data
3
Process/Category:
Emissions Data Evaluation Report —
— FLOW Monitor Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— H20 Monitor Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— NOx Concentration Monitor Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— 02 Dry Monitor Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— 02 Wet Monitor Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— 02C Monitor Hourly Evaluation for Substitute Data
9
Process/Category:
Emissions Data Evaluation Report —
— S02 Monitor Hourly Evaluation
Environmental Protection Agency
Page 551 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-28
Check Name: Check Maximum Concentration Percentage Threshold
Related Former Checks:
Applicability: General Check
Description: Checks the percentage reported for C02C and 02C to ensure they do not exceed 16% and 22% respectively.
Specifications:
When CurrentMhvParameter equals
"C02C" or "C02CSD" then,
If CurrentMhvRecord.IVTodcCodc is equal to "01" or "02", AND CwrreMfMAvTtecon/.UnadjustedHourlyValue is greater
than 16%,
return result A.
"02D", "02W" or "02CSD" then,
If CurrentMh v Record. IVT odcCodc is equal to "01" or "02", AND CwrreMfMAvTtecon/.UnadjustedHourlyValue is greater
than 22%,
return result B.
Results:
Result
A
B
Usage:
1
2
3
4
5
Response Severity
The C02 concentration cannot exceed 16%. Informational Message
The 02 concentration cannot exceed 22%. Informational Message
Process/Category: Emissions Data Evaluation Report C02 Concentration Monitor Hourly Evaluation
Process/Category: Emissions Data Evaluation Report C02C Monitor Hourly Evaluation for Substitute Data
Process/Category: Emissions Data Evaluation Report 02 Dry Monitor Hourly Evaluation
Process/Category: Emissions Data Evaluation Report 02 Wet Monitor Hourly Evaluation
Process/Category: Emissions Data Evaluation Report 02C Monitor Hourly Evaluation for Substitute Data
Environmental Protection Agency
Page 552 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-29
Check Name: NOxR Primary/Primary Bypass: Initialization by Parameter Code
Related Former Checks:
Applicability: CEM Check
Description: Initializes check parameters based on the ParameterCode of the NOxR Primary/Primary Bypass MHV record.
Specifications:
Set CurrentMh v Record to Curr entNoxrPrimary OrPrimaryBypassMhvRecord.
Set CurrentMhvComponentType to null.
Set CurrentM1ivDefaultParame3ter to null.
Set CurrentMh v Parameter to null.
Set CurrentMhvParameterDescription to null.
Set CurrentMhvParameterStatus to false.
Set CompleteMhvRecordNeeded to false.
Set CurrentMhvFuelSpeciJicHour to false.
Set CurrentMh vHbHa Value to null.
Set CurrentMh vSystem Type to null.
Set MonitorHourlyModcStatus to true.
When Curr entNoxrPrimary OrPrimaryBypassMhvRecord ParameterCd equals
"C02C":
If ( Co2DiluentChecksNeededForNoxRateCalc is true)
Set CurrentMhvComponentType to "C02".
Set CurrentMhvDefaultParame3ter to "C02X".
Set CurrentMhvParameter to "C02C".
Set CurrentMhvParameterDescription to "C02C".
Set CurrentMhvParameterStatus to true.
Else
Return result B.
"NOXC":
Set CurrentMhvComponentType to "NOX".
Set CurrentMhvDefaultParame3ter to "NOCX".
Set CurrentMhvParameter to "NOXC".
Set CurrentMhvParameterDescription to "NOXC".
Set CurrentMhvParameterStatus to true.
"02C":
If ( 02DryChecksNeededForNoxrRateCalc is true) AND ( 02WetChecksNeededForNoxrRateCalc is NOT true)
Set CurrentMhvComponentType to "02".
Set CurrentMhvDefaultParame3ter to "02N".
Set CurrentMhvParameter to "02D".
Set CurrentMhvParameterDescription to "02 Dry".
Environmental Protection Agency
Page 553 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set CurrentMhvParameterStatus to true.
Else If ( 02DryChecksNeededForNoxrRateCalc is NOT true) AND ( 02WetChecksNeededForNoxrRateCalc is true)
Set CurrentMhvComponentType to "02".
Set CurrentMhvDefaultParame3ter to "02N".
Set CurrentMhvParameter to "02W".
Set CurrentMhvParameterDescription to "02 Wet".
Set CurrentMhvParameterStatus to true.
Else
Return result C.
Otherwise
Return result A.
Results:
Result
A
B
Response
MODC [modcCd] is invalid for MHV parameter [parameterCd].
You reported a [parameterCd] MHV record for MODC [modcCd], but [parameterCd] is
not required for NOXR.
You reported a [parameterCd] MHV record for MODC [modcCd], but [parameterCd] is
not required for NOXR.
Severity
Informational Message
Informational Message
C
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 554 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-30
Check Name: NOxR Primary/Primary Bypass: Component Check
Related Former Checks: HOURMHV-15
Applicability: CEM Check
Description: Validates the component for the MHV record.
Specifications:
Set MonitorHourlyComponentStatus to false.
Set MonitorHourlySystemStatus to false.
If ( CurrentMhvParameterStatus is true)
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord. Componentld is null)
Return result A.
Else If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.ComponentTypeCode does NOT equal CurrentMhvComponentType
)
Return result B.
Else
Set MonitorHourlyComponentStatus to true.
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.NotReportedNoxrSystemCount does NOT equal 1)
Return result C.
Else
Set MonitorHourlySystemStatus to true.
Results:
Result Response
A You did not reported a ComponentID in the MHV record for [parameterCd] and
MODC [modcCd],
B You reported [reportedComponentType] ComponentID [componentldentifier] in the
MHV record for [parameterCd] and MODC [modcCd], but a
[expectedComponentType] component is expected.
C You reported ComponentID [componentldentifier] in the MHV record for
[parameterCd] and MODC [modcCd]. This component was used to determine the
reported value in the NOx emission rate DHV record and therefore cannot report
MODC "47' or "48".
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Severity
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 555 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-31
Check Name:
NOxR Primary/Primary Bypass: Determine Maximum Allowed Parameter Value
Related Former Checks: HOURMHV-18
Applicability:
Description:
Specifications:
CEM Check
Determines the maximum value allowed value for C02C, NOXC or 02C for MODC 47.
Set CurrentMhvMaxMinValue to null.
Set CurrentNoxr PrimaryOr Primary BypassMhvMaxValueDescription to null
If ( CurrentMhvParameterStatus is true) AND ( Curr entNoxrPrimary OrPrimaryBypassMhvRecord .ModcCode equals "47" )
When CurrentMhvParameter equals
C02C":
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "C02 Span High Range".
If ( Curr entNoxr Primary Or Primary BypassMhvRecord Ri^aS^waCowt equals 0 )
Return result A.
Else If ( Curr entNoxr Primary Or Primary BypassMhvRecord Hi^aS^waCowt is gXQatQxXhan 1 )
Return result B.
Else
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecordMighSpanFullScaleRange is NOT null)
Set MaxValue to ( 2 *
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.YlighSpanFullScaleRange).
Else
Set MaxValue to null.
If (MaxValue is null) OR (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.HighSpanDefaultHighRange is not null and is
greater than Max Value)
Set MaxValue to
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.HighSpanDefaultHighRange.
If (MaxValue is NOT null AND is greater than 0 )
Set CurrentMhvMaxMinValue to MaxValue.
If ( Curr entNoxr Primary Or Primary BypassMhvRecord Ri^aS>^>anCo\mt equals 0 ) AND (
CurrentNoxr PrimaryOrPrimary BypassMhvRecord.LowSpanCounl equals 0 )
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "NOX Span".
Return result D.
Else If ( Curr entNoxr Primary Or Primary BypassMhvRecord Hi^aSpwaCowt is greater than 1) OR (
Curr entNoxrPrimary OrPrimaryBypassMhvRecord LowSpanCount is greater than 1)
If ( Curr entNoxr Primary Or Primary BypassMhvRecord Hi^aSpwaCowt is greater than 1) AND (
CurrentNoxr PrimaryOr Primary BypassMhvRecord.LowSpanCounl equals 0 )
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "NOX Span High
Range".
Else
Return result C.
'NOXC":
Environmental Protection Agency
Page 556 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.HighSpanCount equals 0 ) AND (
Curr entNoxrPrimary Or PrimaryBypassMhvRecord. LowSpanCount is greater than 1)
Set CurrentNoxr PrimaryOr Primary By passMhvMaxValueDescription to "NOX Span Low
Range".
Else
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "NOX Span".
Return result E.
Else
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecordHighSpanDefaultHighRange is not null)
Set CurrentNoxr PrimaryOr Primary By passMhvMaxValueDescription to "NOX Span Low
Range".
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.LowSpanFullScaleRange is NOT null)
Set MaxValue to ( 2 *
CurrentNoxr PrimaryOr Primary BypassMhvRecord.LowSpanFuWScMcRangc).
Else
Set MaxValue to null.
If (MaxValue is null) OR (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecordMighSpanDefaultHighRange is greater than
MaxValue)
Set CurrentNoxr PrimaryOr Primary By passMhvMaxValueDescription to "NOX Span
High Range".
Set MaxValue to
CurrentNoxrPrimaryOrPrimaryBypassMhvRecordMighSpanDefaultHighRange.
Else
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "NOX Span High
Range".
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecordMighSpanFullScaleRange is NOT null)
Set MaxValue to ( 2 *
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.VlighSpanFullScaleRange).
Else
Set MaxValue to null.
If (MaxValue is NOT null AND is greater than 0 )
Set CurrentMhvMaxMinValue to MaxValue.
Else
Return result F.
"02D" or "02W":
Set CurrentNoxrPrimaryOrPrimaryBypassMhvMaxValueDescription to "02C NFS Missing Data Default".
If ( Curr entNoxr Primary Or Primary BypassMhvRecord MaxDQfavAtComt equals 0 )
Return result G.
Else If ( Curr entNoxr Primary Or Primary BypassMhvRecord MaxDQfavAtComt is greater than 1)
Return result H.
Else
Set CurrentMhvMaxMinValue to CurrentNoxr PrimaryOr Primary BypassMh v Record. IVT a x Dc fa u 11 Va 1 lie.
Environmental Protection Agency
Page 557 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
F
G
H
Response
You did not report an applicable [description] record in your monitoring plan that is
active for the hour.
You reported more than one applicable [description] record in your monitoring plan
that is active for the hour.
The values reported in the applicable [description] record are invalid.
You did not report an applicable [description] record in your monitoring plan that is
active for the hour.
You reported more than one applicable [description] record in your monitoring plan
that is active for the hour.
The values reported in the applicable [description] record are invalid.
You did not report an applicable [description] record in your monitoring plan that is
active for the hour.
You reported more than one applicable [description] record in your monitoring plan
that is active for the hour.
Severity
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 558 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 2
Check Name:
Related Former Checks:
NOxRPrimary/Primary Bypass:Extraneous Data Check
Applicability:
Description:
CEM Check
Ensures that unexpected data is not reported.
Specifications:
Set CurrentMhvExtraneousFields to
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord. AdjustedHourlyValue is NOT null)
Append "AdjustedHourly Value" to CurrentMhvExtraneousFields.
If ( Curr entNoxrPrimary OrPrimaryBypassMhvRecord.MositureBasis is NOT null)
Append "MositureBasis" to CurrentMhvExtraneousFields.
If ( Curr entNoxr Primary Or PrimaryBypassMhvRecordMomtox'SystQmSD is NOT null)
Append "MonitorSystemID" to CurrentMhvExtraneousFields.
If ( Curr entNoxrPrimary OrPrimaryBypassMhvRecord.PercentAvailable is NOT null)
Append "PercentAvailable" to CurrentMhvExtraneousFields.
If ( CurrentMhvExtraneousFields does NOT equal"")
Return result A.
Results:
Result Response Severity
A You reported [extraneousFields] in the MHV record for [parameterCd] and MODC Informational Message
[modcCd]. This data should be blank.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 559 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 3
Check Name:
Related Former Checks:
NOxR Primary/Primary Bypass:Unadjusted Value Check
Applicability:
Description:
Specifications:
CEM Check
Checks the reported unadjusted hourly value.
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.VnadjustedRourlyYalue is null)
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord. ModcCode equals "47"
Return result A.
Otherwise
If ( Curr entNoxrPrimary OrPrimaryBypassMhvRecord .ModcCode equals "48" )
Return result B.
Else If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UnadjustedHourlyValue is less than 0.0 )
Return result C.
Else If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UnadjustedHourlyValue is NOT rounded to 1 decimal place)
Return result D.
Else If ( CurrentMhvParameter equals "C02C" ) AND (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UnadjustedHourlyValue is greater than 16.0 )
Return result E.
Else If ( CurrentMhvParameter in set ! "02D", "02W" ) AND (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UnadjustedHourlyValue is greater than 22.0 )
Return result F.
Else If ( CurrentMhvParameter equals "C02C" ) AND (
Curr entNoxr Primary Or Primary BypassMhvRecord AJnad)ViStQdAom\yNdlvLQ equals 0.0 ) AND (
CurrentHourlyOpRecord. LoadRa ngc is greater than 1)
Return result G.
Else If ( CurrentMhvMaxMinValue is NOT null) AND (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UnadjustedHourlyValue is greater than CurrentMhvMaxMinValue)
Return result H.
Environmental Protection Agency
Page 560 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
Usage:
1
Response
An UnadjustedHourlyValue is required for [parameterCd] with MODC [modcCd].
An UnadjustedHourly Value is not appropriate for [parameterCd] with MODC
[modcCd].
The reported UnadjustedHourly Value of [UnadjustedHourly Value] in the MHV record
with parameter [parameterCd] and MODC [modcCd] has a negative value.
The reported UnadjustedHourly Value of [UnadjustedHourly Value] in the MHV record
with parameter [parameterCd] and MODC [modcCd] is not rounded to one decimal
place.
The reported concentration of [UnadjustedHourly Value] in the MHV record with
parameter [parameterCd] and MODC [modcCd] cannot exceed 16%.
The reported concentration of [UnadjustedHourly Value] in the MHV record with
parameter [parameterCd] and MODC [modcCd] cannot exceed 22%.
The UnadjustedHourly Value of 0 was reported in the MHV record with parameter
[parameterCd] and MODC [modcCd], but the LoadRange is greater than 1.
Emissions for [parameterCd] should be greater than 0 when the unit (or stack) is
operating at this load level.
Warning: The reported UnadjustedHourly Value of [UnadjustedHourly Value] in the
MHV record with parameter [parameterCd] and MODC [modcCd] is in excess of the
maximum value listed in the monitoring plan. Sources are required to periodically (at
least once annually) evaluate the appropriateness of these maximum values in the
monitoring plan and make proper adjustments when necessary. Adjustments may
include the need to update Span and/or Default values. You should investigate the
cause of these exceedances and determine whether adjustments to your monitoring
systems or monitoring plan are necessary.
Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Severity
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 561 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-34
Check Name: NOxR Primary/Primary Bypass:Primary Bypass Active Check
Related Former Checks:
Applicability: CEM Check
Description: Ensures that an active Primary Bypass NOx system exists for the current loaction and hour.
Specifications:
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.PrimaryBypassExistslndicator does NOT equal 1)
Return result A.
Results:
Result Response Severity
A An MHV record for [parameterCd] with MODC [modcCd] was reported, but reporting Informational Message
MODC [modcCd] is only appropriate when a primary bypass system exists at the unit.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 562 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOURMHV-35
Check Name: NOxR Primary/Primary Bypass:Missing Expected MHV Records Check
Related Former Checks:
Applicability: CEM Check
Description: Indicates whether expected used and unused NOXC and diluent MHV records are missing.
Specifications:
Set CurrentMhvMissing to
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.PrimaryBypassExistslndicator equals 1)
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UsedNoxcCount equals 0 )
Append "Used NOXC" to CurrentMhvMissing.
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord\JsQ6Di\aQntCo\mt equals 0 )
Append "Used C02C/02C" to CurrentMhvMissing.
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord. UnusedNoxcCount equals 0 )
Append "Unused NOXC" to CurrentMhvMissing.
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UmisedDiluentCount equals 0 )
Append "Unused C02C/02C" to CurrentMhvMissing.
If ( CurrentMhvMissing does NOT equal"")
Return result A.
Results:
Result Response Severity
A A MHV record for NOXC or diluent (C02C/02C) included MODC "47" or "48", but Informational Message
[missingList] MHV was/were not reported. Reporting MODC "47" or "48" requires
the reporting of both a NOXC and diluent MHV with the same "unused" MODC,
either "47" or "48". It also requires the reporting of NOXC and diluent MHV that do
not contain MODC "47" or "48".
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 563 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 6
Check Name:
Related Former Checks:
NOxR Primary/Primary Bypass:Duplicate Expected MHV Records Check
Applicability:
Description:
CEM Check
Indicates whether multiple expected used and unused NOXC and diluent MHV records were reported.
Specifications:
Set CurrentMhvDuplicate to
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.PrimaryBypassExistslndicator equals 1)
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord. UsedNoxcCount is greater than 1)
Append "Used NOXC" to CurrentMhvDuplicate.
If ( Curr entNoxr Primary Or Primary BypassMhvRecord \JsQ6DilaQntCo\mt is greater than 1 )
Append "Used C02C/02C" to CurrentMhvDuplicate.
If ( Curr entNoxr Primary Or Primary BypassMhvRecord. UnusedNoxcCount is greater than 1)
Append "Unused NOXC" to CurrentMhvDuplicate.
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UmisedDiluentCount is greater than 1)
Append "Unused C02C/02C" to CurrentMhvDuplicate.
If ( CurrentMhvDuplicate does NOT equal"")
Return result A.
Results:
Result
A
A MHV record for NOXC or diluent (C02C/02C) included MODC "47" or "48", but
duplicate MHV records were reported for [duplicateList]. Reporting MODC "47" or
"48" requires the reporting of both a NOXC and diluent MHV with the same "unused"
MODC, either "47" or "48". It also requires the reporting of NOXC and diluent MHV
that do not contain MODC "47" or "48". However, only one record is required for
Response
Severity
Informational Message
each.
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 564 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 7
Check Name:
Related Former Checks:
NOxR Primary/Primary Bypass:Compare Unused MODC
Applicability:
Description:
CEM Check
Ensures that the unused MODC for NOXC and C02C/02C MHV are the same.
Specifications:
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.PrimaryBypassExistslndicator equals 1)
If ( Curr entNoxrPrimary Or PrimaryBypassMhvRecord. UnusedNoxcCount equals 1) AND (
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UmisedDiluentCount equals 1)
If ( CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UmisedNoxcModcCode does NOT equal
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.UmisedDiluentModcCode)
Return result A.
Results:
Result
A
Response
The MHV records for NOXC and a diluent (C02C/02C) reported MODC "47" or
"48", but did not report the same MODC which is required.
Severity
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 565 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 8
Check Name:
Related Former Checks:
NOxR Primary/Primary Bypass:Update Supplemental Counts
Applicability:
Description:
CEM Check
Performs System Op Supp Data (and QA Cert Event Supp Data) updates for the NOXR system that was not
reported.
Performs Component Op Supp Data (and QA Cert Event Supp Data) updates for the component reported in
the MODC 47 or 48 MHV record.
Performs Last QA Value Supp Data updates for the component reported in the MODC 47 record.
Specifications:
If DerivedHourlyChecksNeeded is true AND CurrentOperatingTime is greater than 0,
If (MonitorHourlySystemStatus equals true)
Perform the updates in HOUROP-48 for SystemOperatingSuppDataDictionaryArray with:
1) HourlyRecord.. Moni tori ngSystcm ID replaced by
CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.NotReportedNoxMonitonngSystemlD.
2) HourlyRecord. .ModcCode replaced by Curr entNoxrPrimary Or PrimaryBypassMhvRecord. ModcCode.
If (MonitorHourlySystemStatus equals true)
Perform the updates in HOUROP-49 for ComponentOperatingSuppDataDictionaryArray with:
1) HourlyRecord.. Component ID replaced by Curr entNoxrPrimary OrPrimaryBypassMhvRecord.ComponentlD.
2) HourlyRecord. .ModcCode replaced by Curr entNoxrPrimary OrPrimaryBypassMhvRecord ModcCode.
Perform the updates in HOUROP-50 for LastQaValueSuppDataDictionaryArray with:
1) HourlyRecord.. Moni tori ngSystcm ID replaced by null.
3) HourlyRecord.. ModcCode replaced by Curr entNoxrPrimary OrPrimaryBypassMhvRecord ModcCode.
4) Hourly Type Code set to "MONITOR".
5) MoistureBasis set to CurrentNoxr PrimaryOr Primary BypassMhvRecord.MoislurcBasis.
6) ComponentKey set to CurrentNoxr PrimaryOr Primary BypassMhvRecord.Componcnl\D.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB Monitor Hourly Evaluation
Environmental Protection Agency
Page 566 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOURMHV-3 9
Check Name:
Related Former Checks:
NOxR Primary/Primary Bypass:Set Not Reported NOXR QA Status Information
Applicability:
Description:
CEM Check
Sets the check parameters needed to perform RATA status checks for the "not reported" NOX system for
NOXR.
Specifications:
Set QaStatusComponentld to null.
Set QaStatusComponentldentifier to null.
Set QaStatusComponentTypeCode to null.
Set QaStatusHourlyParameterCd to "NOXR".
Set QaStatusSystemDesignationCode to CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.NotReportedSystemDesigmtionCode.
Set QaStatusSystemld to CurrentNoxr PrimaryOr Primary RypassMhvRecord.NolRcporlcdSxslcmid.
Set QaStatusSystemldentifier to CurrentNoxrPrimaryOrPrimaryBypassMhvRecord.NotReportedSystemldentifier.
Set QaStatusSystemTypeCode to CurrentNoxr PrimaryOr Primary RypassMhvRecord.NolRcporlcdSxslcmTxpcCodc.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report NOXR Unused P-PB NOX RATA Status Initialization
Environmental Protection Agency
Page 567 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Hourly Operating Data
Environmental Protection Agency
Page 568 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-1
Check Name: Validate Single Operating Data record for hour
Related Former Checks:
Applicability: CEM Check
Description: This check will count the number of HourlyOperatingData records to ensure the existence of one unique record
for the hour
Specifications:
Current Hourly Op Record = null
Unit Hourly Operational Status = false
Current Operating Time = null
Hourly Extraneous Fields = null
Count all HourlyOperatingData records with current MonitoringLocationID where
BeginHour = Current Hour AND
BeginDate = Current Date
If count == 0
Derived Hourly Checks Needed = false
if (Current Month is not April OR Annual Reporting Requirement == true)
If (Current Entity Type == "Unit" OR LME HI Method is null)
If (ReportingPeriod Operating == false AND Legacy Data Evaluation == true)
return result E
else
Locate Monitor Method records where the BeginDate/BeginHour is on or before the Current Date and
Hour, and the EndDate/EndHour is null or is on or after the Current Date and Hour.
If found
return result A
else if count > 1
if (Current Month is not April OR Annual Reporting Requirement == true)
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
Rpt Period HI Reported Accumulator Array for the location =-1
Rpt Period HI Calculated Accumulator Array for the location = -1
Rpt Period NOx Rate Reported Accumulator Array for the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Rpt Period Op Time Accumulator Array for the location = -1
Rpt Period Op Hours Accumulator Array for the location = -1
Daily Op Time Accumulator Array for the location = -1
Derived Hourly Checks Needed = false
return result B
else if (Current Entity Type <> "Unit" AND LME HI Method is not null)
Derived Hourly Checks Needed = false
return result D
else
Current Hourly Op Record = Unique HourlyOperatingData record
Current Operating Time = Current Hourly Op Record.OperatingTime
Environmental Protection Agency
Page 569 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
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
Environmental Protection Agency
Page 570 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 .0\~>cn\{\\\gY\mc
else
Daily Op Time Accumulator Array for this location = Current Hourly Op Record .0\~>cn\{\\\gY\mc
if (Last Day of Operation Array for the location is null OR is not equal to Current Date)
Last Day of Operation Array for the location = Current Date
if (Rpt Period Op Days Accumulator Array for this location is not null)
if {Rpt Period Op Days Accumulator Array for this location >= 0)
Rpt Period Op Days Accumulator Array for this location = Rpt Period Op Days
Accumulator + 1
else
Rpt Period Op Days Accumulator Array for this location = 1
If {Current Month is April)
if {April Op Days Accumulator Array for this location is not null)
April Op Days Accumulator Array for this location = April Op Days Accumulator + 1
else
April Op Days Accumulator Array for this location = 1
if {Current Entity Type= "Unit")
if {Unit OpTime Accumulator >= 0)
Unit OpTime Accumulator = Unit OpTime Accumulator + Current Hourly Op
Record. O pc ra t i n gTi mc
if Current Hourly Op Record .0\~>cn\{\\\gY\mc > Max Unit OpTime
Max Unit OpTime = Current Hourly Op Record .0\~>cn\{\\\gY\mc
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. O pc ra t i n gTi mc
if Current Hourly Op Ttecon/.OperatingTime > Max Stack OpTime
Max Stack OpTime = Current Hourly Op Ttecon/.OperatingTime
Results:
Result
A
B
C
D
Response
You did not report an Hourly Operating record for the hour.
You reported more than one Hourly Operating records for the hour. There will be no
further evaluation of the reported emissions data for this hour.
The OperatingTime reported in the Hourly Operating record is invalid. This value
must be between 0 and 1. There will be no further evaluation of the reported emissions
data for this hour.
You reported an invalid Hourly Operating record. Only the units in an LME
monitoring configuration should report this record. There will be no further evaluation
of the reported emissions data for this hour.
You did not report an Hourly Operating record for the hour. Although this was
acceptable for legacy data during a non-operating quarter, it is not allowed in ECMPS.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Fatal
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 571 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-2
Check Name: Count Flow, 02, and Heat Input records
Related Former Checks:
Applicability: CEM Check
Description: Determine the number of Stack Flow Monitor Hourly, H20 Monitor Hourly, H20 Derived Hourly, Heat Input
Derived Hourly, and 02 Wet and Dry Hourly Records for the current location and current hour
Specifications:
Flow Monitor Hourly Count = count of MonitorHourlyValueData records with parameter FLOW where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
02 Wet Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis = "W"
where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
02 Dry Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis = "D"
where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
02 Null Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "02C" AND MoistureBasis is NULL
where
Current Date = MonitorHourlyValueData.Date and
Current Hour = 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 DerivedHourlyValueData records with ParameterCode equal to "HI" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour
// 02 Needed To Support Heat Input = false
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 572 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-3
Check Name:
Related Former Checks:
Initialize Location Variables for the Hour
Applicability:
Description:
General Check
Looks up information about the current unit - initially whether or not it is a Peaking Unit
Specifications:
Current Unit Is Peaking = false
Current UnitlsARP = false
Special Fuel Burned = false
FC Factor Needed = false
FI) Factor Needed = false
FWFactor Needed = false
Moisture Needed = false
H20 Missing Data Approach = null
Flow Monitor Hourly Checks Needed = false
Flow Needed For Part 75 = false
Flow MHVOptionally Allowed = false
Current MHV Parameter = null
Current DHV Parameter = null
Current DHVRecord Valid = false
Current DHV Record = null
Current DHV Method = null
Current DHV System Type = null
Current DHVHBHA Value = null
CO2 Cone Checks Neededfor C02 Mass Calc = false
CO2 Cone Checks Needed for Heat Input = false
CO2 Diluent Checks 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
CO2 Diluent Neededfor MATS = false
CO2 Diluent Needed for MATS Calculation = false
02 Dry Needed for MATS = false
02 Dry Needed for MATS Calculation = false
02 Wet Needed for MATS = false
02 Wet Needed for MATS Calculation = false
Linearity Status Required = false
AppendixEStatusRequired = false
RATAStatusRequired = false
Current RATA Status = null
CurrentHourlyRecordforRATAStatus = null
RATAStatusBAF = null
Daily Cal Status Required = false
CO2 RATA Required = false
HI Measure Code = null.
NOXR Measure Code = null.
F2L Status Required = false
Daily Int Status Required = false
Leak Status Required = false
C02C MHVMODC = null
H20 DHV MODC = null
H20 MHV MODC = null
02 Dry MODC = null
Environmental Protection Agency Page 573 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
02 WetMODC = null
S02 HPFF Exists = false
C02 HPFF Exists = false
HI HPFF Exists = false
If the StackPipelD of the monitoring location begins with "CS",
set Current Entity Type = "CS"
else if the StackPipelD of the monitoring location begins with "CP",
set Current Entity Type = "CP"
else if the StackPipelD of the monitoring location begins with "MS",
set Current Entity Type = 'MS"
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 gMa/i?ecor 0
Current Unit Is Peaking = true
else if Current Entity Type = "CP"
find all entries in UnitStackConfiguration table where
UnitStackConfiguration.StackPipeId = the StackPipeld for this pipe
for each matching record
set Assoc Unit = UnitStackConfiguration.Unitld
Mon Qual Record Count = Find MonitorQualification Records by Hour where
MonitoringLocationld = Assoc Unit
Mon gMa/i?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If the located LocationProgramRecordsByHourLocation include a record where ProgramCode is equal to "MATS" and Class is
equal to "A", AND does NOT include a record where ProgramCode is NOT equal to "MATS" AND is in
ProgramRequiresSo2SystemCertificationList and Class is equal to "A",
Set So2cIsOnlyForMats to true.
Set EarliestLocationReportDate = CurrentMonitor Plan Location Record.EarUcslRcporlDalc
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 575 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-4
Check Name: Verify S02 Monitor Method Active During Current Hour
Related Former Checks:
Applicability: General Check
Description: This check tests to see if the "S02" Monitoring method is defined at this location. If so, this method is checked
to ensure that the current hour being evaluated is within the window defined by the start and end times for the
S02 method.
Specifications:
If (DerivedHourly Checks Needed)
SO2 Monitor Method Record = null
SO2 CEM Method Active For Hour = false
S02 App D Method Active For Hour = false
SO2 F23 Method Active For Hour = false
SO2 Method Code = null
SO2 Fuel Specific Missing Data = false
SO2 Bypass Code = null
SO2 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "S02" or "S02M"
if (S02 Method Count > 1)
return result A
else if SO2 Method Count == 1
SO2 Monitor Method Record = the single matched record
SO2 Method Code = S02 Monitor Method Record.MethodCode
if (LME HI Method is not null AND S02 Method Code <> "LME")
return result B
else
if (SO2 Monitor Method Record. SubDataCodc begins with "FSP75")
SO2 Fuel Specific Missing Data = true
SO2 Bypass Code = S02 Monitor Method Record. Bypass ApproachCodc
Expected Summary Value S02 Array for this location = true
if (S02 Monitor Method Record.MethodCode == "CEM")
SO2 CEM Method Active For Hour = true
else if S02 Monitor Method Record.MethodCode == "F23")
SO2 F23 Method Active For Hour = true
else if (S02 Monitor Method Record.MethodCode == "AD")
S02 App D Method Active For Hour = true
Results:
Result Response Severity
A You have reported more than one active S02 Method record in your monitoring plan Critical Error Level 1
for this hour.
B You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1
LME units.
Environmental Protection Agency
Page 576 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 577 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-5
Check Name: Determine H20 Method
Related Former Checks:
Applicability:
Description: The H20 Monitor Method must be known prior to category-level checks for H20 Derived and H20 Monitor
Specifications:
if Derived Hourly Checks Needed
H20 Method Code = null
H20 Default Value = null
H20 Default Max Value = null
H20 Default Mitt Value = null
Current Hourly H20 Table Reference = null
H20 Fuel Specific Missing Data = false
H20 Reported Value = null
H20 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "H20"
H20 Derived Hourly Count = count of DerivedHourly ValueData where ParameterCode = "H20" for current hour
H20 Monitor Hourly Count = count of MonitorHourly ValueData where ParameterCode = "H20" for current hour
if (H20 Method Count > 2
return result A
else if (H20 Method Count == 2)
If (H20 Derived Hourly Count + H20 Monitor Hourly Count > 0)
If (H20 Derived Hourly Count == 1 AND H20 Monitor Hourly Count ==0 AND the MethodCode in one of
the matched records is equal to "MWD")
Current Hourly H20 Table Reference = DerivedHourly ValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Tab Ie Refer en ce. A d j u s t ed Ho u r 1 y Va 1 lie
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 Tab Ie Refer en ee U11 a dj u s t cd H 0 u r 1 y Va 1 lie
if the MethodCode in the matched record == 'MMS"
H20 Method Code = 'MMS"
else
H20 Method Code = 'MTB"
else
return result A
else if H20 Method Count == 1
H20 Monitor Method Record = the single matched record
H20 Method Code = H20 Monitor Method Record.MethodCode
if (H20 Monitor Method Record. SubDataCode begins with "FSP75")
H20 Fuel Specific Missing Data = true
if (H2() 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)
Environmental Protection Agency
Page 578 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Current Hourly H20 Table Reference = DerivedHourlyValueData where ParameterCode =
"H20"
H20 Default Max Value = Highest Default Value field from active MonitoringDefaultData record for
location where ParameterCd = 'H20'
H20 Default Min Value = Lowest Default Value field from active MonitoringDefaultData record for
location where ParameterCd = 'H20'
If (H20 Default Max Value <= 0 OR H20 Default Min Value <= 0 OR H20 Default Max Value >=
100 OR H20 Default Min Value >= 100)
return result C
H20 Default Value = Default Value field from active MonitoringDefaultData record for location where
ParameterCd = 'H20'
If (H2() Default Value <= 0 OR H20 Default Value >= 100)
return result C
else if (H20 Method Code == "MWD")
if (H20 Derived Hourly Count == 1)
Current Hourly H20 Table Reference = DerivedHourlyValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Tab Ie Refer en ce. A d j u s t ed Ho u r 1 y Va 1 lie
else if (H2() Method Code == "MMS" OR H20 Method Code == "MTB")
if (H20 Monitor Hourly Count == 1)
Current Hourly H20 Table Reference = MonitorHourlyValueData where ParameterCode = "H20"
H20 Reported Value = Current Hourly H20 Tab Ie Refer en ee U11 a dj u s t cd H 0 u r 1 y Va 1 lie
else
Results:
Result
A
Response
You have reported more than one active H20 Method record in your monitoring plan
for this hour.
You reported an H20 MethodCode of MDF, but you did not report an active H20
default record in your monitoring plan for the hour.
The Default Value reported in the active H20 default record in your monitoring plan is
invalid.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 579 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-6
Check Name: Verify NOx Rate Monitor Method
Related Former Checks:
Applicability:
Description:
Specifications:
If (DerivedHourly Checks Needed)
NOx Rate Bypass Code = null
NOx Rate Fuel Specific Missing Data = false
Current NOx Rate Monitor Method Record = null
Current NOx Rate Method Code = null
NOx Rate Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "NOXR"
if (NOx Rate Method Count > 1)
return result A
else if NOx Rate Method Count == 1
if (LME HI Method is not null)
return result B
else
Current NOx Rate Monitor Method Record = the single matched record
Current NOx Rate Method Code = Current NOx Rate Monitor Method McthodCodc
NOx Rate Bypass Code = Current NOx Rate Monitor Method Record. By pa s s A p p roa c h Code
if (Current NOx Rate Monitor Method Record. SubDataCode begins with "FSP75")
NOx Rate Fuel Specific Missing Data = true
If (Current Unit isARP == true)
Expected Summary Value NOx Rate Array for this location = true
General Check
This check tests to see if the "NOx Rate" Monitoring method is defined at this location. If so, this method is
checked to ensure that the current hour being evaluated is within the window defined by the start and end
times for the NOx method.
Results:
Result Response Severity
A You reported more than one active NOXR Method record in your monitoring plan for Critical Error Level 1
this hour.
B You reported a [param] method, which is not valid for a location that is part of a Critical Error Level 1
configuration of LME units.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 580 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-7
Check Name: Verify NOx Mass Monitor Method Record
Related Former Checks:
Applicability: CEM Check
Description: Finds the Monitor Method record for NOx Mass and stores it for later reference
Specifications:
If (DerivedHourly Checks Needed)
Current NOx Mass Monitor Method Record = null
NOx Mass Method Active For Hour = false
NOx Mass Monitor Method Code = null
NOx Mass Bypass Code = null
NOx Mass Fuel Specific Missing Data = false
NOx Mass Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "NOX" or "NOXM"
if (NOx Mass Method Count > 1)
return result A
else if NOx Mass Method Count == 1
Current NOx Mass Monitor Method Record = the single matched record
NOx Mass Monitor Method Code = NOx Mass Monitor Method McthodCodc
if (LME HI Method is not null AND NOx Mass Monitor Method Code <> "LME")
return result B
else
Expected Summary Value NOx Mass Array for this location = true
NOx Mass Bypass Code = Current NOx Mass Monitor Method Ttecon/.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
Results:
Result Response Severity
A You reported more than one active NOX Method record in your monitoring plan for Critical Error Level 1
this hour.
B You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1
LME units.
Environmental Protection Agency
Page 581 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 582 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-8
Check Name: Verify C02 Method Active During Current Hour
Related Former Checks:
Applicability: CEM Check
Description: Looks in the MonitoringMethod table to verily that a C02 Mass Monitoring Method is active for the current
hour at the current location
Specifications:
If (DerivedHourly Checks Needed)
C02 Monitor Method Record = null
CO 2 CEM Method Active For Hour = false
CO 2 App D Method Active For Hour = false
CO2 Fuel Specific Missing Data = false
CO2 Method Code = null
// AD and CEMs are possible method codes
CO2 Method Count = Active records in MonitoringMethodData for the location where
ParameterCode = "C02" or "C02M"
if (CO2 Method Count > 1)
return result A
else if CO2 Method Count == 1
CO2 Monitor Method Record = the single matched record
CO 2 Method Code = C02 Monitor Method Record. MethodCode
if {LME HI Method is not null and CO 2 Method Code is not equal to "LME")
return result B
else
if (Current C02 Monitor Method Record.SubDataCode begins with "FSP75")
CO2 Fuel Specific Missing Data = true
if (C02 Monitor Method Record. MclhodCodc == "CEM")
CO 2 CEM Method Active For Hour = true
else if (C02 Monitor Method Record.MethodCode == "AD")
CO 2 App D Method Active For Hour = true
Expected Summary Value C02 Array for this location = true
Results:
Result Response Severity
A You have reported more than one active C02 Method record in your monitoring plan Critical Error Level 1
for this hour.
B You reported an invalid [param] method for a location that is part of a configuration of Critical Error Level 1
LME units.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 583 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-9
Check Name:
Related Former Checks:
Verify Heat Input Method Active During Current hour
Applicability:
Description:
General Check
Verifies that a single method is defined for Heat Input during the Current Hour
Specifications:
If (DerivedHourly Checks Needed)
Heat Input Monitor Method Record = null
Heat Input Fuel Specific Missing Data = false
Heat Input Method Code = null
Heat Input CEM Method Active For Hour = false
Heat Input App D Method Active For Hour = false
Heat Input Method Count = Active records in MonitoringMethodData for the location where
ParameterCode begins with "HI"
if {Heat Input Method Count > 1)
return result A
else if (LME HI Method is not null AND (Heat Input Method Count ==0 OR ParameterCode in the matched record is not equal
to "HIT"))
return result B
elseif {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 Ttecon/. SubDataCode begins with "FSP75")
Heat Input Fuel Specific Missing Data = true
if {Heat Input Monitor Method Record-MsthodCods == "CEM")
Heat Input CEM Method Active For Hour = true
elseif {Heat Input Monitor Method Record-MsthodCode == "AD" OR Heat Input Monitor Method
Record. MethodCode == "ADCALC")
Heat Input App D Method Active For Hour = true
If {Heat Input Monitor Method Ttecon/. 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
Results:
Result
A
You have reported more than one active HI Method record in your monitoring plan for Critical Error Level 1
this hour.
You did not report an HIT Method record for this location in your monitoring plan, Critical Error Level 1
which is required for all locations that are part of a configuration of LME units.
Response
Severity
B
Environmental Protection Agency
Page 584 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 585 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-17
Check Name: Verify Single S02 Derived Hourly Data Record
Related Former Checks:
Applicability: CEM Check
Description: This check scans the DerivedHourlyValueData records to ensure that a single record containing S02 derived
values is reported for the current hour
Specifications:
If {DerivedHourly Checks Needed == true)
S02 Derived Checks Needed = false
S02MDerived Checks Needed = false
Current S02 Derived Hourly Record = null
F23 Default Max Value = null
F23 Default Min Value = null
F23 Default Value = null
S02 Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "S02" or "S02M" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 0
If (SO2 DerivedHourly Count == 0 AND SO2 Method Code is not null)
If (S02 Method Code == "AD")
If (Hourly Fuel Flow Count for Gas + Hourly Fuel Flow Count for Oil > 0)
return result A
else
return result A
Else if (SO2 DerivedHourly 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 DerivedHourly 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 DerivedHourly Count > 0 AND SO2 Method Code == "AD" AND Hourly Fuel Flow Count for Gas +
Hourly Fuel Flow Count for Oil == 0)
Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result G
Else if {SO2 DerivedHourly Count == 1)
Current S02 DerivedHourly Record = DerivedHourlyValueData rec matching with param S02 or S02M
where Current Date = DerivedHourlyValueData.Date and Current Hour = DerivedHourlyValueData.Hour
If {LME HI Method is not null)
If (S02 Method Code == "LME")
If {Current S02 DerivedHourly Record.ParameterCode == "S02M")
S02MDerived Checks Needed = true
else
Rpt Period S02 Mass Reported Accumulator Array for the location = -1
Rpt Period S02 Mass Calculated Accumulator Array for the location = -1
return result H
else
Environmental Protection Agency
Page 586 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
S02 Derived Checks Needed = true
If (S()2 Method Code in set {CEMF23,AMS})
if (S()2 Method Code == "CEMF23")
SO2 CEM Method Active For Hour = true
if (Current S02 Derived Hourly Record. Formu 1 a Idcn t i ficr is not null)
S02 Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = Current S02 DerivedHourly
Record. F ormulaldentifier
If (S02 Formula Record is not null)
If (S02 Formula Record.ParameterCode == "S02")
if (S()2 Method Code == "CEMF23")
If (S02 Formula Record.EquationCode == "F-23")
SO2 F23 Method Active For Hour = true
SO2 CEM Method Active For Hour = false
if (S()2 Method Code == "AMS")
If (S02 Formula Record.EquationCode in set
{F-l,F-2})
S02 Method Code == "CEM"
SO2 CEM Method Active For Hour = true
If {SO2 F23 Method Active For Hour == true)
F23 Default Record Count = count active MonitoringDefaultData Records for the
location where ParameterCd = 'S02R' and DefaultPurposeCd = 'F23'
if (F23 Default Record Count == 0)
return result D
else if (F23 Default Record Count > 1)
F23 Default Max Value = Highest Default Value field from active
MonitoringDefaultData record for location where ParameterCd = 'S02R' and
DefaultPurposeCd = 'F23'
F23 Default Min Value = Lowest Default Value 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
Environmental Protection Agency
Page 587 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
F23 Default Value = Default Value field from active MonitoringDefaultData
record for location where ParameterCd = 'S02R' and DefaultPurposeCd = 'F23'
If (F23 Default Value <= 0)
return result E
else
If SO2 Derived Hourly Count > 0
Return result F
Results:
Result
A
B
C
D
E
F
G
H
Usage:
1
Response
You did not report a DHV record for S02 (or S02M) for the hour.
You reported a DHV record for S02 (or S02M), but you did not report an active S02
method record in your monitoring plan for the hour.
You reported more than one DHV records for S02 (or S02M) for the hour.
You did not report an active S02R default record in your monitoring plan for use in
F23 calculation for the hour.
The Default Value reported in the active S02R F23 default record in your monitoring
plan is invalid.
You reported a DHV record for S02 (or S02M), but this is not appropriate for a
non-operating hour.
You reported a DHV record for [param], but you did not report any Hourly Fuel Flow
records at the location.
The ParameterCode reported in the DHV record does not match the ParameterCode in
the Method record in your monitoring plan used to determine [eparam].
Process/Category: 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
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 588 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-18
Check Name: Verify Single S02 Concentration record
Related Former Checks:
Applicability: CEM Check
Description: Counts all S02 Concentration records (MonitorHourlyValueData records with "S02C" ParameterCode) for the
current hour and outputs appropriate responses if count does not match expectations
Specifications:
Current S02 Monitor Hourly Record = null
SO2 Monitor Hourly Count = count of MonitorHourlyValueDate 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)
Return result A
Else if (SO2 Monitor Hourly Count >1)
Return result B
Else if (S02 Monitor Hourly Count ==1)
Current S02 Monitor Hourly Record = MonitorHourlyValueData rec with param S02C where
CurrentDate = MonitorHourlyValueData.Date and
CurrentHour = MonitorHourlyValueData.Hour
Else
if (SO2 Monitor Hourly Count > 0)
return result C
Results:
Result
A
B
C
Response
You reported an MHV record for S02C, but you did not report an active S02 method
record in your monitoring plan for the hour.
You reported more than one MHV record for S02C for the hour.
You reported an MHV record for S02C, but this is not appropriate for a non-operating
hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 589 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-19
Check Name: Verify Single NOx Concentration Record
Related Former Checks:
Applicability:
Description:
Specifications:
Current NOx Cone Monitor Hourly Record = null
NOx Cone Monitor Hourly Count = count of MonitorHourly ValueDate records with param "NOXC" where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourlyValueData.Hour
if Unit Hourly Operational Status = true
if (NOx Cone Monitor Hourly Count >1)
Return result A
Else if (NOx Cone Monitor Hourly Count ==1)
If (NOx Mass Monitor Method Code in {CEM, CEMNOXR, AMS} OR Current NOx Rate Method Code in
{CEM,AMS})
Current NOx Cone Monitor Hourly Record = MonitorHourly ValueData rec with param "NOXC" where
CurrentDate = MonitorHourlyValueData.Date and
CurrentHour = MonitorHourlyValueData.Hour
else
return result B
Else
if (NOx Cone Monitor Hourly Count > 0)
return result C
CEM Check
Counts all NOx Rate Concentration records (MonitorHourlyValueData records with "NOXR" ParameterCode)
for the current hour and outputs appropriate responses if count does not match expectations
Results:
Result
A
B
C
Response
You reported more than one MHV record for NOXC for the hour.
You reported an MHV record for NOXC, but you did not report an appropriate NOXR
or NOX method record in your monitoring plan for the hour.
You reported an MHV record for NOXC, but this is not appropriate for a non-operating
hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 590 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-20
Check Name: Verify Single NOx Rate Derived Hourly Record
Related Former Checks:
Applicability: CEM Check
Description: This check scans the DerivedHourlyValueData records to ensure that a single record containing S02 derived
values is reported for the current hour
Specifications:
Current NOXR Derived Hourly Record = null
NOXR Derived Hourly Checks Needed = null
NOXR Derived Hourly Count = null
NOXR Has Measured DHVMODC = null
If {DerivedHourly Checks Needed == true)
NOx Rate Derived Checks Needed = false
NOx Rate Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "NOXR" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 0
If (NOx Rate Derived Hourly Count ==0 AND Current NOx Rate Method Code is not null)
Return result A
Else if (NOx Rate Derived Hourly Count > 0 AND Current NOx Rate Method Code is NULL)
Rpt Period NOx Rate Reported Accumulator Array for the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Return result B
Else if {NOx Rate Derived Hourly Count >1)
Rpt Period NOx Rate Reported Accumulator Array for the location = -1
Rpt Period NOx Rate Calculated Accumulator Array for the location = -1
Return result C
Else if {NOx Rate Derived Hourly Count == 1)
Current NOx Rate Derived Hourly Record = DerivedHourlyValueData rec matching param NOXR
NOx Rate Derived Checks Needed = true
Apportionment NOXR Method Array at this location = Current NOx Rate Method Code
NOXR Has Measured DHV MODC = ( Current NOx Rate Derived Hourly Record. MODCCode in set {01, 02,
03, 04, 05, 14,21,22,53, 54 })
If {Current NOx Rate Method Code== "AMS")
if {Current NOx Rate Derived Hourly . Fo r m u 1 a I dc n t i fi c r is null)
if Current NOx Rate Derived Hourly Record .MODCCode is not null)
Current NOx Rate Method Code = "CEM"
else
NOXR Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = Current NOx Rate Derived Hourly
Record. F ormulaldentifier
If (NOXR Formula Record is not null)
If (NOXR Formula Record.ParameterCode == "NOXR" AND NOXR Formula
Record.EquationCode in set
{F-5,F-6,19-1,19-2,19-3,19-3D, 19-4,19-5,19-5D, 19-6,19-7,19-8,19-9 })
Current NOx Rate Method Code = "CEM"
Environmental Protection Agency
Page 591 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
If NOx Rate Derived Hourly Count > 0
Return result D
Results:
Result
A
B
C
D
Response
You did not report a DHV record for NOXR for the hour.
You reported a DHV record for NOXR, but you did not report an active NOXR method
record in your monitoring plan for the hour.
You reported more than one DHV record for NOXR for the hour.
You reported a DHV record for NOXR, but this is not appropriate for a non-operating
hour.
This check result is obsolete.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
No Errors
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 592 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-21
Check Name:
Related Former Checks:
Verify Single NOx Mass Derived Hourly Record
Applicability:
Description:
CEM Check
Counts number of NOx Mass DerivedHourly Value records active during the current hour and compares this
count with the Monitor Method records indicating the need for this data
Specifications:
If (DerivedHourly Checks Needed == true)
NOx Mass Derived Checks Needed = false
NOXMDerived Checks Needed = false
Current NOx Mass Derived Hourly Record = null
NOx Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode = "NOX" or "NOXM" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 0
If (NOx Mass Derived Hourly Count ==0 AND (NOx Mass Method Active For Hour == true OR NOx Mass Monitor
Method Code == "LME"))
Return result A
Else if (NOx Mass Derived Hourly Count > 0 AND NOx Mass Method Active For Hour == false AND NOx Mass
Monitor Method Code <> "LME")
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Return result B
Else if {NOx Mass Derived Hourly Count >1)
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
Return result C
Else if {NOx Mass Derived Hourly Count > 0 AND Current NOx Rate Method Code == "AE" AND Hourly Fuel
Flow Count for Gas + Hourly Fuel Flow 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 =
DerivedHourlyValueData.Hour
If {LME HI Method is not null)
If {NOx Mass Monitor Method Code== "LME")
if {Current NOX Mass Derived Hourly Record. ParameterCode == "NOXM")
NOXM Derived Checks Needed = true
else
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
return result F
else
Rpt Period NOx Mass Reported Accumulator Array for the location = -1
Environmental Protection Agency
Page 593 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Rpt Period NOx Mass Calculated Accumulator Array for the location = -1
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
NOx Mass Derived Checks Needed = true
If (NOx Mass Monitor Method Code in set {AMS, CEMNOXR})
If (NOx Rate Derived Hourly Count > 0)
NOx Mass Monitor Method Code = "NOXR"
Else if (NOx Mass Monitor Method Code == "CEMNOXR")
NOx Mass Monitor Method Code== "CEM"
Else if (Current NOx Mass Derived Hourly Formu 1 a Idcn t i ficr is not null)
NOX Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = Current NOx Mass Derived Hourly
Record. F ormulaldentifier
If (NOX Formula Record is not null)
Apportionment NOX Method Array at this location = NOx Mass Monitor Method Code
else
If (NOX Formula Record.ParameterCode == "NOX" AND NOX
Formula Record.EquationCode in set {F-26A,F-26B})
NOx Mass Monitor Method Code= "CEM"
else
If NOx Mass Derived Hourly Count > 0
Return result D
Results:
Result
A
B
Response
You did not report a DHV record for NOX (or NOXM) for the hour.
You reported a DHV record for NOX (or NOXM), but you did not report an active
NOX (or NOXM) method record in your monitoring plan for the hour.
You reported more than one DHV record for NOX (or NOXM) for the hour.
You reported a DHV record for NOX (or NOXM), but this is not appropriate for a
non-operating hour.
You reported a DHV record for [param], but you did not report any Hourly Fuel Flow
records at the location.
Severity
Critical Error Level 1
Critical Error Level 1
C
D
Critical Error Level 1
Critical Error Level 1
E
Critical Error Level 1
F
The ParameterCode reported in the DHV record does not match the ParameterCode in Critical Error Level 1
the Method record in your monitoring plan used to determine [eparam].
Environmental Protection Agency
Page 594 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 595 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-22
Check Name: Verify Single C02 Mass Derived Hourly Value Record
Related Former Checks:
Applicability: CEM Check
Description: Verifies that exactly ONE Derived Hourly Value record exists for the current hour associated with C02 Mass
Specifications:
If {DerivedHourly Checks Needed == true)
CO 2 Mass Derived Checks Needed = false
Current C02 Mass Derived Hourly Record = null
C02MDerived Checks Needed = false
C02 Mass Derived Hourly Count = count of DerivedHourly ValueData records with ParameterCode beginning with " C02" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 0
If (CO2 Mass Derived Hourly Count == 0 AND CO2 Method Code is not null AND CO2 Method Code <> "FSA")
If (C()2 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 (C02 Mass Derived Hourly Count > 0 AND (CO 2 Method Code is null OR C02 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 (C02 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 (C()2 Mass Derived Hourly Count > 0 AND CO2 Method Code == "AD" AND Hourly Fuel Flow Count for
Gas + Hourly Fuel Flow Count for Oil == 0)
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
Return result E
Else if (CO2 Mass Derived Hourly Count == 1)
Current C02 Mass Derived Hourly Record = DerivedHourly ValueData rec matching with param C02 or
C02M where Current Date = DerivedHourly ValueData.Date and Current Hour =
DerivedHourlyValueData.Hour
If (LME HI Method is not null)
If (C02 Method Code == "LME")
if {Current C02 Mass Derived Hourly Record. ParameterCode == "C02M")
C02MDerived Checks Needed = true
else
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
return result F
else
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
else
if {Current C02 Mass Derived Hourly Record. ParameterCode == "C02M")
Environmental Protection Agency
Page 596 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Rpt Period C02 Mass Reported Accumulator Array for the location = -1
Rpt Period C02 Mass Calculated Accumulator Array for the location =-1
return result F
else
CO 2 Mass Derived Checks Needed = true
If (C()2 Method Code == "AMS")
if (Current C02 Mass Derived Hourly Record. Formu 1 a Idcn t i ficr is not null)
C02 Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = 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"
CO 2 CEM Method Active For Hour = true
Else
If CO2 Mass Derived Hourly Count > 0
Return result D
Results:
Result Response Severity
A You did not report a DHV record for C02 (or C02M) for the hour. Critical Error Level 1
B You reported a DHV record for C02 (or C02M), but you did not report an active C02 Critical Error Level 1
(or C02M) method record in your monitoring plan for the hour.
C You reported more than one DHV records for C02 (or C02M) for the hour. Critical Error Level 1
D You reported a DHV record for C02 (or C02M), but this is not appropriate for a Critical Error Level 1
non-operating hour.
E You reported a DHV record for [param], but you did not report any Hourly Fuel Flow Critical Error Level 1
records at the location.
F The ParameterCode reported in the DHV record does not match the ParameterCode in Critical Error Level 1
the Method record in your monitoring plan used to determine [eparam].
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 597 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-23
Check Name:
Related Former Checks:
Verify C02 Cone Derived and Monitor Hourly Data Record
Applicability:
Description:
CEM Check
This check scans the DerivedHourlyValueData and MonitorHourlyValueData records to ensure that a single
record containing C02 concentration values is reported for the current hour
Specifications:
Current C02 Cone Derived Hourly Record = null
Current C02 Cone Monitor Hourly Record = null
Current C02 Cone Missing Data Monitor Hourly Record = null
CO2 Cone Derived Checks Needed = false
CO2 Cone Monitor Checks Needed = false
02 Dry Needed to Support C02 Calculation = false
02 Wet Needed to Support C02 Calculation = false
C02C Has Measured DHVMODC = null
C02 Cone Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "C02C" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
CO 2 Cone Monitor Hourly Count = count of MonitorHourlyValueData records with ParameterCode = "C02C" where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour
Total C02 Cone Records = C02 Cone Derived Hourly Count + CO2 Cone Monitor Hourly Count
If (Current Hourly Op . Opcra t i ngTi mc > 0)
If ((C02 Cone Checks Needed for Heat Input == true) OR (CO2 Diluent Checks Needed for NOx Rate Calc == true) OR (CO2
Diluent Neededfor MATS == true) OR (CO2 Cone Checks Needed for C02 Mass Calc == true))
If ((CO2 Cone Monitor Hourly Count == 0) AND ((CO2 Cone Checks Needed for Heat Input == true) OR (CO2
Diluent Checks Needed for NOx Rate Calc == true) OR (CO2 Diluent Neededfor MATS == true)))
If ( C02 Cone Checks Needed for Heat Input == true) OR
( CO2 Diluent Checks Needed for NOx Rate Calc == true AND NOXR Has MeasuredDHVMODC ==
true) OR
( CO2 Diluent Neededfor MATS == true AND CO2 Diluent Needed for MATS Calculation == true )
return result B
Else
return result F
else if (Total C02 Cone Records == 0)
return result A
else if ((C02 Cone Monitor Hourly Count == 2) AND (CO2 Cone Derived Hourly Count == 0) AND ((C02 Diluent
Checks Neededfor NOx Rate Calc == true) OR (C()2 Diluent Needed for MATS == true)) AND ((C02 Cone Checks
Neededfor Heat Input == true) OR (CO2 Cone Checks Needed for C02 Mass Calc = true))
Current C02 Cone Monitor Hourly Record = Find MonitorHourlyValueData records with ParameterCode =
"C02C" and MODCCode in set {01, 02, 03, 04, 53, 54} where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourlyValueData.Hour
Environmental Protection Agency
Page 598 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Current C02 Cone Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "C02C" andMODCCode not in set {01, 02, 03, 04, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
If (Current C02 Cone Monitor Hourly Record is null OR Current C02 Cone Missing Data Monitor Hourly
Record is null)
return result C
else
CO2 Cone Monitor Checks Needed = true
else if (Total C02 Cone Records > 1)
return result C
else if (CO2 Cone Derived Hourly Count == 1)
CO2 Cone Derived Checks Needed = true
Current C02 Cone Derived Hourly Record = matching DerivedHourly ValueData rec
C02C Has Measured DHV MODC = {Current C02 Cone Derived Hourly Record .MODCCode in set {01, 02,
03, 04, 05, 21, 53, 54}
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^oxmvla Id Key is not null)
C02C Formula record = Find MonitoringFormulaData record where
MonitoringFormulalDKey = Current C02 Cone Derived Hourly Record.Formula Id Key
If (C02C Formula record is not null)
If (C02CFormula record.ParameterCode == "C02C")
If (C02C Formula record.EquationCode == "F-14A")
02 Dry Needed to Support C02 Calculation = true
else if (C02C Formula record.EquationCode == "F-14B")
02 Wet Needed to Support C02 Calculation = true
Moisture Needed = true
else if (CO2 Cone Monitor Hourly Count == 1)
CO2 Cone Monitor Checks Needed = true
Current C02 Cone Monitor Hourly Record = matching MonitorHourly ValueData rec
else
If (Total C02 Cone Records > 0)
Return result D
else
If (Total C02 Cone Records > 0)
Return result E
Environmental Protection Agency
Page 599 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You did not report a MHV or DHV record for C02C for the hour. Critical Error Level 1
B You did not report an MHV record for C02C for the hour. Critical Error Level 1
C You reported more than one MHV and/or DHV records for C02C for the hour. Critical Error Level 1
D You reported a MHV or DHV record for C02C, but this record is not required to Non-Critical Error
calculate emissions.
E You reported a MHV or DHV record for C02C, but this is not appropriate for a Critical Error Level 1
non-operating hour.
F You did not report an MHV record for C02C for the hour. Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 600 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-24
Check Name:
Related Former Checks:
Count Hourly Fuel Flow Records
Applicability:
Description:
General Check
Counts the number of Hourly Fuel Flow Records for the current hour and checks for consistency with
Appendix D and/or Appendix E Methods
Specifications:
If {DerivedHourly Checks Needed == true)
Hourly Fuel Flow Count For Oil = 0
Hourly Fuel Flow Count For Gas = 0
Appendix D Method Active = Heat Input App D Method Active For Hour OR
CO 2 App D Method Active For Hour OR
S02 App D Method Active For Hour
Hourly Fuel Flow List = set of all DerivedHourlyValueData records
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
For each record (Current Hourly Fuel Flow Record) in Hourly Fuel Flow List
Cur Fuel Code = Current Hourly Fuel Flow RecordFuzXCode
if (Cur Fuel Code is null)
return result D
Current Fuel Group = select FuelGroupCode from FuelCode Table where FuelCode = Cur Fuel Code
if {Current Fuel Group is null)
return result D
else If Current Fuel Group == "GAS"
Add 1 to Hourly Fuel Flow Count For Gas
else if Current Fuel Group == "OIL"
Add 1 to Hourly Fuel Flow Count For Oil
Hourly Fuel Flow Count = Hourly Fuel Flow Count For Gas + Hourly Fuel Flow Count For Oil
If {CurrentHourly Op /?6'tw 0)
Return result A
if {Appendix D Method Active = true AND Hourly Fuel Flow Count == 0 AND MP Pipe Configfor Hourly Checks is
null)
Return result B
else if {Appendix D Method Active = false AND Hourly Fuel Flow Count >0)
return result C
else
Environmental Protection Agency
Page 601 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You reported an HFF record, but this is not appropriate for a non-operating hour.
You did not report an HFF record for the hour.
You reported a HFF record, but you did not report an active AD or AE method record
in your monitoring plan for the hour.
The FuelCode reported in the HFF record is missing or invalid.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 602 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-30
Check Name: Determine Load Based Status of unit
Related Former Checks:
Applicability: General Check
Description: Determines whether current entity is load based
Specifications:
Unit is Load Based = false
Location Name = Current Monitor Plan Location Record. LOG' AT IONN AIVIE
if the Location Name begins with "CS" or "CP" or "MS" or "MP"
Locate all Unit Stack Configuration records where the stack/pipe location is the monitoring location, the BeginDate is on or before
the Current Date, and the EndDate is null or is on or after the Current Date.
If the NonLoadBasedlndicator in all of the retrieved records is equal to 1,
Unit is Load Based = false
else
Unit is Load Based = true
else // current location is a unit
if the NonLoadBasedlndicator field for the unit = 1
Unit is Load Based = false
else
Unit is Load Based = true
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 603 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-32
Check Name:
Related Former Checks:
Perform Load Checks for Operating Hour
Applicability:
Description:
General Check
Checks to see that Load is populated correctly for operating hours. Also checks Units of Measure Code for
Load
Specifications:
CurrentMaximumLoadValue = null
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. Hourly Load
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 (MPStack Config for Hourly Checks == 'MS" AND Current Entity Type == "Unit")
MP Unit Load = Current Hourly Op Record.HourLoad
if (Current Entity Type= "Unit")
if (UnitLoadTimesOpTime 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. LoadUnitsOfMcasurcCodc not in {"MW","KLBHR", "MMBTUHR"}
MPLoad UOM = "INVALID"
return result B
else if (MPLoad UOM is not null AND MPLoad UOM <> "INVALID" AND MPLoad UOM <> Current
Hourly Op Record. LoadUnitsOnvicasurcCodc)
MPLoad UOM = "INVALID"
return result C
else
if (MPLoad UOM is null)
else
MPLoad UOM = Current Hourly Op Record. LoadUnitsOlTVIcasurcCodc
Environmental Protection Agency
Page 604 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate the MonitorLoadRecordsByHourandLocation record for the hour and location.
If (only one record is found AND MonitorLoadRecordByHourandLocation.Maxim\imLoadVal\ie is
greater than 0),
If {Current Hourly Op Record.LoadUnitsOfMcasurcCodc ==
MonitorLoadRecordByHourandLocation.Maxim\imLoad\JmtsOfMeas\ireCode)
If {Current Hourly Op Record.HourLoad is greater than
MonitorLoadRecordByHourandLocation.MaximumLoadValue)
If {Current Hourly Op Record.HourLoad is greater than 1.25 *
MonitorLoadRecordByHourandLocation.MaximumLoadValue)
return result L
else
return result H
Else
CurrentMaximumLoadValue =
MonitorLoadRecordByHourandLocation.MaximumLoadValue
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. LoadUnitsOlTVIcasurcCodc is not null
return result E
else if {Unit is Load Based == false)
if {Current Hourly Op Record.HourLoad is not null)
return result F
if Current Hourly Op Record. LoadUnitsOlTVIcasurcCodc is not null
return result G
Environmental Protection Agency
Page 605 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Usage:
1
Response
The HourLoad reported in the Hourly Operating record is invalid. The value must be
greater than or equal to 0.
The LoadUnitsOfMeasureCode reported in the Hourly Operating record is invalid.
You did not report the same LoadUnitsOfMeasureCode for all locations in the
configuration.
You reported HourLoad in the Hourly Operating record. This field should be blank for
a non-operating hour.
You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This field
should be blank for a non-operating hour.
You reported HourLoad in the Hourly Operating record. This field should be blank for
a non-load-based unit.
You reported a LoadUnitsOfMeasureCode in the Hourly Operating record. This field
should be blank for a non-load-based unit.
Warning: The HourLoad reported in the Hourly Operating Data record is higher than
the MaximumLoadValue in the Monitoring Load record reported in your monitoring
plan. Sources are required to periodically (at least once annually) evaluate the
appropriateness of these maximum values in the monitoring plan and make proper
adjustments when necessary. You should investigate the cause of these exceedances
and determine whether an adjustment to the MaximumLoadValue in your monitoring
plan is necessary.
The [fieldname] does not correspond to the MaximumLoadUnitsOfMeasure reported in
the monitoring plan.
You did not have one and only one valid Monitor Load record that was active during
the hour.
The LoadRange or CommonStackLoadRange reported in the Hourly Operating record
is inconsistent with the HourLoad. When no load is generated, the load range should
be less than 2.
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.
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 2
Critical Error Level 1
Informational Message
Critical Error Level 1
Environmental Protection Agency
Page 606 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-33
Check Name: Check reported Fuel Code for Operating Hour
Related Former Checks:
Applicability: General Check
Description: Where applicable, ensures that the fuel code is valid
Specifications:
if {Current Hourly Op Record is not null)
Fuel Code Validation Needed = false
If (NOx Rate Fuel Specific Missing Data == true OR NOx Mass Fuel Specific Missing Data == true OR S02 Fuel Specific
Missing Data == true OR CO 2 Fuel Specific Missing Data == true OR Heat Input Fuel Specific Missing Data == true OR H20
Fuel Specific Missing Data == true)
Fuel Code Validation Needed = true
else
if (Current S02 Monitor Hourly Record is not null AND 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 . Opcra t i ngTi mc is greater than 0)
return result A
else
Current Hourly Fuel Group Code = FuelGroupCode from FuelCode table entry where
FuelCode = Current Hourly Op Record .FuelCode
if {Current Hourly Op Record.FuelCode = "NFS" OR
{Current Hourly Fuel Group Code == "COAL" AND Current Hourly Op Record.FuelCode <> "C"))
return result B
else if {Current Hourly Op Record.FuelCode is not null)
if (S02 Bypass Code <> "BYMAXFS" AND NOx Rate Bypass Code <> "BYMAXFS" AND NOx Mass Bypass Code
<> "BYMAXFS")
return result C
Results:
Result
A
B
C
Response
You did not report a FuelCode in the Hourly Operating record.
The FuelCode reported Hourly Operating record is invalid.
You reported a FuelCode in the Hourly Operating record. This value should only be
reported if you use fuel-specific missing data or have an unmonitored bypass stack that
reports emissions based on fuel-specific maximum values.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 607 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 608 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-34
Check Name: Validate Reported FC Factor
Related Former Checks:
Applicability: General Check
Description: Uses cross-check value to ensure that FC Factor reported in Hourly Operating Data is within acceptable range
Validation Tables:
F-Factor Range Checks (Cross Check Table)
Specifications:
if FC Factor Needed = true
Valid FC Factor Exists = false
if {Current Hourly Op Record.FcFactor is null)
return result A
else if {Current Hourly Op Record.FcFactor <= 0)
return result A
else
Valid FC Factor Exists = true
if {Special Fuel Burned = false)
FC Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor = "FC"
FC Factor Maximum = Lookup Upper from Cross-Check Table "F-Factor Range Checks" where Factor = "FC"
if {Current Hourly Op Record.FcFactor > FC Factor Maximum OR Current Hourly Op Record.FcFactor < FC
Factor Minimum)
return result B
Results:
Result Response Severity
A The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1
B The [FNAME] reported in the Hourly Operating record is outside of the expected range Critical Error Level 2
from [MIN] to [MAX],
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 609 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-35
Check Name: Validate Reported FD Factor
Related Former Checks:
Applicability:
Description: Uses cross-check value to ensure that FD Factor reported in Hourly Operating Data is within acceptable range
Validation Tables:
F-Factor Range Checks (Cross Check Table)
Specifications:
if FD Factor Needed = true
Valid FD Factor Exists = false
if {Current Hourly Op Record.FdFactor is null)
return result A
else if {Current Hourly Op Record.FdFactor <= 0)
return result A
else
Valid FD Factor Exists = true
if {Special Fuel Burned = false)
FD Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor = "FD"
FD Factor Maximum = Lookup Upper from Cross-Check Table "F-Factor Range Checks" where Factor = "FD"
if {Current Hourly Op Record FdFactor > FD Factor Maximum OR Current Hourly Op Record FdFactor < FD
Factor Minimum)
return result B
Results:
Result Response Severity
A The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1
B The [FNAME] reported in the Hourly Operating record is outside of the expected range Critical Error Level 2
from [MIN] to [MAX],
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 610 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-36
Check Name: Validate Reported FW Factor
Related Former Checks:
Applicability: General Check
Description: Uses cross-check value to ensure that FW Factor reported in Hourly Operating Data is within acceptable range
Validation Tables:
F-Factor Range Checks (Cross Check Table)
Specifications:
if FW Factor Needed = true
Valid FW Factor Exists = false
if {Current Hourly Op Record.FwFactor is null)
return result A
else if {Current Hourly Op Record.FwFactor <= 0)
return result A
else
Valid FW Factor Exists = true
if (Special Fuel Burned = false)
FW Factor Minimum = Lookup Lower from Cross-Check Table "F-Factor Range Checks" where Factor = "FW"
FWFactor Maximum = Lookup Upper from Cross-Check Table "F-Factor Range Checks" where Factor = "FW"
if {Current Hourly Op Record.¥w¥i\c\ox > FW Factor Maximum OR Current Hourly Op Record.¥w¥i\c\ox <
FW Factor Minimum)
return result B
Results:
Result Response Severity
A The [FNAME] reported in the Hourly Operating record is missing or invalid. Critical Error Level 1
B The [FNAME] reported in the Hourly Operating record is outside of the expected range Critical Error Level 2
from [MIN] to [MAX],
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 611 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-37
Check Name: Verify Single Heat Input Derived Hourly Record
Related Former Checks:
Applicability: CEM Check
Description: Verily that a single Derived Hourly record exists for Heat Input for the current location and hour
Specifications:
Current Heat Input Derived Hourly Record= null
Heat Input Derived Checks Needed = false
HIT Derived Checks Needed = false
Heat Input Derived Hourly Count = # of DerivedHourlyValueData record with parameter beginning with "HI" where
Current Date = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 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 = DerivedHourly ValueData.Date and
Current Hour = DerivedHourly ValueData.Hour
If (LME HI Method is not null)
if (Current Heat Input Derived Hourly Record. ParamctcrCodc == "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. ParamctcrCodc == "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")
Environmental Protection Agency
Page 612 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (Current Heat Input Derived Hourly . Fo r m u 1 a I dc n t i fi c r is not null)
HI Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = 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
B
C
D
Response
You did not report a DHV record for HI (or HIT) for the hour. If you have entered
LME data via the LME Emissions Data Utility, this error indicates that you have not
yet generated your quarterly emissions data. You must do this by clicking on the
Generate Emissions Data link on the LME Emissions Data Utility submenu.
You reported a DHV record for HI (or HIT), but, according to the monitoring methods
in your monitoring plan, you should not report hourly heat input at this location.
You reported more than one DHV record for HI (or HIT) for the hour.
You reported a DHV record for HI (or HIT), but this is not appropriate for a
non-operating hour.
The ParameterCode reported in the DHV record does not match the ParameterCode in
the Method record in your monitoring plan used to determine [eparam].
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 613 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-38
Check Name:
Determine Fuel Type
Related Former Checks:
Applicability:
General Check
Description:
Specifications:
If {DerivedHourly 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
./tecon/.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 \]n\\.¥uQ.\Cd in set {OOL, PRG, PRS, OGS}
Special Fuel Burned = true
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 614 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-39
Check Name: Verify Single H20 Cone Derived or Monitor Hourly Data Record
Related Former Checks:
Applicability: CEM Check
Description: This check scans the DerivedHourlyValueData and MonitorHourlyValueData records to ensure that a single
record containing H20 concentration values is reported for the current hour
Specifications:
H20 Monitor Hourly Checks Needed = false
H20 Derived Hourly Checks Needed = false
Current H20 Monitor Hourly Record = null
Current H20 Derived Hourly Record = null
02 Wet Checks Neededfor H20= false
02 Dry Checks Needed for H20= false
H20 Has Measured DHVMODC=mx\\
If Current Hourly Op Record .0\~>cn\{\\\gY\mc > 0.00
If (Moisture Needed == true)
If H20 Monitor Hourly Count + H20 Derived Hourly Count ==0
If (H2() Method Code == "MWD")
return result A
Else if (H2() Method Code <> "MDF")
return result B
Else if H20 Default Max Value is not null
return result C
Else if (H20 Derived Hourly Count > 1)
return result D
Else if (H20 Monitor Hourly Count > 1)
return result E
Else if (H20 Derived Hourly Count == 1 AND H20 Method Code in set {MTB, MMS})
return result F
Else if (H20 Monitor Hourly Count == 1 AND H20 Method Code in set {MWD, MDF})
return result G
Else if (H20 Monitor Hourly Count == 1)
CurrentH20 Monitor Hourly Record = MonitorHourlyValueData record matching with ParameterCode =
"H20" where
Current Date = MonitorHourlyValueData.Date and
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
Environmental Protection Agency
Page 615 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
DerivedHourlyValueData.Date = Current Date AND
DerivedHourlyValueData.Hour = Current Hour
H20 Has Measured DHVMODC = ( Current H20 Derived Hourly Record .ModcCode in set {01, 02, 03, 04,
05,21,53,54} )
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
I)erived Hourly Record. Formu 1 a Idcn t i ficr is not null)
H20 Formula Record = MonitorFormulaData record where
MonitorFormulaData.FormulaID = Current H20 Derived Hourly Fo r m u 1 a I dc n t i fi c r
If (H20 Formula Record is not null)
If {H20 Formula Record.ParameterCode == "H20" AND H20 Formula Record.EquationCode in
set {F-31, M-1K})
02 Wet Checks Neededfor H20 = true
02 Dry Checks Needed forH20 = true
else
If H20 Monitor Hourly Count + H20 Derived Hourly Count > 0
return result I
Results:
Result
A
B
C
D
E
F
G
H
I
Response
You did not report a DHV record for H20 for the hour.
You did not report an MHV record for H20 for the hour.
You did not report a DHV record for H20 for the hour. You must report this record if
you have multiple H20 default values for different fuels.
You reported more than one DHV record for H20 for the hour.
You reported more than one MHV record for H20 for the hour.
You reported a DHV record for H20, but the H20 MethodCode is not "MWD" or
"MDF".
You reported a MHV record for H20, but the H20 MethodCode is not "MTB" or
"MMS".
You reported a DHV and/or MHV record for H20, but this record is not required to
calculate emissions.
You reported a DHV and/or MHV record for H20, but this is not appropriate for a
non-operating hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 616 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-40
Check Name: Verify Single 02 Dry Monitor Hourly Value Record
Related Former Checks:
Applicability: CEM Check
Description: This check scans the MonitorHourlyValueData records to ensure that a single 02 Wet exists for the current
hour.
Note that Result A and G indicate that a dry moisture basis is required because both a wet and dry 02C are
needed. Otherwise a null moisture basis can be used.
Specifications:
Current 02 Dry Monitor Hourly Record = null
Current 02 Dry Missing Data Monitor Hourly Record = null
02 Dry Monitor Hourly Checks Needed = false
If Current Hourly Op Record .0\~>cn\{\\\gY\mc > 0.00
If ((()2 Dry Checks Needed for Heat Input == true) OR (()2 Dry Checks Needed for NOx Rate Calc == true) OR (()2 Dry
Checks Needed To Support C02 Calculation == true) OR (02 Dry Checks Needed forH20 == true) OR (02 Dry Neededfor
MATS == true))
If ((()2 Dry Monitor Hourly Count ==0) AND ((()2 Wet Checks Needed for Heat Input == true) OR (()2 Wet Checks
Needed for NOx Rate Calc == true) OR (02 Wet Checks Needed To Support C02 Calculation == true) OR (02 Wet
Checks Neededfor H20 == true) OR (02 Wet Needed for MATS == true)))
If ( 02 Wet Checks Needed for Heat Input == true) OR
( ()2 Wet Checks Neededfor NOx Rate Calc == true AND NOXR Has Measured DHVMODC== true)
OR
( 02 Wet Checks Needed To Support C02 Calculation == true AND C02C Has MeasuredDHVMODC =
true) OR
(02 Wet Checks Needed for H20== true AND H20 Has Measured DHV MODC = true) OR
( ()2 Wet Needed for MATS ==tme AND 02 Wet Neededfor MATS Calculation == true )
return result A
Else
return result G
Else if (()2 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count ==0)
If ( 02 Dry Checks Needed for Heat Input == true) OR
( 02 Dry Checks Neededfor NOx Rate Calc == true AND NOXR Has Measured DHV MODC == true)
OR
( 02 Dry Checks Needed To Support C02 Calculation == true AND C02C Has Measured DHV MODC ==
true) OR
(02 Dry Checks Needed for H20== true AND H20 Has Measured DHV MODC = true) OR
(02 Dry Neededfor MATS == true AND 02 Dry Neededfor MATS Calculation == true)
return result B
Else
return result H
Else if ((02 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count >2) OR (02 Dry Monitor Hourly Count +
02 Null Monitor Hourly Count == 2 AND 02 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 2))
Return result C
Else if (()2 Dry Monitor Hourly Count + 02 Null Monitor Hourly Count ==2)
If (()2 Dry Checks Needed for Heat Input == true AND (()2 Dry Checks Needed for NOx Rate Calc == true OR
Environmental Protection Agency
Page 617 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
02 Dry Checks Needed forH20 == true) OR (02 Dry Needed for MATS == true))
Current 02 Dry Monitor Hourly Record = Find MonitorHourly ValueData records with ParameterCode =
"02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and MODCCode in set {01, 02, 03, 04, 53,
54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
Current 02 Dry Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "02C" AND (MoistureBasis = "D" OR MoistureBasis is null) and MODCCode not in
set {01, 02, 03, 04, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
If (Current 02 Dry Monitor Hourly Record is null OR Current 02 Dry Missing Data Monitor Hourly
Record is null)
return result C
else
02 Dry Monitor Hourly Checks Needed = true
else
return result C
Else if (()2 Dry Monitor Hourly Count ==1)
02 Dry Monitor Hourly Checks Needed = true
Current 02 Dry Monitor Hourly Record = MonitorHourly ValueData record with ParameterCode = "02C" AND
MoistureBasis = "D" where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
Else if (()2 Null Monitor Hourly Count == 1)
02 Dry Monitor Hourly Checks Needed = true
Current 02 Dry Monitor Hourly Record = Current 02 Null Monitor Hourly Record
else
If (02 Dry Monitor Hourly Count > 0)
Return result D
If ((()2 Null Monitor Hourly Count > 0) AND (02 Wet Checks Needed for Heat Input == false) AND (02 Wet Checks
Needed for NOx Rate Calc == false) AND (()2 Wet Checks Needed To Support C02 Calculation == false) AND (()2
Wet Checks Needed for H20 == false) AND (()2 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
Environmental Protection Agency
Page 618 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
Usage:
1
Response
You did not report a MHV record for 02C with a MoistureBasis of D for the hour.
You did not report a MHV record for 02C with a MoistureBasis of D (or blank) for the
hour.
You reported too many MHV records for 02C with a MoistureBasis of D (or blank) for
the hour.
You reported an MHV record for 02C with a MoistureBasis of [basis], but this record
is not required to calculate emissions.
You reported an MHV record for 02C with a blank MoistureBasis, but this record is
not required to calculate emissions.
You reported a MHV record for 02C, but this is not appropriate for a non-operating
hour.
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.
Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Non-Critical Error
Critical Error Level 1
Informational Message
Informational Message
Environmental Protection Agency
Page 619 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-41
Check Name: Verify Single 02 Wet Monitor Hourly Value Record
Related Former Checks:
Applicability:
Description:
Specifications:
Current 02 Wet Monitor Hourly Record = null
Current 02 Wet Missing Data Monitor Hourly Record = null
02 Wet Monitor Hourly Checks Needed = false
If Current Hourly Op Record .0\~>cn\{\\\gY\mc > 0.00
If ((()2 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 (()2 Wet Checks Neededfor H20 == true) OR (()2 Wet Needed for
MATS == true))
If ((()2 Wet Monitor Hourly Count == 0) AND ((()2 Dry Checks Needed for Heat Input == true) OR (()2 Dry Checks
Needed for NOx Rate Calc == true) OR (02 Dry Checks Needed To Support C02 Calculation == true) OR (02 Dry
Checks Neededfor H20 == true) OR (02 Dry Needed for MATS == true)))
If ( 02 Dry Checks Needed for Heat Input == true) OR
( 02 Dry Checks Needed for NOx Rate Calc == true AND NOXR Has MeasuredDHVMODC == true)
OR
( 02 Dry Checks Needed To Support C02 Calculation == true AND C02C Has Measured DHV MODC ==
true) OR
(02 Dry Checks Needed for H20== true AND H20 Has Measured DHV MODC = true) OR
(02 Dry Neededfor MATS == true AND 02 Dry Neededfor MATS Calculation == true)
return result A
Else
return result E
Else if (()2 Wet Monitor Hourly Count + 02 Null Monitor Hourly Count == 0)
If ( 02 Wet Checks Needed for Heat Input == true) OR
( ()2 Wet Checks Neededfor NOx Rate Calc == true AND NOXR Has Measured DHV MODC == true )
OR
( 02 Wet Checks Needed To Support C02 Calculation == true AND C02C Has Measured DHV MODC =
true) OR
(02 Wet Checks Needed for H20== true AND H20 Has Measured DHV MODC = true) OR
( 02 Wet Needed for MATS == true AND 02 Wet Needed for MATS Calculation == true)
return result B
Else
return result F
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 ((()2 Wet Checks Neededfor Heat Input == true) AND (02 Dry Monitor Hourly Count + 02 Null Monitor
CEM Check
This check scans the MonitorHourlyValueData records to ensure that a single 02 Wet exists for the current
hour. Otherwise a null moisture basis can be used.
Note that Result A and E indicate that a wet moisture basis is required because both a wet and dry 02C are
needed.
Environmental Protection Agency
Page 620 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Hourly Count <> 2) AND ((()2 Wet Checks Needed for NOx Rate Calc == true) OR (02 Wet Checks Needed
forH20 == true) OR (()2 Wet Needed for MATS == true)))
Current 02 Wet Monitor Hourly Record = Find MonitorHourly ValueData records with ParameterCode =
"02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and MODCCode in set {01, 02, 03, 04,
53, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
Current 02 Wet Missing Data Monitor Hourly Record = Find MonitorHourly ValueData records with
ParameterCode = "02C" AND (MoistureBasis = "W" OR MoistureBasis is null) and MODCCode not in
set {01, 02, 03, 04, 54} where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
If (Current 02 Wet Monitor Hourly Record is null OR Current 02 Wet Missing Data Monitor Hourly
Record is null)
return result C
else
02 Wet Monitor Hourly Checks Needed = true
else
return result C
Else if (()2 Wet Monitor Hourly Count == 1)
02 Wet Monitor Hourly Checks Needed = true
Current 02 Wet Monitor Hourly Record = MonitorHourly ValueData record with ParameterCode = "02C" AND
MoistureBasis = "W" where
Current Date = MonitorHourlyValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
Else if (()2 Null Monitor Hourly Count == 1)
02 Wet Monitor Hourly Checks Needed = true
Current 02 Wet Monitor Hourly Record = Current 02 Null Monitor Hourly Record
else
If (02 Wet Monitor Hourly Count > 0)
Return result D
Results:
Result
A
B
C
D
E
F
Response
You did not report a MHV record for 02C with a MoistureBasis of W for the hour.
You did not report a MHV record for 02C with a MoistureBasis of W (or blank) for the
hour.
You reported too many MHV records for 02C with a MoistureBasis of W (or blank) for
the hour.
You reported an MHV record for 02C with a MoistureBasis of [basis], but this record
is not required to calculate emissions.
You did not report a MHV record for 02C with a MoistureBasis of W for the hour.
You did not report a MHV record for 02C with a MoistureBasis of W (or blank) for the
hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Informational Message
Informational Message
Environmental Protection Agency
Page 621 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 622 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-42
Check Name:
Related Former Checks:
Verify Single S02R Derived Hourly Data Record
Applicability:
Description:
CEM Check
This check scans the DerivedHourlyValueData records to ensure that a single record containing S02R derived
values is reported for the current hour
Specifications:
If {DerivedHourly Checks Needed == true)
S02R Derived Checks Needed = false
S02R Derived Hourly Count = count of DerivedHourlyValueData records with ParameterCode = "S02R" where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
If Current Hourly Op . O pc ra t i n gTi mc > 0
If (S02R Derived Hourly Count == 0 AND F23 Default Max Value is not null)
Return result A
Else if (S02R Derived Hourly Count > 0 AND SO2 F23 Method Active For Hour == false)
Return result B
Else if (S02R Derived Hourly Count >1)
Return result C
Else if (S02R Derived Hourly Count == 1)
Current S02R Derived Hourly Record = DerivedHourlyValueData rec matching with param S02R where
Current Date = DerivedHourlyValueData.Date and
Current Hour = DerivedHourlyValueData.Hour
S02R Derived Checks Needed = true
else
If S02R Derived Hourly Count > 0
Return result D
Results:
Result
A
B
Response
You did not report a DHV record for S02R for the hour.
You reported a DHV record for S02R, but this record is not required to calculate
emissions.
You reported more than one DHV record for S02R for the hour.
You reported a DHV record for S02R, but this is not appropriate for a non-operating
hour.
Severity
Critical Error Level 1
Non-Critical Error
C
D
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 623 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-43
Check Name: Validate Single Stack Flow Record
Related Former Checks:
Applicability: CEM Check
Description: Counts records in MonitorHourlyValueData for the current date and hour with parameter "FLOW". Based on
whether or not OperatingTime is non-zero for this hour, reports any appropriate errors and sets Current Flow
Monitor Hourly Record
Specifications:
Current Stack Flow Hourly Record= null
Apportionment Stack Flow Array for this Location = null
If {Flow MHVOptionally Allowed == true) AND {Flow Monitor Hourly Count > 0)
Flow Monitor Hourly Checks Needed = true
If Flow Monitor Hourly Checks Needed == true)
If {Flow Monitor Hourly Count == 0)
Flow Monitor Hourly Checks Needed = false
return result A
Else if {Flow Monitor Hourly Count >1)
return result B
Else
Current Stack Flow Hourly Record = MonitorHourly ValueData record with parameter FLOW where
Current Date = MonitorHourly ValueData.Date and
Current Hour = MonitorHourly ValueData.Hour
Apportionment Stack Flow Array for this Location = CurrentStackFlowHourlyRecord.VnadjustedRourlyYalue
else
If Flow Monitor Hourly Count > 0
return result C
Results:
Severity
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Result Response
A You did not report an MHV record for FLOW for the hour.
B You reported more than one MHV record for FLOW for the hour.
C You reported a MHV record for FLOW, but this record is not appropriate for the hour.
Environmental Protection Agency
Page 624 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-44
Check Name: Check Reporting of Load Range and Common Stack Load Range
Related Former Checks:
Applicability: General Check
Description: Ensures that Load Range and Common Stack Load Range are reported when required and are otherwise not
reported.
Specifications:
Set CheckLoadRangeValue to false.
Set CheckCsLoadRangeValue to false.
If DerivedHourlyChecksNeeded == true, AND UnitlsLoadliased is true,
If CurrentHourlyOpRecord.OpTunc > 0, CurrentHourlyOpRecord. HourLoad >= 0,I An eAnnual is false, AND LmeOs is false,
If FlowMonitorHourlyChecksNeeded is true, OR NoxConcNeededForNoxMass is true, OR
NoxRateDerivedChecksNeeded is true, OR So2HpffExists is true, OR Co2HpffExists is true, OR HiHpffExists is true,
If CurrentHourlyOpRecord.LoadRange is null, AND CurrentHourlyOpRecord.CommonSVacVLoadRangc is
null,
return result A.
Else if CurrentEntityType is equal to "CS",
If CurrentHourlyOpRecord LoadRange is NOT null,
Set CheckLoadRangeValue to true.
If CurrentHourlyOpRecord.CommonSVacVLoadRangc is NOT null,
If FlowMonitorHourlyCount is equal to 0,
return result C.
Else
Set CheckCsLoadRangeValue to true.
Else if CurrentEntityType is equal to "CP",
If CurrentHourlyOpRecord LoadRange is NOT null,
Set CheckLoadRangeValue to true.
If CurrentHourlyOpRecord.CommonSVacVLoadRangc is NOT null,
If (Hourly Fu el Flo i vCountf)il + HourlyFuelFlowCountForGas) is equal to 0,
return result D.
Else
Set CheckCsLoadRangeValue to true.
Else
If CurrentHourlyOpRecord LoadRange is NOT null,
Set CheckLoadRangeValue to true.
If CurrentHourlyOpRecord.CommonSVacVLoadRangc is NOT null,
return result E.
Else
Environmental Protection Agency
Page 625 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If CurrentHourlyOpRecord.LoadRangc is NOT null, OR CurrentHourlyOpRecord.CommonStackLoadRange is
NOT null,
return result F.
Else
If CurrentHourlyOpRecord. LoadRa ngc is NOT null, OR CurrentHourlyOpRecord.CommonSVAckLondRnngc is NOT
null,
return result B.
Results:
Result
A
B
C
D
E
F
Response
You did not report a Load Range (or Common Stack Load Range) for a monitored
operating load-based unit (or associated stack or pipe) that is not in an LME
configuration.
You reported a Load Range (or Common Stack Load Range) for a unit (or associated
stack or pipe) that was either not operating, not load-based, or is in an LME
configuration.
You reported a Common Stack Load Range for a common stack that did not report
stack flow.
You reported a Common Stack Load Range for a common pipe that did not report oil
or gas fuel flow.
You reported a Common Stack Load Range for a location that is not a common stack
or common pipe.
You reported a Load Range (or Common Stack Load Range) for a unit (or associated
stack or pipe) that was not monitoring parameters used for substitute data. However,
this is not appropriate.
Severity
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 626 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-45
Check Name: Check Reported Load Range Value
Related Former Checks:
Applicability: General Check
Description: Checks the accuracy of the report Load Range if both a Load Range and Load are reported.
Specifications:
Set CalculatedLoadRange to null.
When CheckLoadRangeValue is true,
If CurrentHourlyOpRecord. LoadRa ngc is equal to 0,
return result A.
Else if CurrentHourlyOpRecord .HourLoad is NOT null, AND CurrentMaximumLoadValue is NOT null and > 0,
Set CalculatedLoadRange to ((10 * CurrentHourlyOpRecord .HourLoad / CurrentMaximumLoadValue) + 1) round
down to an integer.
If CurrentHourlyOpRecord HourLoad is equal to 0,
If CurrentHourlyOpRecord.LoadRange is NOT equal to 1,
return result B.
Else if CurrentHourlyOpRecord.HourLoad >= CurrentMaximumLoadValue,
If CurrentHourlyOpRecord.LoadRange is NOT equal to 10,
return result C.
Else
Set BinSize to ( CurrentMaximumLoadValue / 10 )
Set LowRangeBoundry to (BinSize * (CurrentHourlyOpRecord.LoadRange - 1)).
Set HighRangeBoundry to (BinSize * CurrentHourlyOpRecord LoadRange).
If (CurrentHourlyOpRecord .HourLoad < LowRangeBoundry - 2, OR CurrentHourlyOpRecord .HourLoad >
HighRangeBoundry + 2,
return result D.
Results:
Result
Response
Severity
A
You should only report a Load Range of 0 (zero) if the load range number is
indeterminable.
Critical Error Level 1
B
You reported an Hour Load of 0 (zero), which requires a Load Range of 1 when
reported.
Critical Error Level 1
C
You reported an Hour Load that is equal to or exceeds the maximum load, which
requires a Load Range of 10 when reported.
Critical Error Level 1
D
You reported a Load Range of [RptLoadRange], but the value calculated using the
hourly load and maximum load range is [CalcLoadRange].
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 627 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-46
Check Name: Check Reported Common Stack Load Range Value
Related Former Checks:
Applicability: General Check
Description: Checks the accuracy of the report Common Stack Load Range if both a Common Stack Load Range and Load
are reported.
Specifications:
When CheckCsLoadRangeValue is true,
If CurrentHourlyOpRecord.CommonS\i\cVLoi\dR.i\ngc is equal to 0,
return result A.
Else if CurrentHourlyOpRecord.HourLoad is NOT null, AND CurrentMaximumLoadValue is NOT null and > 0,,
Set CalculatedCsLoadRange to ((20 * CurrentHourlyOpRecord .HourLoad / CurrentMaximumLoadValue) + 1)
round down to an integer.
If CurrentHourlyOpRecord HourLoad is equal to 0,
If CurrentHourlyOpRecord.CommonSVAckLondRnngc is NOT equal to 1,
return result B.
Else if CurrentHourlyOpRecord.HourLoad >= CurrentMaximumLoadValue,
If CurrentHourlyOpRecord.CommonSVAckLondRnngc is NOT equal to 20,
return result C.
Else
Set BinSize to ( CurrentMaximumLoadValue / 20 )
Set LowRangeBoundry to (BinSize * (CurrentHourlyOpRecord.CommonSVAckLondRnngc - 1)).
Set HighRangeBoundry to (BinSize * CurrentHourlyOpRecord.CommonSVAckLondRnngc).
If {CurrentHourlyOpRecord .HourLoad < LowRangeBoundry - 2, OR CurrentHourlyOpRecord .HourLoad <
HighRangeBoundry + 2,
return result D.
Results:
Result
A
B
C
D
Usage:
1
Response
You should only report a Common Stack Load Range of 0 (zero) if the load range
number is indeterminable.
You reported an Hour Load of 0 (zero), which requires a Common Stack Load Range
of 1 when reported.
You reported an Hour Load that is equal to or exceeds the maximum load, which
requires a Common Stack Load Range of 20 when reported.
You reported a Common Stack Load Range of [RptLoadRange], but the value
calculated using the hourly load and maximum load range is [CalcLoadRange].
Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 628 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-47
Check Name: Updated QA Certification Event Supplemental Data
Related Former Checks:
Applicability: General Check
Description: Updates the QA Certification Event Supplemental Data for event dates and conditional data begin dates that
occur in the quarter of the emission report being evaluated.
Specifications:
If DerivedHourlyChecksNeeded is true AND CurrentOperatinglime is greater than 0,
For each SupplementalDataRecord in the dictionary at CurrentMonitorPlanLocationPosition in
QaCertEventSuppDataDictionaryArray,
If SupplementalDataRecord.TimeType is equal to "Date",
Increament SupplementalDataRecord.QaCertEventQuarterlyOpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of CurrentOperatingDatehour,
Else if SupplementalDataRecord.TimeType is equal to "Hour",
Increament £'«;«/. Conditional DataBeginQuarterlyOpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour,
If the month of CurrentOperatingDatehour is in May or June,.
If SupplementalDataRecord.TimeType is equal to "Date",
Increament SupplementalDataRecord.QaCertEventQuarterlyOpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of CurrentOperatingDatehour.
Else if SupplementalDataRecord.TimeType is equal to "Hour",
Increament SM/?/>/e/we«ta/Dataitecorii.ConditionalDataBeginMayAndJuneOpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour.
Results:
Result Response Severity
Environmental Protection Agency
Page 629 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 630 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-48
Check Name: Update System Related Supplemental Data
Related Former Checks:
Applicability: General Check
Description: Updates the System Operating Supplemental Data for Part 75 monitored and derived hourly data, and MATS
monitored hourly data.
Specifications:
If DerivedHourlyChecksNeeded is true AND CurrentOperatinglime is greater than 0,
Set SupplementalDataDictionary to the dictionary at CurrentMonitorPlanLocationPosition in
SystemOperatingSuppDataDictionaryArray.
For each HourlyRecord in list:
1) CurrentCo2ConcDerivedHourlyRecord
2) CurrentCo2ConcMonitorHourlyRecord
3) CurrentStackFlowHourlyRecord
4) CurrentHeatlnputDerivedHourlyRecord
5) CurrentH2oDerivedHourlyRecord
6) CurrentH2oMonitorHourlyRecord
7) CurrentNoxConcMonitorHourlyRecord
8) CurrentNoxRateDerivedHourlyRecord
9) Current()2 Dry MonitorHourly Record
10) Current02 WetMonitorHourlyRecord
11) CurrentSo2 MonitorHourly Record
12) MatsHclcMh vRecord
13) MatsHfcMh vRecord
14) MatsHgcMh vRecord
If HourlyRecord is not null, AND 11 ourlyRecord.W[o\\\{on ngSystcm ID is not null,
If SupplementalDataDictionary contains key 11 ourlyRecord.W[o\\\{on ngSystcm ID.
Set SupplementalDataRecord in SupplementalDataDictionary value where key is equal to
/fcwr/yitecoriiMonitoringSystemlD.
Else
Create a new SupplementalDataRecord with MonitoringSystemID equal to
I lourlyRecord.MomiorlngSystcm ID. and OpDays, OpHours, OsDays and OsHours equal to 0..
Add SupplementalDataRecord to SupplementalDataDictionary with a key of
/fcwr/yitecoriiMonitoringSystemlD.
Increament SiippleiiieiiialDaiaRecorcl.QuavlcrhOpcrAUngCounls.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
Increament SupplementalDataRecord.QuarterlyOpemtingCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
Increament SM/?/>/e/we«ta/Dataitecorii.QuarterlyQualityAssuredCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
Environmental Protection Agency
Page 631 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
2) HourlyRecordModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament Siippleriienial/)aiaRecorcl.Qui\vlcr\\Qui\\h\AssurcdCounls. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament QuartcrlvMonitor Aval lablcCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament SM/?/>/e/we«ta/Dataitecorii.QuarterlyMonitorAvailableCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneOperatingCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
Increament SupplementalDaUiRecord.MayAndSuncOpcrMingCounls. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneQualityAssuredCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament .SM^p/e/wewta/DataitecordMayAndJuneQualityAssuredCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneMonitorAvailableCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament .SM/^/e/wewta/DataitecordMayAndJuneMonitorAvailableCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
Environmental Protection Agency
Page 632 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
3) HourlyRecordModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
For each SupplementalDataRecord in the list in the QaCertEventSuppDataDictionaryForSystem with
f f oiirlyRecorcl.Monhori ngSystcm ID as a key,
Increament SupplementalDataRecord.QaCertEyentQuarterlySystemOpearting.Days by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of CurrentOperatingDatehour,
Increament \(//:»/:)/£«/£'«m//Jflto/^ £'«;«/. Conditional DataBcginQuartcrlvSystcmOpcrating. Hours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour,
If the month of CurrentOperatingDatehour is in May or June,.
Increament SupplementalDataRecord.QaCertEventMayKndLi\me'SystemO\)eratingDays by 1
when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour.
Increament
ecore/.ConditionalDataBcginMayAndJuncSystcmO]xrating.Hours by 1
when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour.
If HourlyRecord.MODCCode in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 47, 53, 54
},
For each SupplementalDataRecord in the list in the QaCertEventSuppDataDictionaryF'orSystem with
f f oiirlyRecorcl.Monhori ngSystcm ID as a key,
Increament SM/?/>/e/we«ta/Z)ataitecorii.QaCertEventQuarterlySystemQualityAssuredDays by 1
when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour,
Increament
Environmental Protection Agency
Page 633 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Conditional DataBcginQuartcrlyS\stcinQualit\AssurcdHours by 1
when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour,
If the month of CurrentOperatingDatehour is in May or June,.
Increament
SM/?/>/e/we«ta/Z)ataitecorii.QaCertEventMayAndJuneSystemQualityAssuredDays by 1
when:
1) An increament has not already occurred for the date of
CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour.
Increament
Conditional DataBcginMayAndJimcSystcmQiialityAssiircdHoii
rs by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as
CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
2 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 634 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-49
Check Name: Update Component Related Supplemental Data
Related Former Checks:
Applicability: General Check
Description: Updates the Component Operating Supplemental Data for Part 75 and MATS monitored hourly data.
Specifications:
If DerivedHourlyChecksNeeded is true AND CurrentOperatinglime is greater than 0,
Set SupplementalDataDictionary to the dictionary at CurrentMonitorPlanLocationPosition in
ComponentOperatingSuppDataDictionaryArray.
For each HourlyRecord in list:
1) CurrentCo2ConcMonitorHourlyRecord
2) CurrentStackFlowHourlyRecord
3) CurrentH2oMonitorHourlyRecord
4) CurrentNoxConcMonitorHourlyRecord
5) Current()2 Dry MonitorHourly Record
6) Current02 WetMonitorHourlyRecord
7) CurrentSo2 MonitorHourly Record
8) MatsHclcMh vRecord
9) MatsHfcMhvRecord
10) MatsHgcMh vRecord
If HourlyRecord is not null, AND HourlyRecord. Component ID is not null,
If SupplementalDataDictionary contains key 11 ourlyRecord. Component ID.
Set SupplementalDataRecord in SupplementalDataDictionary value where key is equal to
HourlyRecord. ComponentlD.
Else
Create a new SupplementalDataRecord with ComponentlD equal to HourlyRecord. ComponentlD, and
OpDays, OpHours, OsDays and OsHours equal to 0..
Add SupplementalDataRecord to SupplementalDataDictionary with a key of
HourlyRecord. ComponentlD.
Increament Supplemental DaiaRecord.QuavlcrhOpcrAUngCounls.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
Increament SupplementalDataRecord.QuarterlyOpemtingCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
Increament SM/?/>/e/we«ta/Dataitecorii.QuarterlyQualityAssuredCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament SupplementalDaiaRecorcl.QuavlcrhQualhyAssurcdCounls. .OpHours by 1 when:
Environmental Protection Agency
Page 635 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
1) An increament has not already occurred for CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament QuartcrlvMonitor Aval lablcCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament SM/?/>/e/we«ta/Dataitecorii.QuarterlyMonitorAvailableCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneOperatingCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
Increament SupplementalDaUiRecord.MayAndSuncOpcrMingCounls. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneQualityAssuredCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament .SM^p/e/wewta/DataitecordMayAndJuneQualityAssuredCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44,
47, 53, 54 }.
Increament SM/?/>/e/we«ta/Z)ataitecorii.MayAndJuneMonitorAvailableCounts.OpDays by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
Increament .SM/^/e/wewta/DataitecordMayAndJuneMonitorAvailableCounts. .OpHours by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) The month of CurrentOperatingDatehour is in May, June, July, August or September.
3) HourlyRecord.ModcCode is in set { 01, 02, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 53 }.
For each SupplementalDataRecord in the list in the QaCertEventSuppDataDictionaryForComponent
Environmental Protection Agency
Page 636 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
with HourlyRecord. ComponentID as a key,
Increament SM/?/?/ewe«ta/Z)ataitecorii.QaCertEventQuarterlySystemOpearting.Days by 1 when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour,
Increament SupplementalDataRecord. ConditionalDataBeginQuarterlySystemOpearting.Hours by
1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour,
If the month of CurrentOperatingDatehour is in May or June,.
Increament SM/?/>/e/we«ta/Z)ataitecorii.QaCertEventMayAndJuneSystemOpearting.Days
by 1 when:
1) An increament has not already occurred for the date of
CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour.
Increament
ConditionalDataBeginIVIa> AndJuncS> stcinOpcarting.Hours by
1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as
CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour.
If HourlyRecord.MODCCode in set { 01, 02, 03, 04, 14, 16, 17, 19, 20, 21, 22, 32, 33, 41, 42, 43, 44, 47, 53, 54
},
For each SupplementalDataRecord in the list in the QaCertEventSuppDataDictionaryForComponent
with HourlyRecord. ComponentID as a key,
Increament SM/?/>/e/we«ta/Z)ataitecorii.QaCertEventQuarterlySystemQualityAssuredDays by 1
when:
1) An increament has not already occurred for the date of CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour,
Increament
Conditional DataBcginQuartcrlyS\stcniQualit\AssurcdHours by 1
Environmental Protection Agency
Page 637 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour,
If the month of CurrentOperatingDatehour is in May or June,.
Increament
SM/?/>/e/we«ta/Z)ataitecorii.QaCertEventMayAndJuneSystemQualityAssuredDays by 1
when:
1) An increament has not already occurred for the date of
CurrentOperatingDatehour.
2) QaCertEventDatehour is in the same quarter as CurrentOperatingDatehour,
3) The date of QaCertEventDatehour is on or before the date of
CurrentOperatingDatehour.
Increament
ecore/. Conditional DataBcginMayAndJiincSystcmQiialityAssiircdHoii
rs by 1 when:
1) An increament has not already occurred for CurrentOperatingDatehour.
2) ConditionalDataBeginDatehour is not null,
3) ConditionalDataBeginDatehour is in the same quarter as
CurrentOperatingDatehour,
4) ConditionalDataBeginDatehour is on or before CurrentOperatingDatehour.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
2 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 638 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-50
Check Name: Update Last Quality Assured Supplemental Data
Related Former Checks:
Applicability: General Check
Description: Updates the Last Quality Assured Supplemental Data for Part 75 monitord and derived hourly data.
Specifications:
If DerivedHourlyChecksNeeded is true AND CurrentOperatinglime is greater than 0,
Set SupplementalDataDictionary to the dictionary at CurrentMonitorPlanLocationPosition in
LastQualityAssuredSuppDataDictionaryArray.
For each HourlyRecord in list:
1) CurrentCo2ConcDerivedHourlyRecord
2) CurrentCo2ConcMonitorHourlyRecord
3) CurrentStackFlowHourlyRecord
4) CurrentH2oDerivedHourlyRecord
5) CurrentH2oMonitorHourlyRecord
6) CurrentNoxConcMonitorHourlyRecord
7) CurrentNoxRateDerivedHourlyRecord
8) Current()2 Dry MonitorHourly Record
9) Current02 WetMonitorHourlyRecord
10) CurrentSo2 MonitorHourly Record
If HourlyRecord is CurrentCo2ConcDerivedHourlyRecord or CurrentH2oDerivedHourlyRecord or
CurrentNoxRateDerivedHourlyRecord,
Set HourlyTypeCode to "DERIVED".
Set MoistureBasis to null.
Set ComponentKey to null.
Otherwise
Set HourlyTypeCode to "MONITOR".
Set MoistureBasis to HourlyRecord.MoistureBasis.
Set ComponentKey to HourlyRecord. ComponentKey .
If HourlyRecord is not null, AND HourlyRecord.ModcCode in QualityAssuredModcSet,
For three passes with the following condition and settings for each pass:
Pass 1) MonitorSystemTarget equal to null and ComponentTarget equal to null.
Pass 2) Run when HourlyRecordMomtox'SystQmK.Qy is not null with MonitorSystemTarget equal to
HourlyRecordM-omtox'iyslQvaK.Qy and ComponentTarget equal to null.
Pass 3) Run when ComponentKey is not null with MonitorSystemTarget equal to null and
ComponentTarget equal to ComponentKey.
Set QualityAssuredKey to the concatenation of:
1) CurrentOperatingDatehour
2) HourlyRecordMomtoxLocatiovKsy
3) I1 ourlyRecord. Pa ra mctc rCodc.
Environmental Protection Agency
Page 639 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
4) MoistureBasis,
5) HourlyTypeCode,
6) MonitorSystemTarget.
7) ComponentTarget.
If SupplementalDataDictionary contains key QualityAssuredKey,
Set SupplementalDataRecord to SupplementalDataDictionary value where key is equal to
QualityAssuredKey.
Create a new SupplementalDataRecord with:
1) MonitorLocationKey equal to HourlyRecord MomtoxLocatiovKsy.
2) ReportingPeriodKey equal to /foMr/^ecorii.ReportingPeriodKey .
3) ParameterCode equal to IIourlyRecord. Para mete rCode.
4) MoistureBasis equal to MoistureBasis.
5) HourlyTypeCode equal to HourlyTypeCode.
6) MonitorSystemKey equal to MonitorSystemTarget.
7) ComponentKey to ComponentTarget.
8) UnadjustedHourly Value equal to null.
9) AdjustedHourlyValue equal to null.
Add SupplementalDataRecord to SupplementalDataDictionary with a key of QualityAssuredKey.
Set SiippleiiientallJaiaReaml.{JmdjuslcHourkVAhic to /foMr/^ecorii.UnadjusteHourlyValue.
Set SupplementalDataRecord. AdjusteHourly Value to /foMr/^ecorii.AdjusteHourlyValue.
Else
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
2 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 640 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: HOUROP-51
Check Name: Set Primary Bypass Information
Related Former Checks:
Applicability: General Check
Description: Set check parameters used in the processing of primary bypass system (stacks) and associated primary systems
(stacks) when primary bypass systems are involved for an emission report.
Specifications:
Set PrimaryBypassActiveForHour to false.
Set Primary By pass Active Primary Systemld to null.
Set PrimaryBypassActiveBypassSystemld to null.
If PrimaryBypassActivelnQuarter is true,
Locate BypassSystemRecord in MonitorSystemRecordsByHourLocation where:
1) SystemTypeCode equals "NOX".
2) SystemDesignationCode equals "PB".
If found,
Set PrimaryBypassActiveForHour to true.
Set PrimaryBypassActiveBypassSystemld to BypassSystemRecordlMomtor^ystevcAd..
Locate PrimarySystemRecord in MonitorSystemRecordsByHourLocation where:
1) SystemTypeCode equals "NOX".
2) SystemDesignationCode equals "P".
If found,
Set Primary By pass Active Primary Systemld to PrimarySystemRecord. MonitorSystemld.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 641 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
HOUROP-52
Check Name:
Related Former Checks:
Update Daily Calibration Operating Information
Applicability:
Description:
General Check
Updates the operating hour count, last covered non-op hour, and first op hour after last covered non~op hour
information for daily calibration tests being tracked for status checking.
Specifications:
If DerivedHourlyChecksNeeded is true,
Initialize BypassSystemActiveSystemOpTimeDictionary.
If (PrimaryBypassActiveForHour is true)
If ( CurrentNoxRateDerivedHourlyRecord is NOT null) and ( CurrentNoxRateDerivedHourlyRecord
MonitoringSystemld is NOT null, SystemTypeCode equals "NOX" and SystemDesignationCode equals "P" or "PB")
Add CurrentNoxRateDerivedHourlyRecord MonitoringSystemld to
BypassSystemActiveSystemOpTimeDictionary with a value of CurrentHourlyOpRecord.OperatingTime.
For each UnusedMhvRecord in NoxrPrimaryOrPrimaryBypassMhvRecords,
If ( r'mwtY/A/M'/tecwv:/. Not Report edNoxMoni tori ngSvstem ID is NOT in
BypassSystemActiveSystemOpTimeDictionary)
Add r'mwtY/A/M'/tecwv:/. Not Report edNoxMoni tori ngSvstem ID to
BypassSystemActiveSystemOpTimeDictionary with a value of
CurrentHourlyOpRecord.Opcxa\\ngY\mc.
If (PrimaryBypassActiveBypassSystemld is NOT in BypassSystemActiveSystemOpTimeDictionary)
Add PrimaryBypassActiveBypassSystemld to BypassSystemActiveSystemOpTimeDictionary with a value of 0.
If ( Primary By pass Active Primary Systemld is NOT null) and ( Primary By pass Active Primary Systemld is NOT in
BypassSystemActiveSystemOpTimeDictionary)
Add Primary By pass Active Primary Systemld to BypassSystemActiveSystemOpTimeDictionary with a value of 0.
For each TestLocationObject in MostRecentDailyCalibratonTestObject for the location,
If ( CurrentHourlyOpRecord.OperatingTime is greater than 0 )
Increament 7fesfZoca//'o«C%'ec/\OperatingHourCountby 1.
If ( 7fesfZoca//'o«C%'ec/\LastCoveredNonOpHour is NOT null) AND (
7fe.sfZoca//'o«C%'ec/\FirstOpHourAfterLastCoveredNonOpHour is null)
Set 7fe.sfZoca//'o«C%'ec/\FirstOpHourAfterLastCoveredNonOpHour to
CurrentHourlyOpRecord Date/Hour.
Else
If (the number of inclusive days from 7fesfZoca//'o«C%'ec/\DailyTestDateHour through
CurrentHourlyOpRecord Date/Hour is inclusively between 1 and 26)
Environmental Protection Agency
Page 642 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set 7fe.sfZoca//'o«C%'ec/\LastCoveredNonOpHour to CurrentHourlyOpRecord Date/Hour.
Set 7fe.sfZoca//'o«C%'ec/\FirstOpHourAfterLastCoveredNonOpHour to null.
For each SystemOpTimeEntry in BypassSystemActiveSystemOpTimeDictionary for the location,
Set TestSystemObject to the entry in 7fe.sfZoca//'o«C%'ec/.SystemSupplementalValuesDictionary where key equals
SystemOpTimeEntry. MonitorSystemld.
If (SystemOpTimeEntry:OpTime is greater than 0 )
Increament TestSystemObject .OperatingHourCountby 1.
If ( TestSystemObject .LastCoveredNonOpHour is NOT null) AND ( TestSystemObject
.FirstOpHourAfterLastCoveredNonOpHour is null)
Set TestSystemObject .FirstOpHourAfterLastCoveredNonOpHour to
CurrentHourlyOpRecord Date/Hour:.
If (the number of inclusive days from TestSystemObject .DailyTestDateHour through
CurrentHourlyOpRecord Date/Hour is inclusively between 1 and 26)
Set TestSystemObject .LastCoveredNonOpHour to CurrentHourlyOpRecord Date/Hour.
Set TestSystemObject .FirstOpHourAfterLastCoveredNonOpHour to null.
Else
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Unit-Level Evaluation
Environmental Protection Agency
Page 643 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Leak Status
Environmental Protection Agency
Page 644 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LKSTAT-1
Check Name: Locate Most Recent Prior Leak Check
Related Former Checks:
Applicability: CEM Check
Description: Determines if there is an applicable prior Leak Check.
Specifications:
Set PriorLeakRecord = null.
Locate the most recent record in LeakCheckRecordsByLocationForQAStatus for the location where:
a) the ComponentID is equal to the CurrentMHV.ComponentID
b) the TestResultCd is not equal to "INVALID" and
c) the EndDate/Hour is on or prior to the CurrentMHVRecord.Date/Hour
if (LeakCheckRecordsByLocationForQAStatus is found)
Set PriorLeakRecord = the found record in LeakCheckRecordsByLocationForQAStatus.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Leak Check Status Evaluation
Environmental Protection Agency
Page 645 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LKSTAT-2
Check Name: Locate Most Recent Prior Event
Related Former Checks:
Applicability: CEM Check
Description: Determines if there is an applicable prior event.
Specifications:
Set PriorLeakEventRecord = null.
Set LeakStatusResult = null
If (PriorLeakRecord is null)
Locate the latest record in QACertificationEventRecords where the ComponentID is equal to the CurrentMHKComponcn11D.
QaCertEventCode is equal to "300" or "305", and the QACertEventDate/Hour is prior to CurrentReportingPeriod.
if (QACertificationEventRecord is found)
Set PriorLeakEventRecord = the found record in QACertificationEventRecord.
Locate the latest record in RataTestRecordsByLocationForQaStatus where the SystemID is equal to
CurrentMh v Record. System ID. 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"
else
Set LeakStatusResult = "OOC-No Prior Test".
else
Locate the latest record in QACertificationEventRecords where the ComponentID is equal to the CurrentMHV.ComponentID,
LeakRequired is equal to "Y" and QaCertEventCode is not equal to "300", and the QACertEventDate/Hour is prior to the
CurrentMHVRecord.Date/Hour and after the PriorLeakRecord.EndDate/Hour,
if a record is found
Set PriorLeakEventRecord = the found record in QACertificationEventRecords.
if PriorLeakEventRecordLastCom\AetedHestDate is not null
Set ExpectedLeakCheckQuarter = the quarter of PriorLeakEventRecord.LastCompletedTestDate.
else
Set ExpectedLeakCheckQuarter = the quarter after Priori.eakEventRecord.Q ACcrtEvcntDatc.
Set QuartersAfterCount = 0.
For each quarter beginning with ExpectedLeakCheckQuarter and ending with CurrentReportingPeriod,
Environmental Protection Agency
Page 646 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if QuartersAfterCount is equal to 4,
Set Re quire dLeakCheckQuarter 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 OperatingSuppDataRecordsBy Location where OpTypeCode is equal to
"OSHOURS", FuelCode is null, and reporting period equals the quarter being checked
if OperatingSuppDataRecordsByLocation record is found
If ()peratingSuppl)ataRecordsIiyLocation.OpVa 1 lie >= 168
Set Re quire dLeakCheckQuarter to quarter.
Exit the loop.
else
Set Re quire dLeakCheckQuarter to quarter.
Exit the loop.
Increament QuartersAfterCount by 1.
if Re quire dLeakCheckQuarter is prior to CurrentReportingPeriod
Set LeakStatusResult ="OOC-Event".
else
Set LeakStatusResult — "IC".
else if PriorLeakRecord.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".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Leak Check Status Evaluation
Environmental Protection Agency
Page 647 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LKSTAT-3
Check Name: Determine Expiration Date For Prior Leak Check
Related Former Checks:
Applicability: CEM Check
Description: Determines if Leak Check occurred prior to the standard expiration date.
Specifications:
if (LeakStatusResuIt is null)
Set PriorLeakExpirationDate = PriorLeakRecord. TestExpirationDate.
if (PriorLeakExpirationDate is null)
if {Annual Reporting Requirement == false)
if (PriorLeakRecord .TestEndQuarter = "2")
Set PriorLeakExpirationDate = September 30th following PriorLeakRecord .EndDate.
else
Set PriorLeakExpirationDate = June 30th following PriorLeakRecord .EndDate.
else
if (PriorLeakRecord .GracePeriodlnd =1)
Set PriorLeakExpirationDate = the end of the quarter of the PriorLeakRecord.EndDate.
else
Set PriorLeakExpirationDate = the end of the quarter following the quarter of the PriorLeakRecord
.EndDate.
Set PriorLeakRecord .TestExpirationDate = PriorLeakExpirationDate .
if (CurrentMHVRecord.Date is ON OR BEFORE the PriorLeakExpirationDate)
Set LeakStatusResuIt = "IC".
else
Set PriorLeakExpirationDate = null.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Leak Check Status Evaluation
Environmental Protection Agency
Page 648 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LKSTAT-4
Check Name: Determine Extended Expiration Date for Prior Leak Check
Related Former Checks:
Applicability: CEM Check
Description: Determines if Leak Check occurred prior to the extended expiration date.
Specifications:
Set LeakMissingOpDatalnfo = null,
if (LeakStatusResuIt is null)
Set MissingOpData = false
if (Priori. eakRecord. Tc s t E \ p i ra t i o n D a t c Wi t h E \ t c n s i o n i s null)
For each quarter beginning with the quarter of the PriorLeakExpirationDate and continuing through the quarter prior to
the quarter of the CurrentMHVRecord.Date:
if (EarliestLocationReportDate > the last day of the quarter being checked)
Set NumberOfExtensionQuarters = 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 OperatingSuppDataRecordsBy Location where the reporting period is
equal to the year/quarter being checked and the OpTypeCode = "OSHOURS" and
FuelCode is null.
if {OperatingSuppDataRecordsByLocation is found AND
()peratingSuppl)ataRecordsIiyL ocation. O p Va 1 lie < 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 LocationReportingFrequency record for the test location where
ReportingFrequencyCode = "OS", the Begin Quarter is on or before the quarter
being checked and the EndQuarter is null or is on or after the quarter being
Environmental Protection Agency
Page 649 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
checked.
If (LocationReportingFrequency record is found)
if {Annual Reporting Requirement == true and the quarter being
checked == 4 and the year of the EndQuarter is equal to the year of the
quarter being checked.
Set NumberOfExtensionQuarters =
NumberOfExtensionQuarters + 1.
else
Stop looking for extensions.
else
Set Missing Op Data to true
Set LeakMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is
the year of the quarter being checked and [QTR] is the number of the
quarter being checked.)
Stop looking for extensions.
else
Set Missing Op Data to true
Set LeakMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the year
of the quarter being checked and [QTR] is the number of the quarter being
checked.)
Stop looking for extensions.
else
Stop looking for extensions.
Add NumberOfExtensionQuarters to PriorLeakExpirationDate
Set Priori.eakRecorcl.Tcst E\pi rat ion Datc Wi th E\tcnsion = PriorLeakExpirationDate
else
Set PriorLeakExpirationDate = Priori.eakRecorcl.Tcst E\pi rat ion Datc Wi th E\tcnsion
If (CurrentMHVRecord.Date/Hour is ON OR BEFORE the PriorLeakExpirationDate)
Set LeakStatusResuh = "IC-Extension".
else if (Missing Op Data == true)
Set LeakStatusResuh = 'Missing Op Data".
Set PriorLeakRecorcl.Tcst E\pi rat ion Datc Wi th E\tcnsion = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Leak Check Status Evaluation
Environmental Protection Agency
Page 650 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LKSTAT-5
Check Name:
Related Former Checks:
Determine Grace Period for Leak Check
Applicability:
Description:
CEM Check
Determines if Leak Check occurred prior to the end of the grace period.
Specifications:
if (LeakStatusResuIt is null)
if {Annual Reporting Requirement == false)
Set LeakStatusResuIt = "OOC-Expired".
else if (Rpt Period Op Hours Accumulator Array for the location == -1)
Set LeakStatusResuIt = "Invalid Op Data".
Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location,
if (GraceOpHours > 168)
Set LeakStatusResuIt = "OOC-Expired".
else
If the quarter after the LATER of the PriorLeakExpirationDate and the EarliestLocationReportDate is the
quarter of the CurrentMHVRecord.Date/Hour,
Set LeakStatusResuIt = "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)
else
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 Op Value to GraceOpHours.
if (GraceOpHours > 168)
Set LeakStatusResuIt = "OOC-Expired".
exit for.
else
Set LeakStatusResuIt = 'Missing Op Data".
Environmental Protection Agency
Page 651 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set LeakMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the year
of the quarter being checked and [QTR] is the number of the quarter being
checked.)
exit for.
if (LeakStatusResult is null)
Set LeakStatusResult = "IC-Grace".
if LeakStatusResult does not begin with "IC"
return LeakStatusResult
Results:
Result
Invalid Op Data
Missing Op Data
OOC-Event
OOC-Expired
OOC-No Prior
Test
OOC-Test
Aborted
OOC-Test Failed
OOC-Test Has
Critical Errors
Prior Test Not Yet
Evaluated
Usage:
1
Response
The [testtype] status for [key] could not be determined, because the OperatingTime in
at least one Hourly Operating Data records was missing or invalid.
The Leak Check status for [COMPID] could not be determined, because the Op Supp
Data record for OPHOURS or OSHOURS is missing for [MISSINGOPDATAINFO]
(and possibly other previous reporting periods). If you have submitted emissions data
for prior quarters, you should be able to retrieve these records by logging on to the EPA
host.
You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [eventdate] for [compid], but you did not perform a subsequent leak
check.
The prior leak check for [compid] completed on [date] has expired.
You did not report a prior [testtype] for [key].
The prior leak check for [compid] completed on [date] was aborted.
The prior leak check for [compid] completed on [date] failed.
The prior leak check for [compid] completed on [date] has critical errors.
The [testtype] status for [key] could not be determined, because the applicable prior
[testtype] with TestNumber [testnum] has not yet been evaluated.
Severity
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ Leak Check Status Evaluation
Environmental Protection Agency
Page 652 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Linearity Status
Environmental Protection Agency
Page 653 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LINSTAT-1
Check Name: Check Analyzer Range Exemption For Linearity Status
Related Former Checks:
Applicability: CEM Check
Description: This check determines if the Current Analyzer Range used is exempt for Linearity Status purposes.
Specifications:
Set CurrentLinearityStatus = null
if (CurrentMHVParameter = "S02C" or CurrentMHVParameter = "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 a nd MonitorSpanRecordsIiy Hour Location.n Va 1 lie <= 30)
Set CurrentLinearityStatus = "IC-Exempt".
Results:
Result
Usage:
Response
Severity
1
Process/Category:
Emissions Data Evaluation Report
C02 Linearity Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
Hg Linearity Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
NOX Linearity Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
5
Process/Category:
Emissions Data Evaluation Report
02 Dry Linearity Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
02 Wet Linearity Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 654 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LINSTAT-2
Check Name:
Related Former Checks:
Locate Most Recent Prior Linearity Test
Applicability:
Description:
CEM Check
Determines if there is an applicable prior Linearity test.
Specifications:
Set PriorLinearityRecord = null.
Set InvalidLinearifyRecord = 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 (L inearity Test Records By L ocation ForQAStatus i s found)
Set PriorLinearityRecord = 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 Prior 7es£/tecw
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Linearity Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
Hg Linearity Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
NOX Linearity Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
5
Process/Category:
Emissions Data Evaluation Report
02 Dry Linearity Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
02 Wet Linearity Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 656 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LINSTAT-3
Check Name:
Related Former Checks:
Locate Most Recent Prior Event
Applicability:
Description:
CEM Check
Determines if there is an applicable prior event.
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 Prior2es£/tecw LowRangeComponentID OR
c) QACertEventCode <> 27 or 30 or 172 and CurrentAnalyzerRangeUsed = "H" OR
d) QACertEventCode <> 35 or 171 and CurrentAnalyzerRangeUsed = "L"
AND either
a) Annual Reporting Requirement is equal to true OR
b) QACertEventDate/Hour is on or after April 1 of the year of the CurrentDateHour
if (QACertiflcationEventRecords is found)
Sort QACertiflcationEventRecords by QACertEventDate/Hour descending.
For each record in QACertiflcationEventRecords
Set PriorLinearityEventRecord = the found record in QACertiflcationEventRecords.
if (Priori, in earityE vent Record. Q A C c rt E vc n t C ode = 170 and DualRangeStatus = true)
Locate the record in MonitorSpanRecordsByLocation where the ComponentTypeCode is equal to
QaStatusComponentTypeCode and the SpanScaleCode is equal to the CurrentAnalyzerRangeUsed and
the BeginDate/Hour is equal to the PriorLinearityEventRecord.QACertEventDate/Hour.
if (MonitorSpanRecordsByLocation is found)
Environmental Protection Agency
Page 657 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
exit for loop.
else
set PriorLinearityEventRecord = null.
else
exit for loop.
If (PriorLinearityEventRecord is null)
If (PriorLinearityRecord is null)
Set CurrentLinearityStatus = "OOC-No Prior Test or Event".
else if (InvalidLinearityRecord is not null AND Priori, in earityE vent Record. Q A C c rt E vc n t D a tc/ H o u r 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 (L inearity Test Records By L ocation ForQAStatus i s found)
Set InvalidLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.
else
Set InvalidLinearityRecord = null.
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Linearity Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
Hg Linearity Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
NOX Linearity Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
5
Process/Category:
Emissions Data Evaluation Report
02 Dry Linearity Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
02 Wet Linearity Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 658 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LINSTAT-4
Check Name: Determine Expiration Dates For Most Recent Prior Linearity Test
Related Former Checks:
Applicability: CEM Check
Description: Determines the expiration dates for the Applicable Prior Linearity test. This includes the Test Expiration Date
both with and without any extensions
Specifications:
Set LinearityMissingOpDatalnfo = null.
if (CurrentLinearityStatus is blank and PriorLinearityRecord is not null and PriorLinearityEventRecord is null)
Set CheckForlgnoredLinearity = true.
Set PriorTestExpirationDate = null
Set PriorTestExpirationDate WithExtension = null
Set MissingOpData = false
if (Priori, in earity Record. Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentLinearityStatus = "Prior Test Not Yet Evaluated".
else if (Priori.inearityRecord.Test Resu 11Code = null or Priori.inearityRecord.Test Resu 11Code = "FAILED" or
Priori, in earity Record. Te s t Re s u 11C ode = "ABORTED")
Locate the most recent record in QACertiflcationEventRecords 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 Pri or Test Record. E n d D a t c/ H o u r:
AND either
a) DualRangeStatus = false OR
b) HighRangeComponentID <> LowRangeComponentID OR
c) QACertEventCode <> 27 or 30 or 172 and CurrentAnalyzerRangeUsed = "H" OR
d) QACertEventCode <> 35 or 171 and CurrentAnalyzerRangeUsed = "L"
AND either
a) Annual Reporting Requirement is equal to true OR
b) QACertEventDate/Hour is on or after April 1 of the year of the CurrentHourlyRecordforRA TAStatus. Date
if (QACertiflcationEventRecords is found)
Set PriorLinearityEventRecord = found record in QACertiflcationEventRecords.
elseif (Priori, in earity Record. Te s t Re s u 11C ode = null)
Set CurrentLinearityStatus = "OOC-Test Has Critical Errors",
elseif (PriorLinearityRecord.TestResultCode = "FAILED")
Environmental Protection Agency
Page 659 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set CurrentLinearityStatus = "OOC-Test Failed",
else if (PriorLinearity Record.TQStResultCode = "ABORTED")
Set CurrentLinearityStatus = "OOC-Test Aborted".
Set PriorTestExpirationDate = Priori, in ear ity Record. Test E \ p i ra t i o n Da tc.
Set PriorTestExpirationDate WithExtension = Priori.inearityRecord. Tcst E\pi rat ion Datc Wi th E\tcnsion.
if (PriorTestExpirationDate is null)
if (Annual Reporting Requirement == false)
if (PriorLinearityRecord.TestEndQuarter = "2")
Set PriorTestExpirationDate = July 30th following Prior Linearity Record. E ndDa tc.
else
Set PriorTestExpirationDate = April 30th following PriorLinearityRecord EndDate.
else
Set AIternateTestDate = null
if (Prior L in earity Record. C o m po n c n t Ty pc C ode is equal to "HG")
Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and the
EmissionsRecordingBeginDate is ON OR BEFORE the QaStatusComponentBeginDate.
if found
Set A IternateTestDate = EmissionsRecordingBeginDate of the located record
Locate the most recent QACertificationEventRecords for the ApplicableComponentID where
LinearityRequired is equal to "Y", and the BeginDate/Hour is prior to the
Prior Linearity Record. Bcgi liDatc/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.EndD'Mc/Hour)
If A IternateTestDate is null
Set PriorTestExpirationDate = the end of the quarter following the quarter of the
OA CertificationEventRecords. CompletionTestDate.
Else
Set PriorTestExpirationDate = the end of the quarter following the quarter of the later
of OACertificationEventRecords.Com^\cUonYc?XDi\\cimd A IternateTestDate.
else if (PriorL inearityRecord. G race Pc r i od I nd = l)
If A IternateTestDate is null
Environmental Protection Agency
Page 660 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set PriorTestExpirationDate = the end of the quarter of the quarter of the
PriorLinearityRecord.EndDatQ.
Else
Set PriorTestExpirationDate = the end of the quarter of the quarter of the later of
Prior Linearity Record. E ndDa tc a nd AlternateTestDate.
else
If AlternateTestDate is null
Set PriorTestExpirationDate = the end of the quarter following the quarter of the
Prior Linearity Record.EndDMc.
Else
Set PriorTestExpirationDate = the end of the quarter following the quarter of the later
of Prior Linearity Record. E ndDa tc a nd AlternateTestDate.
Set Priori, in ear ity Record. Test E\p i ra t i o n Date = PriorTestExpirationDate.
if (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate)
Set CurrentLinearityStatus = "IC".
else if {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 and continuing through the
quarter prior to the quarter of the CurrentDate,
if (NumberOfExtensionQuarters = 3)
Stop looking for extensions.
else
if (EarliestLocationReportDate > the last day of the quarter being checked)
Set NumberOfExtensionQuarters — NumberOfExtensionQuarters + 1.
else
If ( PrimarvBvpassActiveForHour is true AND OaStatusComponentTvpeCode
is "C02", "NOX" or "02" )
Locate a record in SystemOperatingSuppDataRecordsByLocation
where:
1) Systemld is equal to
Environmental Protection Agency
Page 661 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OaStatusPrimary Or Primary HypassSystemld.
2) Year is equal to the year being checked.
3) Quarter is equal to the quarter being checked.
4) OpSuppDataTypeCode = "OP".
If ( SystemOperatingSuppDataRecordsByLocation is found)
Set OperatingHourCount =
SystemOperatingSuppDataRecordsBy Location.Hours.
Else
Set OperatingHourCount = null.
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)
Set OperatingHourCount =
()peratingSuppl)ataRecordsIiyL ocation. O p Va 1 lie.
Else
Set OperatingHourCount = null.
if ( OperatingHourCount is NOT null AND OperatingHourCount < 168)
Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.
else if (PrioriAnearityRecord.Com\~>o\\c\\{J\\~>cCoAc is NOT equal to "HG")
Locate a record in TestExtensionExemptionRecords where the
ComponentID is equal to the ApplicableComponentID and the
ExtensionExemptionCode is equal to "RANGENU", and the
SpanScaleCode is equal to the CurrentAnalyzerRangeUsed and the
Year/Quarter is equal to the year/quarter to check.
if (TestExtensionExemptionRecords is found)
Set NumberOfExtensionQuarters =
NumberOfExtensionQuarters + 1.
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 ( OperatingHourCount is null)
If (the quarter being checked == 1 or 4)
Locate a LocationReportingFrequency record
Environmental Protection Agency
Page 662 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
for the test location where
ReportingFrequencyCode = "OS", the Begin
Quarter is on or before the quarter being
checked and the EndQuarter is null or is on or
before the quarter being checked.
If (LocationReportingFrequency record is
found)
if {Annual Reporting Requirement ==
true and the quarter being checked ==
4 and the year of the EndQuarter is
equal to the year of the quarter being
checked.
Set
NumberOfExtensionQuarters
NumberOfExtensionQuarters
+ 1.
else
Stop looking for extensions.
else
Set Missing Op Data to true
Set LinearityMissingOpDatalnfo =
"[YEAR] Q[QTR]" (where [YEAR] is
the year of the quarter being checked
and [QTR] is the number of the
quarter being checked.)
Stop looking for extensions.
Set Missing Op Data to true
Set LinearityMissingOpDatalnfo = "[YEAR]
Q[QTR]" (where [YEAR] is the year of the
quarter being checked and [QTR] is the
number of the quarter being checked.)
Stop looking for extensions.
Stop looking for extensions.
if (PriorLinearityRecord. ComponcntTypcCode is NOT equal to "HG")
For each quarter beginning with the quarter after the End Quarter and continuing through the
quarter prior to the quarter of the CurrentDateHour
Locate a record in TestExtensionExemptionRecords where the ComponentID is equal to
the ApplicableComponentID and the ExtensionExemptionCode is equal to
"NONQAPB", and the Year/Quarter is equal to the year/quarter to check.
if (TestExtensionExemptionRecords is found)
Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.
Environmental Protection Agency
Page 663 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set PriorTestExpirationDateWithExtension = PriorTestExpirationDate.
Add NumberOfExtensionQuarters to PriorTestExpirationDate WithExtension.
Set Priori.inearityRecord.Tcst E\pi rat ion Datc Wi th E\tcnsion = PriorTestExpirationDate WithExtension.
else
Set Priori, in earity Record. Tc s t E \ p i ra t i o n D a t c Wi t h E \ tc n s i o n = PriorTestExpirationDate
If (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate WithExtension)
Set CurrentLinearityStatus = "IC-Extension".
else if (.Missing Op Data == true)
Set CurrentLinearityStatus = 'Missing Op Data".
Set Priori, in earity Record. Tc s t E \ p i ra t i o n D a t c Wi t h E \ tc n s i o n = null
else
If ( PrimaryBypassActiveForHour is true AND QaStatusComponentTypeCode is "C02", "NOX" or
"02")
Set CurrentOpHours = Hours in SystemOperatingSuppDataDictionaryArray for the current
location where Systemld is equal to QaStatusPrimaryOrPrimaryBypassSystemld.
Else
Set CurrentOpHours = RptPeriodOpHoursAccumulatorArray for the location.
if ( CurrentOpHours == -1)
Set CurrentLinearityStatus = "Invalid Op Data".
else
Set Grace OpHours = CurrentOpHours .
if (GraceOpHours > 168)
Set CurrentLinearityStatus = "OOC-Expired".
else
If there are NO quarters beginning with the LATER of the quarter after the
PriorTestExpirationDate WithExtension 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
PriorTestExpirationDate WithExtension and continuing through the quarter prior
to the CurrentDateHour,
if (EarliestLocationReportDate <= the last day of the quarter being
Environmental Protection Agency
Page 664 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
checked)
If (PrimaryBypassActiveForHour is true AND
QaStatusComponentTypeCode is "C02", "NOX" or "02" )
Locate a record in
SystemOperatingSuppDataRecordsByLocation where:
1) Systemld is equal to
QaStatusPrimaryOrPrimaryBypassSystemld.
2) Year is equal to the year being checked.
3) Quarter is equal to the quarter being
checked.
4) OpSuppDataTypeCode = "OP".
If (SystemOperatingSuppDataRecordsByLocation is
found)
Set OperatingHourCount =
SystemOperatingSuppDataRecordsByLocatio
n. Hours.
Else
Set OperatingHourCount = null.
Else
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 )
Set OperatingHourCount =
()peratingSuppI)ataRecordsIiyL ocation. O p Va
lue.
Else
Set OperatingHourCount = null.
if ( OperatingHourCount is NOT null)
Add OperatingHourCount to GraceOpHours.
if (GraceOpHours > 168)
Set CurrentLinearityStatus = "OOC-Expired".
exit for.
else
Set CurrentLinearityStatus = 'Missing Op Data".
Set LinearityMissingOpDatalnfo = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked
and [QTR] is the number of the quarter being checked.)
exit for.
if (CurrentLinearityStatus is null)
Set CurrentLinearityStatus = "IC-Grace".
Environmental Protection Agency
Page 665 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response
Usage:
1 Process/Category:
2 Process/Category:
3 Process/Category:
4 Process/Category:
5 Process/Category:
6 Process/Category:
7 Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Severity
C02 Linearity Status Evaluation
Hg Linearity Status Evaluation
NOX Linearity Status Evaluation
NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
02 Dry Linearity Status Evaluation
02 Wet Linearity Status Evaluation
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 666 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LINSTAT-5
Check Name:
Related Former Checks:
Determine Event Conditional Status
Applicability:
Description:
Specifications:
CEM Check
If a QA Cert Event was found that affects this MHV record, evaluate the conditional status.
Set SubsequentLinearityRecord = null.
if (CurrentLinearityStatus is null and PriorLinearityEventRecord is not null)
if (PriorLinearityEventRecord.ConditionalDataBegiviDatdllom: is null or CurrentDateHour is prior to the
PriorLinearityEventRecord.ConditiomXD&XaBQgvaDatQftiovLX)
Set CurrentLinearityStatus = "OOC-Event".
else
Locate the earliest record in Linearity TestRecordsBy location ForQAStatus w here 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 Prior LinearityEventRecord.ConditiomXD&XaBQgvaDatdYiom.
if (L inearity Test Records By L ocation ForQAStatus i s found)
Set SubsequentLinearityRecord = the found record in Linearity TestRecordsByLocationForQAStatus.
if (L inearity TestRecordsByL ocation ForQAStatus. Q A Needs E va 1 ua t i o n F1 ag = "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 (Linearity TestRecordsByLocationForQAStatus.TestResultCode = "FAILED")
Set CurrentLinearityStatus = "OOC-Recertification Test Failed".
else if (Linearity TestRecordsByLocationForQAStatus.TestResultCode = "ABORTED")
Set CurrentLinearityStatus = "OOC-Recertification Test Aborted".
If (InvalidLinearityRecord is null)
Locate the earliest record in Linearity TestRecordsBy Location ForQAStatus 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.CoiciditiomXD&XaBQgvaDatQftiom and is before the EndDate/EndHour of the
Linearity TestRecordsByLocationForQAStatus record retrieved above.
if (L inearity Test Records By L ocation ForQAStatus i s found)
Set InvalidLinearity Record = the found record in
Linearity TestRecordsByLocationForQAStatus.
if (PriorLinearityEventRecord.SystemTypeCode == "HG") AND (PrioriJnearityEventRecord.E\cnlCodc in set {"100",
Environmental Protection Agency
Page 667 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
"101", "120", "125")
Set CurrentLinearityStatus = "IC-Skip Duplicate Checking for Hg Conditional Data".
if (CurrentLinearityStatus is null AND Annual Reporting Requirement == false)
If (SubsequentLinearityRecord is not null and SubsequentLinearity Record.EndDi\\dY\oux is greater than
October 30th of the year of the CurrentDateHour) OR (Sub sequentLinearity Record is null and the
CurrentDateHour is in the 3rd quarter))
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
if (CurrentLinearityStatus is null)
if (Priori, in earityE vent Record. Li n ca r i ty C c rt E y e n t == "Y") and (PriorLinearityEventRecord.SystemTypeCode is
NOT in set (ST))
if (Priori, in earityE ventRecord. Eve lit Code = 125)
If (PriorLinearityEventRecord Mon\\ox\ngSystcmID 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
ProgramRequiresSo2SystemCertiJicationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
ProgramRequiresSo2SystemCertiJicationList 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
ProgramRequiresNoxSystemCertificationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
ProgramRequiresNoxSystemCertificationList and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorLinearityEventRecord.
Environmental Protection Agency
Page 668 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
ProgramRequiresNoxcSystemCertificationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
ProgramRequiresNoxcSystemCertificationList and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorLinearityEventRecord.
else if (the associated SystemTypeCode of the system in the PriorLinearityEventRecord
== "HG")
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {MATS} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
set {MATS} and the EmissionsRecordingBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorLinearityEventRecord.
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the UnitMonitorCertBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorLinearityEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Set CurrentLinearityStatus = 'Missing Program".
else if (LocationProgramRecordsByHourLocationUnitMomtorCertDeadline is not null)
if (CurrentDate is prior to the
LocationProgramRecordsByHourLocation.UmtMomtorCertDeadlme)
Set CurrentLinearityStatus = "IC-Conditional".
else
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
Environmental Protection Agency
Page 669 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
if (CurrentDate is prior to the
LocationProgramRecordsByHourLocationUnitMomtorCertBeginDate +180
days)
Set CurrentLinearityStatus = "IC-Conditional".
else
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
else
If (the number of calendar days ON OR AFTER the
Priori, in earityE vent Record. Q A C c rt E vc n t D a t c and ON OR BEFORE the CurrentDateHour >
180)
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
else if (the quarter of the Priori, in earityE vent Record. Q A C c rt E vc n t D a t c is equal to the quarter of
the CurrentDateHour)
If (the number of calendar days ON OR AFTER the
Priori, in earityE vent Record. Q A C c rt E vc n t D a t c and ON OR BEFORE the
CurrentDateHour > 90)
If ( PrimarvBvpassActiveForHour is true AND OaStatusComponentTvpeCode
is "C02", "NOX" or "02" )
If (Days in QaCertEventSuppDataDictionaryArray for the current
location and QA Cert Event Date where QaCertEventKey is equal to
Priori, in earityE ventRecord. Q a C c rt E vc n t K cy >90)
Set CurrentLinearityStatus = "OOC-Conditional Period
Expired".
Else
Set CurrentLinearityStatus = "IC-Conditional".
Else
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
Priori, in earityE ventRecord. Q A C c rt E vc n t D a t c 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 (Prior L in earityE ventRecord. M i n O p D ay s P ri o rQ ua rt e r is null)
Set PriorLinearityEventRecord.MinOpDaysPriorQuarter = 0
Set PriorLinearityEventRecord.MaxOpDaysPriorQuarter = 0
for each quarter beginning with the quarter of the
Environmental Protection Agency
Page 670 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Priori. in earityE vent Record. Q A C c rt E vc n t D a t c and continuing through the quarter
BEFORE the CurrentDateHour:
if (EarliestLocationReportDate <= the last day of the quarter being checked)
If (PrimaryBypassActiveForHour is true AND
QaStatusComponentTypeCode is "C02", "NOX" or "02" )
Locate a record in
SystemOperatingSuppDataRecordsByLocation where:
1) Systemld is equal to
QaStatusPrimaryOrPrimaryBypassSystemld.
2) Year is equal to the year being checked.
3) Quarter is equal to the quarter being checked.
4) OpSuppDataTypeCode = "OP".
If ( SystemOperatingSuppDataRecordsByLocation is found)
Set OperatingDayCount =
SystemOperatingSuppDataRecordsByLocationDays.
Else
Set OperatingDayCount = null.
Else
Locate the record in OperatingSuppDataRecordsbyLocation
where the OpTypeCode is equal to "OPD AYS" and the
reporting period is equal to the quarter being checked.
If ( OperatingSuppDataRecordsbyLocation is found)
Set OperatingDayCount =
()peratingSuppI)ataRecordsIiyL ocation. O p Va 1 lie.
Else
Set OperatingDayCount = null.
if ( OperatingDayCount is null)
Set Priori, in earityE vent Record. M i n O p D ay s P ri o rQ ua rtc r = -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
Priori, in earityE ventRecord. Q A C c rt E vc n t D a tc)
supplementalCount = null.
If (PrimaryBypassActiveForHour is true AND
QaStatusComponentTypeCode is "C02", "NOX" or "02"
AND
Pmw'Z.iweariYyii'vewi/tecorrf.QaCertEventDateSystemSuppData
Exists is true)
supplementalCount =
PriorLinearityEventRecord.QaCertEventSystemOpDa
ysCount.
Environmental Protection Agency
Page 671 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Environmental Protection Agency
If (supplementalCount is null AND
PriorLinearityEventRecordQaCertEventDateSuppDataExists is
true)
supplementalCount =
Priori, in earityE vent Record. Q a C c rt E vc n t O p D ay s C o u n t
If (supplementalCount is NOT null)
Set
PriorLinearityEventRecord.MinOpDaysPriorQuarter =
PriorLinearityEventRecord.MinOpDaysPnorQuarter +
supplementalCount.
Set
PriorLinearityEventRecord.MaxOpDaysPriorQuarter
PriorLinearityEventRecord.MaxOpDaysPriorQuarter
+ supplementalCount.
Else
If ( OperatingDayCount MINUS the number of
calendar days in the quarter being checked that are
PRIOR to the
Priori, in earityE ventRecord. Q A C c rt E vc n t D a tc > 0)
Set
Priori, in earityE ventRecord. IVI i n O p D ay s P ri o r
Quarter = OperatingDayCount MINUS the
number of calendar days in the quarter being
checked that are PRIOR to the
Priori, in earityE ventRecord. Q A C c rt E vc n t D a tc
If ( OperatingDayCount is less than the number of
calendar days in the quarter being checked that are ON
OR AFTER the
PriorLinearityEventRecord.QACertEventDate)
Set
Priori, in earityE ventRecord. IVI a x O p D ay s P ri o r
Quarter = OperatingDayCount.
else
Set
Priori, in earityE ventRecord. IVI a x O p D ay s P ri o r
Quarter = the number of calendar days in the
quarter being checked that are ON OR AFTER
the
Priori, in earityE ventRecord. Q A C c rt E vc n t D a tc
Set Priori, in earityE ventRecord. M i n O p D ay s P ri o rQ ua rtc r =
PriorLinearityEventRecord.MinOpDaysPnorQuarter +
Page 672 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OperatingDayCount.
Set Priori, in earityE vent Record. M a x O p D ay s P r i o rQ ua rt e r =
PriorLinearityEventRecord.MaxOpDaysPriorQuarter +
OperatingDayCount.
If ( PrimaryBypassActiveForHour is true AND QaStatusComponentTypeCode is
"C02", "NOX" or "02" )
Set CurrentOpDays to Days in SystemOperatingSuppDataDictionaryArray for
the current location where Systemld is equal to
QaStatusPrimaryOrPrimaryBypassSystemld.
Else
Set CurrentOpDays to Rpt Period Op Days Accumulator Array for the
Location.
if (PriorLinearityEventRecord.MmOpDaysPnorQuarter == -1
set CurrentLinearityStatus to "Missing Op Data"
else if (PriorEventRecord. IVT i nOpDaysPriorQuartcr + CurrentOpDays > 90)
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
else if (PriorEventRecordMvaO^DaysVnoxQymtex ==
PriorEventRecordM'c\\0\~>r>'c\\s?Y'\orQu'c\Y{cr)
Set CurrentLinearityStatus = "IC-Conditional".
else if (PriorEventRecordM'c\\0\~>r>'c\\s?Y'\orQu'c\Y{cr + CurrentOpDays > 90)
Set CurrentLinearityStatus = "Undetermined-Conditional Data".
else
Set CurrentLinearityStatus = "IC-Conditional".
Set CurrentLinearityStatus = "IC-Conditional".
If (the quarter of the Priori. in earityE vent Record. C o n d i t i o n a 1B eg i n D a t c is equal to the quarter of the
CurrentDateHour)
If ( PrimaryBypassActiveForHour is true AND QaStatusComponentTypeCode is "C02",
"NOX" or "02")
If (Hours in QaCertEventSuppDataDictionaryArray for the current location and
Conditional Data Begin Hour where QaCertEventKey is equal to
Priori, in earityE ventRecord. Q a C c rt E vc n t K cv > 168)
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
Else
Set CurrentLinearityStatus = "IC-Conditional".
Else
Count the number of HourlyOpData records for the location where OpTime is greater
than 0 and Date/Hour is ON OR AFTER the
PriorLinearityEventRecord.CondiitiomXBQgvaDatQrRom and ON OR BEFORE the
CurrentDateHour,
Environmental Protection Agency
Page 673 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If the number >168,
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
else
Set CurrentLinearityStatus = "IC-Conditional".
if (PriorLinearityEventRecord.MmOpRowLsPnorQuarter is null)
Set PrioriAnearity EventRecord. IVT i nOpHoursPriorQuartcr = 0
Set PriorLinearityEventRecord.MaxOpHoursPriorQuarter = 0
for each quarter beginning with the quarter of the
Priori, in earityE vent Record. C o n d i t i o n a 1B eg i n D a t c and continuing through the quarter
BEFORE the CurrentDateHour :
if (EarliestLocationReportDate <= the last day of the quarter being checked)
If (PrimaryBypassActiveForHour is true AND
QaStatusComponentTypeCode is "C02", "NOX" or "02" )
Locate a record in
SystemOperatingSuppDataRecordsByLocation where:
1) Systemld is equal to
QaStatusPrimaryOrPrimaryBypassSystemld.
2) Year is equal to the year being checked.
3) Quarter is equal to the quarter being checked.
4) OpSuppDataTypeCode = "OP" if Annual
Reporting Requirement == true OR the quarter being
checked != 2, otherwise "OPMJ".
If ( SystemOperatingSuppDataRecordsByLocation is found)
Set OperatingHourCount =
SystemOperatingSuppDataRecordsHy Location.Hours.
Else
Set OperatingHourCount = null.
Else
if (Annual Reporting Requirement == false ) AND (the
quarter being checked == 2 )
Locate the record in
OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OSHOURS" and the reporting
period is equal to the quarter being checked.
else
Locate the record in
OperatingSuppDataRecordsbyLocation where the
OpTypeCode is equal to "OPHOURS", FuelCode is
null, and the reporting period is equal to the quarter
being checked.
Environmental Protection Agency
Page 674 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If ( OperatingSuppDataRecordsByLocation is found )
Set OperatingHourCount =
()peratingSuppI)ataRecordsliyL ocation. O p Va 1 lie.
Else
Set OperatingHourCount = null.
if ( OperatingHourCount is null)
Set PriorLinearityEventRecord. IVT i nOpHoursPriorQuartcr = -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)
supplementalCount = null.
If (PrimaryBypassActiveForHour is true AND
QaStatusComponentTypeCode is "C02", "NOX" or "02"
AND
Priori, in earityE vent Record. C o n d i t i o n a 1B eg i n H o u r Sy s t c m S u p p
DataExists is true)
supplementalCount =
Priori, in earityE vent Record. C o n d i t i o n a 1B eg i n Sy s t c m O
pHoursCount.
If (supplementalCount is null AND
PriorLinearityEventRecord. ConditionalBeginHourSuppDataExi
sts is true)
supplementalCount =
Prior L in earityE vent Record. C o n d i t i o n a 1B eg i n O p H o u rs
Count.
If (supplementalCount is NOT null)
Set
PriorLinearityEventRecord. IVT i nOpHoursPriorQuartcr
PriorLinearityEventRecord. IVT i nOpHoursPriorQuartcr
+ supplementalCount.
Set
PriorLinearityEventRecord.MaxOpHoursPriorQuarter
PriorLinearityEventRecord. MaxOpHoursPriorQuarter
+ supplementalCount.
Else
If ( OperatingHourCount MINUS the number of
calendar hours in the quarter being checked that are
PRIOR to the
PriorLinearityEventRecord.ConditiomXBQgvaDatQTRo
Environmental Protection Agency
Page 675 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
ur>0)
Set
PriorlAnearityEventRecord. IVT i nOpHoursPrior
Quarter = OperatingHourCount MINUS the
number of calendar hours in the quarter being
checked that are PRIOR to the
Priori, in earityE vent Record. C o n d i t i o n a 1B eg i n
Date/Hour
If ( OperatingHourCount is less than the number of
calendar hours in the quarter begin checked that are
ON OR AFTER the
PriorlAnearityEventRecord.Cond\Uom\Bcgh\D'Mc/Ho
ur)
Set
Prior L in earityE vent Record. IVI a \ O p H o u r s P r i o r
Quarter = OperatingHourCount.
else
Set
Prior L in earityE vent Record. IVI a \ O p H o u r s P r i o r
Quarter = the number of calendar hours in the
quarter being checked that are ON OR AFTER
the
Prior L in earityE vent Record. C o n d i t i o n a 1B eg i n
Date/Hour.
else
Set PriorlAnearityEventRecord. IVI i nOpHoursPriorQuartcr =
PriorlAnearityEventRecord. IVI i nOpHoursPriorQuartcr +
OperatingHourCount.
Set Prior L in earityE vent Record. IVI a x O p H o u r s PriorQuarter =
PriorlAnearityEventRecord .MaxOpHoursPriorQivMcr +
OperatingHourCount.
If ( PrimaryBypassActiveForHour is true AND QaStatusComponentTypeCode is "C02",
"NOX" or "02")
Set CurrentOpHours to Hours in SystemOperatingSuppDataDictionaryArray for the
current location where Systemld is equal to
OaStatusPrimaryOrPrimary/iypassSystemld.
Else
Set CurrentOpHours to Rpt Period Op Hours Accumulator Array for the Location.
if (PriorLinearityEventRecord. IVI i nOpHoursPriorQuartcr == -1)
set CurrentLinearityStatus to "Missing Op Data"
else if {Rpt Period Op Days Accumulator Array for the location == -1)
if (PriorEventRecord. IVI i nOpHoursPriorQuartcr >168)
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
Environmental Protection Agency
Page 676 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Set CurrentLinearityStatus = "Invalid Op Data".
else
if (Prior EventRecorcl. IVT i nOpHoursPriorQuartcr + CurrentOpHours > 168)
Set CurrentLinearityStatus = "OOC-Conditional Period Expired".
else if ( Prior EventRecorcl. IVT i nOpHoursPriorQuartcr ==
PriorEventRecord.MaxOpHoursPnorQuarter)
Set CurrentLinearityStatus = "IC-Conditional".
else if (PriorEventRecord.MaxOpHoursPriorQuarter + CurrentOpHours > 168)
Set CurrentLinearityStatus = "Undetermined-Conditional Data".
else
Set CurrentLinearityStatus = "IC-Conditional".
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Linearity Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
Hg Linearity Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
NOX Linearity Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
5
Process/Category:
Emissions Data Evaluation Report
02 Dry Linearity Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
02 Wet Linearity Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 677 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LINSTAT-6
Check Name: Determine Final Linearity Status
Related Former Checks:
Applicability: CEM Check
Description: Evaluates the determined Linearity Status and changes it if needed based on an ignored test or the status of the
alternate range.
Specifications:
Set AlternateLinearifyRecord = null
Set AlternatelnvalidLinearifyRecord = null
if {CurrentLinearityStatus begins with "OOC")
if (InvalidLinearityRecord is not null)
Set CurrentLinearity Status = CurrentLinearity Status &
Return result CurrentLinearity Status.
else if (CurrentLinearityStatus= "Invalid Monitor Span")
if (CurrentAnalyzerRangeUsed = "H")
Set CurrentLinearity Status = CurrentLinearity Status & " (High Scale)".
else
Set CurrentLinearity Status = CurrentLinearity Status & " (Low Scale)".
Return result CurrentLinearity Status.
else if (DualRangeStatus = true and CurrentLinearityStatus begins with "IC" or "Undetermined")
if (CurrentAnalyzerRangeUsed = "H")
Set AlternateAnalyzerRange = "L".
Set AlternateComponentID= LowRangeComponentW.
else
Set AlternateAnalyzerRange = "H".
Set AlternateComponentID= HighRangeComponentlD.
for each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the
A IternateComponentID
AppendMonitorSystemComponentRecordsByHourLocation.SystemlD 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.
Environmental Protection Agency
Page 678 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (MonitorSpanRecordsByHourAndLocation is not found OR more than one MonitorSpanRecordsByHourAndLocation
is found or MonitorSpanRecordstlyHourAndLocation.SpmVMuc 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.SipanVahie < =30)
If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.
else
exit check.
Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AlternateComponentID where the
SpanScaleCode is equal to the AlternateAnalyzerRange and the CalculatedTestResult is not equal to "INVALID" and the
EndDate/Hour is either:
a) prior to the CurrentDateHour OR
b) equal to the CurrentDateHour and the EndMinute is less than "45" and the CalculatedTestResult is equal to "PASSED" or
"PASSAPS".
if (L inearity Test Records By L ocation ForQAStatus i s 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 A Item ateL in earity Record. EndDate/Hour OR
c) QACertEventDate/Hour is equal to the A Item ateL in earity Record. EndDate/Hour AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the A Item ateL in earity Record. EndDate/Hour)
AND either
a) DualRangeStatus = false OR
b) HighRangeComponentID <> LowRangeComponentID OR
c) QACertEventCode <> 27 or 30 or 172 and AlternateAnalyzerRange = "H" OR
d) QACertEventCode <> 35 or 171 and AlternateAnalyzerRange = "L"
Environmental Protection Agency
Page 679 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (QACertificationEventRecords is found)
if (QACertificationEventRecords.ConditionalBeginDate/Hour is null or CurrentDateHour is prior to the
OA CertificationEventRecords. ConditionalBeginDate/Hour)
If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.
Locate the most recent record in LinearityTestRecordsByLocationForQAStatus for the AlternateComponentID
where the SpanScaleCode is equal to thq AlternateAnalyzerRange, the CalculatedTestResult is equal to
"INVALID", and the EndDate/Hour is after the OACertificationEventRecords.Q ACcrtEvcntDatc/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 LinearityTestRecordsByLocationForQAStatus where the ComponentID is equal to the
AlternateComponentID, the SpanScaleCode is equal to the AlternateAnalyzerRange,the CalculatedTestResult is
not equal to "INVALID", and the EndDate/Hour is on or after the
(>/4C.'6'/*fryie
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (A Item ateL in earityRecord. Te s t Re s u 11C ode = "ABORTED")
Set CurrentLinearityStatus = "OOC-Alternate Range Recertification Test Aborted",
if (AlternatelnvalidLinearityRecord is not null)
Set CurrentLinearityStatus = CurrentLinearityStatus &
If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.
else
if (A Item ateL in earity Record is found)
if (A It em ateL in earity Record. Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentLinearityStatus = "Alternate Range Test Not Yet Evaluated".
else if (A Item ateL in earityRecord. Test Res u It Code 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
A Item ateL in earityRecord. E nd D a tc/H o u r and the CalculatedTestResult is equal to "INVALID".
if (L in earity Test Records By L ocation ForQAStatus i s found)
Set AlternatelnvalidLinearityRecord = the found record in
Linearity TestRecordsByLocationForQAStatus.
if (A Item ateL in earityRecord .TestResultCode = null)
Set CurrentLinearityStatus = "OOC-Alternate Range Test Has Critical Errors",
if (AlternatelnvalidLinearityRecord is not null)
Set CurrentLinearityStatus = CurrentLinearityStatus &
else if (A Item ateL in earityRecord. Te s t Re s u 11C ode = "FAILED")
Set CurrentLinearityStatus = "OOC-Alternate Range Test Failed",
if (AlternatelnvalidLinearityRecord is not null)
Set CurrentLinearityStatus = CurrentLinearityStatus &
else if (A Item ateL in earityRecord. Te s t Re s u 11C ode = "ABORTED")
Set CurrentLinearityStatus = "OOC-Alternate Range Test Aborted",
if (AlternatelnvalidLinearityRecord is not null)
Set CurrentLinearityStatus = CurrentLinearityStatus &
else
Set CurrentLinearityStatus = "OOC-No Prior Alternate Range Test or Event".
else
If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.
If (CurrentLinearityStatus does not begin with "IC")
Return result CurrentLinearityStatus.
Environmental Protection Agency
Page 681 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Environmental Protection Agency Page 682 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Alternate Range
Recertification
Test Not Yet
Evaluated
Alternate Range
Test Not Yet
Evaluated
Invalid
Certification
Event
Invalid Monitor
Span (High
Scale)
Invalid Monitor
Span (Low Scale)
Invalid Monitor
System
Invalid Monitor
System
Component
Invalid Op Data
Missing Op Data
Missing Program
OOC-Alternate
Range
Recertification
Test Aborted
OOC-Alternate
Range
Recertification
Test Aborted*
OOC-Alternate
Range
Recertification
Test Failed
OOC-Alternate
Range
Recertification
Test Failed*
OOC-Alternate
Range
Recertification
Test Has Critical
Errors
Response Severity
The [testtype] status for [key] could not be determined, because the prior [testtype] for Critical Error Level 1
the alternate range component with TestNumber [alttestnum] has not yet been
evaluated.
The [testtype] status for [key] could not be determined, because the prior [testtype] for
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.
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
The [testtype] status for [key] could not be determined, because you did not report a
single, valid low-scale [comptype] span record that was active during the test.
The [testtype] status for [key] could not be determined, because the Monitor System
record for MonitoringSystemID [system] has a critical error.
The [testtype] status for [key] could not be determined, because you did not report any
active Monitor System Component records for the alternate range of the component.
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
The [testtype] status for [key] could not be determined, because the OperatingTime in
at least one Hourly Operating Data records was missing or invalid.
The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [testtype] status for [key] could not be determined, because a Unit Program record
associated with the initial certification event for QACertEventCode [code]
QACertEventDate [eventdate] either does not exist or has a
UnitMonitorCertificationBeginDate inconsistent with the BeginDate of the associated
Monitor System record.
The subsequent recertification [testtype] for the alternate range of the component for
[key] with TestNumber [alttestnum] was aborted.
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
The subsequent recertification [testtype] for the alternate range of [key] with Critical Error Level 1
TestNumber [alttestnum] was aborted. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.
The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] failed.
The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] failed. An invalid [testtype] with TestNumber
[altinvtestnum] was ignored.
The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level 1
[key] with TestNumber [alttestnum] has critical errors.
Environmental Protection Agency
Page 683 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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
3-Point SI or
Event
OOC-No Prior
Alternate Range
Test or Event
OOC-No Prior
Test or Event
OOC-No Prior
Test or Event*
OOC-Recertificat
ion Test Aborted
OOC-Recertificat
ion Test Aborted*
OOC-Recertificat
ion Test Failed
OOC-Recertificat
ion Test Failed*
OOC-Recertificat
ion Test Has
Critical Errors
OOC-Recertificat
ion Test Has
Critical Errors*
The subsequent recertification [testtype] for the alternate range of the component for Critical Error Level
[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.
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. A prior test 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 three-point Hg system integrity check or certification event
for [key].
You did not report a prior [testtype] or certification event for the alternate range of the
component for [key].
You did not report a prior [testtype] or certification event for [key].
You did not report a valid prior [testtype] or certification event for [key]. An invalid
[testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] was
aborted.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] was
aborted. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
failed.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum]
failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] has
critical errors.
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
The subsequent recertification [testtype] for [key] with TestNumber [subtestnum] has
critical errors. An invalid [testtype] with TestNumber [invtestnum] was ignored.
Critical Error Level
Environmental Protection Agency
Page 684 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OOC-Test
Aborted
OOC-Test
Aborted*
OOC-Test Failed
OOC-Test
Failed*
OOC-Test Has
Critical Errors
OOC-Test Has
Critical Errors*
Prior Test Not Yet
Evaluated
Recertification
Test Not Yet
Evaluated
Undetermined-C
onditional Data
The applicable prior [testtype] for [key] with TestNumber [testnum] was aborted.
The prior [testtype] for [key] with TestNumber [testnum] was aborted. An invalid prior
[testtype] with TestNumber [invtestnum] was ignored.
The applicable prior [testtype] for [key] with TestNumber [testnum] failed.
The prior [testtype] for [key] with TestNumber [testnum] failed. An invalid prior
[testtype] with TestNumber [invtestnum] was ignored.
The applicable prior [testtype] for [key] with TestNumber [testnum] has critical errors.
The prior [testtype] for [key] with TestNumber [testnum] has critical errors. An
invalid prior [testtype] with TestNumber [invtestnum] was ignored.
The [testtype] status for [key] could not be determined, because the applicable prior
[testtype] with TestNumber [testnum] has not yet been evaluated.
The [testtype] status for [key] could not be determined, because the subsequent
recertification [testtype] for the component with TestNumber [subtestnum] has not yet
been evaluated.
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for [key]
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Informational Message
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02 Linearity Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
Hg Linearity Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
NOX Linearity Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
-— NOXR Unused P-PB C02C, NOXC or 02C Linearity St;
5
Process/Category:
Emissions Data Evaluation Report
02 Dry Linearity Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
02 Wet Linearity Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
S02 Linearity Status Evaluation
Environmental Protection Agency
Page 685 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LINSTAT-7
Check Name: Ensure Certifiying Three Level System Integrity Test Exists for Component
Related Former Checks:
Applicability: General Check
Description: For a Hg CEMS component, when LINSTAT-4 has assigned a status of IC, IC-Extension or IC-Grace, perform
the following:
1) Locate the most recent 3-Level SI.
2) If one does not exist, return a result.
3) Otherwise, locate an intervening certification event (120, 125) for the component.
4) If an event was located, do nothing.
5) Otherwise, return "OOC- No Priior HGSI3 Test or Event".
Specifications:
Set MatsCheckForHgsi3Ran to false.
If (CurrentLinearityStatus is equal to "IC", "IC-Extension" or "IC-Grace")
If (PrioriAnearityRecord.Co\\\\~>o\\c\\{J\\~)cCoAc is equal to "HG")
Locate the most recent record in Linearity TestRecordsByLocationForQAStatus where:
1) ComponentID is equal to Priori.inearityRecord. Componcn11d.
2) TestTypeCode is equal to "HGSI3".
3) TestResultCode is equal to "PASSED" or "PASSAPS".
4) EndDateHour is prior to CurrentDateHour.
If NOT found,
Set CurrentLinearityStatus to "OOC-No Prior 3-Point SI or Event".
Else
Count records in QACertificationEventRecords where:
1) ComponentID is equal to Prior L in earity Record. C o m po n c n 11 d.
2) QACertEventCode is equal to 120 or 125.
3) QACertEventDate/Hour is prior to CurrentDateHour.
4) QACertEventDate/Hour is after the EndDateHour of the located
Linearity TestRecordsByLocationForQAStatus record.
If the count is greater than 0,
Set CurrentLinearityStatus to "OOC-No Prior 3-Point SI or Event".
Set MatsCheckForHgsi3Ran to true.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hg Linearity Status Evaluation
Environmental Protection Agency
Page 686 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
LME
Environmental Protection Agency
Page 687 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-11
Check Name: Check LTFF System
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If MonitoringSystemID is null,
return result A.
else
Locate the Monitor System record for the MonitoringSystemID.
If the associated SystemTypeCode is not equal to "LTOL" or "LTGS",
return result B.
Results:
Result Response 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-term fuel Critical Error Level 1
flow system.
Usage:
1 Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
1 Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 688 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-13
Check Name: Check Long Term Fuel Flow Value
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If the LongTermFuelFlowValue is null or is less than or equal to 0,
return result A.
Results:
Result Response Severity
A The [fieldname] reported in the LTFF record for [key] is missing or invalid. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
1 Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 689 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-14
Check Name:
Check Long Term Fuel Flow UOM
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
For the LTFF record:
If the LongTermFuelFlowUOMCode is null,
return result A.
Otherwise,
If the SystemTypeCode is "LTOL" and the LongTermFuelFlowUOMCode is not in set {"LB", "GAL"},
return result A.
If the SystemTypeCode is "LTGS" and the LongTermFuelFlowUOMCode is not equal to "SCF",
return result A.
Results:
Result
A
Response
The [fieldname] reported in the LTFF record for [key] is missing or invalid.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
1
Process/Category: LME Emissions Data Generation LTFF Heat Input Data
1
Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 690 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-15
Check Name: Check LTFF GCV
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If the GrossCalorific Value is null or is less than or equal to 0,
return result A.
Results:
Result Response Severity
A The [fieldname] reported in the LTFF record for [key] is missing or invalid. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
1 Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 691 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-16
Check Name:
Check LTFF GCV UOM
Related Former Checks:
Applicability:
LME Check
Description:
Validation Tables:
Fuel Type Reality Checks for GCV (Cross Check Table)
Fuel Type Warning Levels for GCV (Cross Check Table)
Fuel Type Reality Checks for GCV (Cross Check Table)
Fuel Type Warning Levels for GCV (Cross Check Table)
Fuel Type Reality Checks for GCV (Cross Check Table)
Fuel Type Warning Levels for GCV (Cross Check Table)
Specifications:
For the LTFF record:
LME Gen LTFF Heat Input = null.
If the GCVUnitsOfMeasureCode is null,
return result A.
Otherwise,
If the LongTermFuelFlowUOMCode is "LB" and the GCVUnitsOfMeasureCode is not equal to "BTULB",
return result A.
If the LongTermFuelFlowUOMCode is "GAL" and the GCVUnitsOfMeasureCode is not equal to "BTUGAL",
return result A.
If the LongTermFuelFlowUOMCode is "SCF" and the GCVUnitsOfMeasureCode is not equal to "BTUSCF",
return result A.
Otherwise,
If GrossCalorificValue is greater than 0 and LongTermFuelFlowValue is greater than 0,
Calculate LME Gen LTFF Heat Input = 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
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
Environmental Protection Agency
Page 692 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response
A The [fieldname] reported in the LTFF record for [key] is missing or invalid.
B 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 GrossCalorific Value reported in the long-term fuel flow record for [key] is outside
the range of expected values for the fuel type [fueled].
C
Usage:
1
Severity
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
1 Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 693 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-41
Check Name: Check LTFF Fuel Flow Period Code
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If LME OS is equal to true,
If the Quarter of the Current Reporting Period is equal to 2,
If the FuelFlowPeriodCode is null,
return result A.
Otherwise,
If the FuelFlowPeriodCode is not null,
return result B.
Otherwise,
If the FuelFlowPeriodCode is not null,
return result C.
Results:
Result
A
B
C
Usage:
1
Response
You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value is
required for LME units with an ozone-season qualification during the second quarter.
You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only
appropriate during the second quarter.
You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only
appropriate for LME units with an ozone-season qualification.
Process/Category: 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 694 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-42
Check Name:
Check LTFF Total Heat Input
Related Former Checks:
Applicability:
LME Check
Description:
Validation Tables:
Hourly Emissions Tolerances (Cross Check Table)
Specifications:
For the Current LTFF record:
If LME Gen LTFF Heat Input is not null,
If LME Total Heat Input Array for the location is greater than or equal to 0,
add LME Gen LTFF Heat Input to LME Total Heat Input Array for the location.
If LME OS is true and the Current LTFF Record. FuelFlowPeriodCode is equal to "A",
add LME Gen LTFF Heat Input to LME April Total Heat Input Array for the location.
If (the LocationName begins with "CP")
If LME CP Total Heat Input is greater than or equal to 0,
add LME Gen LTFF Heat Input to LME CP Total Heat Input.
If LME OS is true and the Current LTFF Record. FuelFlowPeriodCode is equal to "A",
add LME Gen L TFF Heat Input to LME CP April Heat Input.
Set LME Total Heat Input Array for the location to -1.
If (the LocationName begins with "CP")
set LME CP Total Heat Input to -1.
If (the LocationName begins with "CP")
Rpt Period HI Calculated Accumulator Array for this location = LME Total Heat Input Array for the location.
April HI Calculated Accumulator Array for this location = LME Total April Input Array for the location
Expected Summary Value HI Array for this location = true
If Current /. TFF Record.To\a 1Hca 11 nput is greater than or equal to 0,
If (the LocationName begins with "CP" AND Rpt Period HI Reported Accumulator Array for this location is greater
than or equal to 0)
Rpt Period HI Reported Accumulator Array for this location = Rpt Period HI Reported Accumulator Array for
this location + Current ///'FF/?6'cmy/.Total Heat Input
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"
else
if (ABS {Current LTFF Total Heat I nput - LME Gen LTFF Heat Input) > Heat Input Tolerance)
return result A.
else
If (the LocationName begins with "CP")
Rpt Period HI Reported Accumulator Array for this location = -1.
return result B
Environmental Protection Agency
Page 695 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A The TotalHeatlnput reported in the LTFF record for [key] is inconsistent with the Critical Error Level 1
recalculated value.
B The [fieldname] reported in the LTFF record for [key] is missing or invalid. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — Long Term Fuel Flow
Environmental Protection Agency
Page 696 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-10
Check Name: Determine Total Load for Reporting Period
Related Former Checks: LME-EXP8A
Applicability: LME Check
Description:
Specifications:
Set LME Gen L TFF 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 C02MArray, LME Gen Total Op Time Array, LME Gen Total Op Hours Array, and
LME Gen LTFF Total Op Time Array to 0 for each location in the monitor configuration.
Set LME Gen LTFF April Heat Input Array, LME Gen April Heat Input Array, LME Gen April Load Array, LME Gen April NOXM
Array, LME Gen April Op Time Array, LME Gen April Op Hours Array, and LME Gen L TFF April Op Time Array to 0 for each
location in the monitoring configuration.
Set LME Gen CP Total Heat Input, LME Gen Total Load, and LME Gen Total Optime to 0.
Set LME Gen CP April Heat Input, LME Gen April Load, and LME Gen April Optime to 0.
Set LME Gen Annual and LME Gen OS to false.
Set LME Gen HI Method and LME Gen HI Substitute Data Code to null.
Locate MonitorMethod records for all locations in the monitoring configuration where ParameterCode = "HIT", BeginDate is on or before
the first day of the reporting period, and the EndDate is null or is on or after the last day of the reporting period.
If any location does not have a retrieved record,
return result A.
Otherwise,
Set LME Year Start Quarter to the quarter of the current reporting period.
Locate a MonitorQualification for all units in the monitoring configuration where the QualificationTypeCode is equal to "LMEA"
or "LMES", BeginDate is on or before the last day of the reporting period, and the EndDate is null or is on or after January 1 of
the year of the reporting period.
If a record with QualificationTypeCode equal to "LMEA" is found,
set LME Gen Annual to true.
If a record with QualificationTypeCode equal to "LMES" is found,
set LME Gen OS to true.
If LME Gen Annual AND LME Gen OS are both false,
return result B.
else if LME Gen Annual is false AND the Quarter of the reporting period is equal to 1 or 4,
return result C.
Otherwise,
If the Quarter of the reporting period is greater than 1,
If LME Gen Annual is equal to true,
set LME Year Start Quarter to 1.
else
set LME Year Start Quarter to 2.
If MethodCode in all the retrieved Method records is equal to "MHHI",
LME Gen HI Method = 'MHHI".
Environmental Protection Agency
Page 697 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 if Hourly Op Data.OpTime for any hour is null, less than 0, or greater than 1,
return result F.
else if Hourly Op Data. OpTime is greater than 0 and Hourly Op Data.HourLoad is null,
return result E.
else if Hourly Op Data. OpTime is greater than 0 AND Hourly Op DataMHHl Indicator is not equal to
1,
Add HourLoad * OpTime to LME Gen Total Load Array for the location.
Add HourLoad * OpTime to LME Gen Total Load.
Add OpTime to LME Gen Total Optime.
Add OpTime to LME Gen LTFF Total Op Time Array for location.
If the month of Hourly Op Data Date is April AND LME Gen OS is equal to true,
Add HourLoad * OpTime to LME Gen April Load Array for the location.
Add HourLoad * OpTime to LME Gen April Load.
Add OpTime to LME Gen April Optime.
Add OpTime to LME Gen LTFF April Op Time Array for location
If LME Gen OS is equal to true and the Quarter of the reporting period is equal to 2,
Locate an LTFF record for any location in the monitoring configuration during the reporting period
where the FuelFlowPeriodCode is equal to "A".
If found and the LME Gen April Load is equal to 0 and LME Gen April Optime is equal to 0,
return result J.
Else if not found AND (LME Gen April Load is greater than 0 or LME Gen April Optime is greater than
1),
return result K.
Otherwise,
Locate an LTFF record for any location in the monitoring configuration during the reporting
period where the FuelFlowPeriodCode is equal to "MJ".
If found,
If (LME Gen Total Load - LME Gen April Load) is equal to 0 and (LME Gen Total
Optime - LME Gen April Optime) is equal to 0,
Environmental Protection Agency
Page 698 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result L.
If not found,
If (LME Gen Total 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.
Locate an LTFF record for any location in the monitoring configuration during the reporting period.
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,
If found,
Otherwise,
return result H.
Do not process remaining categories if fatal error is returned.
Environmental Protection Agency
Page 699 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
L
M
Usage:
1
Response
You have not reported an active HIT method in your monitoring plan for at least one
monitoring location in the configuration.
You have not reported an active LMEA or LMES qualification record for this
configuration in your monitoring plan.
You have not reported an active LMEA qualification record for this configuration in
your monitoring plan, but the reporting period is the first or fourth quarter. Only
annual LME units should report in the first or fourth quarter.
You have reported MHHI as the heat input method for this configuration, but you have
reported a long-term fuel flow record.
You have reported LTFF as the heat input method for this configuration, but the
LoadValue in at least one hourly record is missing or invalid.
You have reported LTFF as the heat input method for this configuration, but the
OperatingTime in at least one hourly record is missing or invalid.
You have reported a long-term fuel flow record for this reporting period, but the sum of
the load and operating time values in the hourly records (where MHHIIndicator is not
equal to 1) are equal to 0.
You have not reported the same heat input method in your monitoring plan for all
locations in the configuration during the reporting period.
You have reported LTFF as the heat input method for this configuration, but you have
not reported a long-term fuel flow record for this reporting period.
You have reported a long-term fuel flow record for April, but the sum of the load and
operating time values in the hourly records (where MHHIIndicator is not equal to 1)
are equal to 0.
You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for April.
You have reported a long-term fuel flow record for May and June, but the sum of the
load and operating time values in the hourly records (where MHHIIndicator is not
equal to 1) are equal to 0.
You have reported LTFF as the heat input method for this ozone-season reporting
configuration, but you have not reported a long-term fuel flow record for May/June.
Process/Category: LME Emissions Data Generation LME Initialization
Severity
Fatal
Fatal
Fatal
Fatal
Fatal
Fatal
Fatal
Fatal
Critical Error Level 1
Fatal
Critical Error Level 1
Fatal
Critical Error Level 1
Environmental Protection Agency
Page 700 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-12
Check Name: Check LTFF Fuel Flow Period Code
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If LME Gen OS is equal to true,
If the Quarter of the reporting period is equal to 2,
If the FuelFlowPeriodCode is null,
return result A.
Otherwise,
If the FuelFlowPeriodCode is not null,
return result B.
Otherwise,
If the FuelFlowPeriodCode is not null,
return result C.
Results:
Result
A
B
C
Usage:
1
Response
You did not report a FuelFlowPeriodCode in the LTFF record for [key]. This value is
required for LME units with an ozone-season qualification during the second quarter.
You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only
appropriate during the second quarter.
You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only
appropriate for LME units with an ozone-season qualification.
Process/Category: 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 701 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-17
Check Name:
Check LTFF Total Heat Input
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
For the LTFF record:
If LME Gen LTFF Heat Input is not null and is greater than or equal to 0 ,
if LME Gen Total Heat Input Array for the location is greater than or equal to 0,
add LME Gen L TFFHeat Input to LME Gen L TFFHeat Input Array for the location.
If LME Gen OS is true and the FuelFlowPeriodCode is equal to "A",
add LME Gen LTFF Heat Input to LME Gen LTFF April Heat Input Array for the location.
If Location is a common pipe,
If LME Gen CP Total Heat Input is greater than or equal to 0,
add LME Gen LTFF Heat Input to LME Gen CP Total Heat Input.
If LME Gen OS is true and the FuelFlowPeriodCode is equal to "A",
add LME Gen LTFF Heat Input to LME Gen CP April Heat Input.
Otherwise,
If Location is a common pipe,
set LME Gen CP Total Heat Input to -1.
Set LME Gen LTFF Heat Input Array for the location to -1.
Results:
Result
A
Response
obsolete
Severity
No Errors
Usage:
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
Environmental Protection Agency
Page 702 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-21
Check Name: Locate Hourly Op Record for LME Unit
Related Former Checks:
Applicability:
Description:
Specifications:
Set Current LME Hourly Op Record to null.
Set Generate LME to false.
If LME Gen Annual = true
Locate all Monitor Method records for the
"C02M", and the MethodCode is equal to
else
Locate all Monitor Method records for the
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.
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.
unit and the hour where the ParameterCode is equal to "S02M", "NOXM", or
"LME".
unit and the hour where the ParameterCode is equal to "NOXM and the MethodCode is
Results:
Result
A
B
C
Response
There is no active LME method in your monitoring plan.
You reported an LME Hourly record for April, but the unit does not have an annual
LME qualification. Emissions for this hour will not be included in the totals reported
in the Summary Value record.
You did not report an LME Hourly record for the hour.
Severity
Critical Error Level 1
Informational Message
Critical Error Level 1
Environmental Protection Agency
Page 703 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 704 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-22
Check Name:
Check LME Op Time
Related Former Checks: LME-EXP2
Applicability:
LME Check
Description:
Specifications:
If Current LME Hourly Op Record is not null,
If OpTime is null, or is not between 0 and 1 inclusive,
Set LME Gen Total Op Time Array for location to -1, Generate LME to false, and return result A.
Otherwise,
If OpTime is greater than 0, AND LME Gen Total Op Time Array for location is greater than or equal to 0,
Add 1 to LME Gen Total Op Hours Array for location.
Add OpTime to LME Gen Total Op Time Array for location.
If current date in the month of April,
Add 1 to LME Gen April Op Hours Array for location.
Add OpTime to LME Gen April Op Time Array for location.
Results:
Result
A
Response
The [fieldname] reported in the LME Hourly record is missing or invalid.
Severity
Critical Error Level 1
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 705 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-24
Check Name:
Check LME Load Value
Related Former Checks: LME-EXP5
Applicability:
LME Check
Description:
Specifications:
If Current LME Hourly Op Record is not null,
If LoadValue is less than 0,
set Generate LME to false, and return result A.
else if LoadValue is null,
If OperatingTime is greater than 0,
If LME Gen HI Method is equal to "LTFF"
set Generate LME to false, and return result B.
Otherwise
return result C.
else
If OperatingTime is equal to 0,
return result D.
Results:
Result
Response
The [fieldname] reported in the LME Hourly record is invalid.
You did not report a LoadValue in the LME Hourly record.
You did not report a LoadValue in the LME Hourly record.
You reported a LoadValue in the LME Hourly record. This field should be blank for a
non-operating hour.
Severity
A
B
C
D
Critical Error Level 1
Critical Error Level 1
Non-Critical Error
Critical Error Level 1
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 706 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-26
Check Name:
Check LME Load UOM
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
If Current LME Hourly Op Record is not null,
If LoadValue is null,
If LoadUOMCode is not null,
return result A.
Otherwise,
If LoadUOMCode is not equal to "MW", "KLBHR", or "MMBTUHR",
set Generate LME to false, and return result A.
Otherwise,
Locate Monitor Load record for the location and hour.
If not found, or more than one record is found, or the MaximumLoadUnitsOfMeasureCode is null,
set Generate LME to false, and return result B.
Otherwise,
If the LoadUOMCode is not equal to the MaximumLoadUnitsOfMeasureCode in the retrieved record,
set Generate LME to false, and return result C.
Results:
Result
A
B
Response
The [fieldname] reported in the LME Hourly record is missing or invalid.
You have not reported a single, active, valid Monitor Load record in your monitoring
plan.
The LoadUOMCode in the LME Hourly record is not consistent with the value in the
Monitor Load record in your monitoring plan.
Severity
Critical Error Level 1
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
1
Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 707 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-27
Check Name: Check LME Fuel Code List
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
If Current LME Hourly Op Record is not null,
If OpTime is greater than 0, and FuelCodeList is null,
set Generate LME to false, and return result A.
Results:
Result Response Severity
A You did not report a value in the FuelCodeList in the LME Hourly record, but the unit Critical Error Level 1
operated during the hour.
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 708 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-28
Check Name: Calculate Heat Input for LME Unit
Related Former Checks: LME-EXP3B, LME-EXP9A
Applicability: LME Check
Description:
Specifications:
LME Gen Heat Input Record = null
LME Calc Heat Input = null
LME Gen Fuel Code = null
If Generate LME is equal to true,
If Current LME Hourly Op Ttecon/.OperatingTime is greater than 0,
If LME Gen HI Method is equal to "MHHI" or Current LME Hourly Op Record. IVT HH11 ndicator is equal to 1,
Locate all Monitor Default records for the hour and location where the ParameterCode is equal to "MHHI".
If one record is found, the Default Value is greater than 0, and the DefaultUnitsOfMeasureCode is equal to
"MMBTUHR".
Calculate LME Calc Heat Input = Default Value * Current LME Hourly Op Record .0\iT\mc. rounded
to one decimal place.
Otherwise,
If LME Gen Parameters contains "S02M",
set LME Gen Total S02MArray 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 C02MArray 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
Calculate LME Calc Heat Input = (LME Gen CP April Heat Input *
Current LME Hourly Op Record.HourLoad * Current LME Hourly
Op Record. OpTime / LME Gen April Load) + (LME Gen LTFF April
Heat Input Array for the location * Current LME Hourly Op
Record. HourLoad * Current LME Hourly Op Record .OpTime / LME
Gen April Load Array for the location), and round the result to 1
decimal place.
Environmental Protection Agency
Page 709 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 .0\iT\mc / LME Gen April Optime) + {LME Gen
LTFFApril Heat Input Array for the location * Current LME Hourly Op
Record .0\iT\mc / 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 RecordHomLoaA 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 LTFF Heat
Input Array for the location - LME Gen L TFF April Heat Input Array
for the location) * Current LME Hourly Op Record HomLoaA *
Current LME Hourly Op Record .0\iT\mc / {LME Gen Total Load
Array for the location - LME Gen April Load Array for the location)),
and round the result to 1 decimal place.
else if LME Gen Total Optime is greater than 0,
Calculate LME Calc Heat Input = {{LME Gen CP Total Heat Input - LME
Gen CP April Heat Input) * Current LME Hourly Op Record. OpTime / {LME
Gen Total Optime - LME Gen April Optime)) + {{LME Gen LTFF Heat Input
Array for the location - LME Gen LTFF April Heat Input Array for the
location) * Current LME Hourly Op Record. OpTime / {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 L TFF Heat Input Array for the location
* Current LME Hourly Op Record.HourLoad * Current LME Hourly Op
Record. OpTime / LME Gen Total Load Array for the location), and round the
result to 1 decimal place.
else if LME Gen Total Optime is greater than 0,
Calculate LME Calc Heat Input = {LME Gen CP Total Heat Input * Current LME
Hourly Op Record. OpTime / LME Gen Total Optime) + {LME Gen LTFF Heat Input
Array for the location * Current LME Hourly Op Record .0\iT\mc / LME Gen LTFF
Environmental Protection Agency
Page 710 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Total Op Time Array for the location), and round the result to 1 decimal place.
If LME Calc Heat Input is not null,
If LME Calc Heat Input is greater than 999,999.9
If LME Gen Parameters contains "S02M",
set LME Gen Total S02MArray 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 C02MArray 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 HomlD = Current LME Hourly Op Record HomlD
LME Gen Heat Input Record.ParameterCode = "HIT"
LME Gen Heat Input Record. AdjustedHourly Value = LME Calc Heat Input
If Current LME Hourly Op Record. IVT HH11 ndicator is equal to 1,
LME Gen Heat Input Record.MODCCode = "45"
If LME Gen Total Heat Input Array for location is greater than or equal to 0,
Add LME Calc Heat Input to LME Gen Total Heat Input Array for location.
If current date in the month of April,
Add LME Calc Heat Input to LME Gen April Heat Input Array for location.
Otherwise,
If LME Gen Parameters is not null, AND
(LME Gen Annual is equal to true OR the current date is in the months of May thru September),
If LME Gen Parameters contains "S02M",
set LME Gen Total S02MArray 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 C02MArray for location to -1.
set LME Gen Total Heat Input Array for location to -1.
Environmental Protection Agency
Page 711 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You did not report a single, active, valid default record for MHHI in your monitoring Critical Error Level 1
plan.
B The value calculated for [param] in the LME Hourly record exceeds the maximum Critical Error Level 1
value.
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 712 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: LME-29
Check Name: Calculate S02 Mass for LME Unit
Related Former Checks: LME-EXP3C, LME-EXP9C
Applicability: LME Check
Description:
Specifications:
LME Gen S02M Record = null
If LME Gen Parameters contains "S02M" and Current LME Hourly Op Record is not null,
If Current LME Hourly Op Record. F lie 1C ode Li s t is not null,
S02 Rate = 0
SO 2 Fuel = null
For each FuelCode in the Current LME Hourly Op FuclCodcList
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 Default Value is greater than 0, and DefaultUnitsOfMeasureCode is equal
to "LBMMBTU",
If S02 Rate is less than the Default Value in the retrieved record,
set SO 2 Rate to the Default Value,
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 SO2 Mass is greater than 99,999.9
set LME Gen Total S02MArray for location to -1, and return result B.
Otherwise,
LME Gen S02MRecord.HourlD = Current LME Hourly Op RecordHomlD
LME Gen S()2M Record. Pa ra mctc rCodc = "S02M"
LME Gen S()2 M Record. A d j u s t ed Ho u r 1 y Va 1 lie = S02 Mass
LME Gen S02MRecord.FuelCode = S02 Fuel
If LME Gen Total S02MArray for location is greater than or equal to 0,
Add SO2 Mass to LME Gen Total S02MArray for location.
Environmental Protection Agency
Page 713 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You did not report a single, active, valid [defparm] default record for FuelCode [fuel] Critical Error Level 1
in your monitoring plan.
B The value calculated for [param] in the LME Hourly record exceeds the maximum Critical Error Level 1
value.
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 714 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-30
Check Name:
Calculate NOX Mass for LME Unit
Related Former Checks: LME-EXP3A, LME-EXP9B
Applicability:
Description:
Specifications:
LME Check
LME Gen NOXM Record = null
If LME Gen Parameters contains "NOXM" and Current LME Hourly Op Record is not null and Current LME Hourly Op
Record.0\iT\mc is greater than 0,
If Current LME Hourly Op Record. F lie 1C ode Li s t is not null,
NOX Rate = 0
NOX Fuel = null
For each FuelCode in the Current LME Hourly Op FuclCodcList
If Current LME Hourly Op .Opcra t i ngCondi t ionCode is null,
Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NOXR",
DefaultPurposeCd = "LM", OperatingConditionCode = "A", and FuelCode is equal to the current
FuelCode.
else if Current LME Hourly Op Record.OperatingConditionCode == "U",
Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NORX",
DefaultPurposeCd = "MD", the OperatingConditionCode is equal to "U", and FuelCode is equal to the
current FuelCode.
Locate all Monitor Default Records for the location and hour where ParameterCode is equal to "NOXR",
DefaultPurposeCd = "LM", the OperatingConditionCode is equal to Current LME Hourly Op
Record.OperatingConditionCode, and FuelCode is equal to the current FuelCode.
If one and only one record is found, the Default Value is greater than 0, and DefaultUnitsOfMeasureCode is equal
to "LBMMBTU",
If NOX Rate is less than the Default Value in the retrieved record,
set NOXRate to the Default Value,
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 .Opcra t i ngCondi t ionCode is null,
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 * NOXRate, and round the result to 1 decimal place.
else
return result A.
else
return result B.
Environmental Protection Agency
Page 715 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If NOXMass 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 .Y\ouv\D = Current LME Hourly Op Record RomM)
LME Gen NOXM Record.ParameterCode = "NOXM"
LME Gen NOXM Ttecon/.AdjustedHourly Value = NOXMass
LME Gen NOXM Record.FuelCode = NOXFuel
LME Gen NOXM O pc ra t i n g Co n d i t i o n Code = Current LME Hourly Op
Record. O pc ra t i n g Co n d i t i o n Code
If LME Gen Total NOXM Array for location is greater than or equal to 0,
Add NOXMass to LME Gen Total NOXM Array for location.
If current date in the month of April,
Add NOXMass to LME Gen April NOXM Array for location.
Results:
Result
A
Response
You did not report a single, active, valid [defparm] default record for FuelCode [fuel]
in your monitoring plan.
You did not report a single, active, valid [defparm] default record for FuelCode [fuel]
OperatingConditionCode [cond] in your monitoring plan.
The value calculated for [param] in the LME Hourly record exceeds the maximum
value.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Environmental Protection Agency
Page 716 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 717 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: LME-31
Check Name: Calculate C02 Mass for LME Unit
Related Former Checks: LME-EXP3D, LME-EXP9D
Applicability: LME Check
Description:
Specifications:
LME Gen C02M Record = null
If LME Gen Parameters contains "C02M" and Current LME Hourly Op Record is not null,
If Current LME Hourly Op Record. F lie 1C ode Li s t is not null,
C02 Rate = 0
C02 Fuel = null
For each FuelCode in the Current LME Hourly Op FuclCodcList
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 Default Value is greater than 0, and DefaultUnitsOfMeasureCode is equal
to "TNMMBTU",
If C02 Rate is less than the Default Value in the retrieved record,
set C02 Rate to the Default Value,
set C02 Fuel to the current FuelCode.
Otherwise,
set LME Gen Total C02MArray 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 C02 Mass is greater than 99,999,999.9
set LME Gen Total C02MArray for location to -1, and return result B.
Otherwise,
LME Gen C02MRecord.HourlD = Current LME Hourly Op RecordRomlD
LME Gen C02M Record .ParameterCode = "C02M"
LME Gen C()2 M Record. A d j u s t ed Ho u r 1 y Va 1 lie = C02 Mass
LME Gen C02MRecord.FuelCode = C02 Fuel
If LME Gen Total C02MArray for location is greater than or equal to 0,
Add C02 Mass to LME Gen Total C02MArray for location.
Environmental Protection Agency
Page 718 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You did not report a single, active, valid [defparm] default record for FuelCode [fuel] Critical Error Level 1
in your monitoring plan.
B The value calculated for [param] in the LME Hourly record exceeds the maximum Critical Error Level 1
value.
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 719 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-32
Check Name: Calculate HIT Summary Values
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
LME Summary Heat Input Record = null
If location is a common pipe,
tempHIT = LME Gen L IFF Heat Input Array for the location
tempAprilHIT = LME Gen LTFFApril 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 . Rc po rt i n g Pc r i od I d = 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. CunentReportingPeriodTotal = tempHIT - tempAprilHIT, rounded to 0 decimal
places.
else
LME Summary Heat Input Record. CunentReportingPeriodTotal = 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 found,
LME Summary Heat Input . O zo n c Sc a so n To D a t cTo t a 1 = Op Value 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 found,
add Op Value in the retrieved record to LME Summary Heat Input . O zo n c Sc a so n To D a t cTo t a 1.
If LME Gen Annual == true,
LME Summary Heat Input Record. YearToDateTotal = LME Summary Heat Input
Environmental Protection Agency
Page 720 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Current Report ingPeriodTotal. 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 found,
add Op Value in the retrieved record to LME Summary Heat Input RecordYearToDateTotal.
Results:
Result
A
B
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 721 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-33
Check Name: Calculate OPTIME Summary Values
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
LME Summary Op Time Record = null
If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,
LME Summary Op Time RecordMo^aLoclA = current location ID
LME Summary Op Time . Rc po rt i n g Pc r i od I d = current reporting period ID
LME Summary Op Time Record.FammeterCode = "OPTIME"
If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,
LME Summary Op Time /?6'cwY/.CurrcntRcportingPeriodTotal = LME Gen Total Op Time Array for the location - LME
Gen April Op Time Array for the location.
else
LME Summary Op Time /?6'cwY/.CurrcntRcportingPeriodTotal = 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 . O zo nc Sca so nTo Da t cTo t a 1 = 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 /?6'cmy/. O zo nc Sca so nTo Da t cTo t a 1 = 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 found,
LME Summary Op Time /?6'cmy/ . O zo n c Sc a so n To D a t cTo t a 1 = Op Value 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 found,
add Op Value in the retrieved record to LME Summary Op Time /?6'cmy/ . O zo n c Sc a so n To D a t cTo t a 1.
If LME Gen Annual == true,
LME Summary Op 2i»ie7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If found,
add Op Value in the retrieved record to LME Summary Op Time RecordYearToDateTotal.
Results:
Result
A
B
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 723 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-34
Check Name: Calculate OPHOURS Summary Values
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
LME Summary Op Hours Record = null
If location is a unit AND LME Gen Total Op Time Array for the location is greater than or equal to 0,
LME Summary Op Hours Record. IVIonLoc Id = current location ID
LME Summary Op Hours Record. Rcport i ngPcriodld = current reporting period ID
LME Summary Op Hours Ttecon/.ParameterCode = "OPHOURS"
If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,
LME Summary Op Hours Ttecon/.CurrentReportingPeriodTotal = LME Gen Total Op Hours Array for the location -
LME Gen April Op Hours Array for the location.
else
LME Summary Op Hours Ttecon/.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 O zo nc Sca so nTo Da t cTo t a 1 = 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 O zo nc Sca so nTo Da t cTo t a 1 = 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 found,
LME Summary Op Hours O zo n c Sc a so n To D a t cTo t a 1 = Op Value 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 found,
add Op Value in the retrieved record to LME Summary Op Hours O zo n c Sc a so n To D a t cTo t a 1.
If LME Gen Annual == true,
LME Summary Op Hours /?6'cmy/. Yea rToDatcTota 1 = LME Summary Op Hours /?6'cwY/.CurrcntRcportingPeriodTotal.
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".
Environmental Protection Agency
Page 724 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If found,
add Op Value in the retrieved record to LME Summary Op Hours Yea rTo D a t cTo t a 1.
Results:
Result
A
B
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 725 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-35
Check Name:
Calculate S02M Summary Values
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
LME Summary S02M Record = null
If location is a unit, LME Gen Annual == true, AND LME Gen Total S02MArray for the location is greater than or equal to 0,
Locate a Monitor Method record for the unit where the ParameterCode is equal to "S02M", and the MethodCode is equal to
"LME", BeginDate is on or before the first day of the reporting period, and the EndDate is null or is on or after the last day of the
reporting period.
LME Summary S()2M Record. IVIonLoc Id = current location ID
LME Summary S()2MRecord.RcportingPcriodld = current reporting period ID
LME Summary S02MRecord.ParameterCode = "S02M"
LME Summary >SY/2 A/Current Report ingPeriodTotal = LME Gen Total S02MArray for the location / 2000,
rounded to one decimal place.
LME Summary S02MRecord.YearToDateTotal = LME Summary S'02M7?ecor
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-36
Check Name:
Calculate C02M Summary Values
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
LME Summary C02M Record = null
If location is a unit, LME Gen Annual == true, AND LME Gen Total C02MArray 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.
LME Summary C()2M Record. IVIonLoc Id = current location ID
LME Summary C()2M Record. Rcporti ngPcriodld = current reporting period ID
LME Summary C02MTtecwrf.ParameterCode = "C02M"
LME Summary C02MTtecon/.CurrentReportingPeriodTotal = LME Gen Total C02MArray for the location.
LME Summary C02MTtecon/.YearToDateTotal = LME Summary C02MTtecon/.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.
If found,
Locate the Op Supp Data records for the location and reporting period WHERE the OpTypeCode
C02M".
If found,
add Op Value in the retrieved record to LME Summary C02M RecordYearToDateTotal.
Results:
Result
A
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
Severity
Critical Error Level 1
Usage:
1 Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 727 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-37
Check Name:
Calculate NOXM Summary Values
Related Former Checks:
Applicability:
LME Check
Description:
Specifications:
LME Summary NOXM Record = null
If location is a unit AND LME Gen Total NOXM Array for the location is greater than or equal to 0,
Locate a Monitor Method record for the unit where:
1) ParameterCode is equal to "NOXM".
2) MethodCode is equal to "LME".
3) BeginDate is on or before:
a) May 1st of the year of the reporting period when the reporting period is for the 2nd quarter AND LME Gen OS is equal to
true.
b) The first day of the reporting period otherwise.
4) EndDate is null or is on or after the last day of the reporting period.
LME Summary NOXM Record. IVIonLoc Id = current location ID
LME Summary NOXM Record. Rcport i ngPcriodld = current reporting period ID
LME Summary NOXM Ttecon/.ParameterCode = "NOXM"
If LME Gen OS == true and LME Gen Annual == false and Quarter of Reporting Period is equal to 2,
LME Summary NOXM Ttecon/.CurrentReportingPeriodTotal = (.LME Gen Total NOXM Array for the location -
LME Gen April NOXM Array for the location) / 2000, rounded to one decimal place.
else
LME Summary NOXM Ttecon/.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 O zo n c Sc a so n To D a t cTo t a 1 = {LME Gen Total NOXM Array for the
location - LME Gen April NOXM Array for the location) / 2000, rounded to one decimal place.
else if Quarter of Reporting Period is equal to 3,
LME Summary NOXM O zo n c Sc a so n To D a t cTo t a 1 = LME Gen Total NOXM Array for the
location / 2000, rounded to one decimal place.
else if Quarter of Reporting Period is equal to 4 AND LME Year Start Quarter is less than 4,
Locate the Op Supp Data records for the location WHERE the reporting period is the third quarter of the
Year of the Reporting Period and OpTypeCode = "NOXM".
If found,
LME Summary NOXM O zo n c Sc a so n To D a t cTo t a 1 = Op Value in the retrived record.
if Quarter of Reporting Period is equal to 3 or 4 AND LME Year Start Quarter is less than 3,
Locate the Op Supp Data records for the location WHERE the reporting period is the second quarter of
the current year and OpTypeCode = "NOXMOS".
If found,
If found,
Environmental Protection Agency
Page 728 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
add Op Value in the retrieved record to LME Summary NOXM
Record. OzoneSeasonToDateTotal.
If LME Gen Annual == true,
LME Summary NOXM Record YearToDateTotal = LME Summary NOXM
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
= "NOXM".
If found,
add Op Value in the retrieved record to LME Summary NOXM RecordYearToDateTotal.
Results:
Result
A
B
Response
The program could not determine ozone-season-to-date totals for [osparam], because
the Op Supp Data record for this parameter is missing for one or more previous
reporting periods. If you have submitted emissions data for prior quarters, you should
be able to retrieve these records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 729 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-38
Check Name:
Related Former Checks:
Calculate NOXR Summary Values
Applicability:
Description:
Specifications:
LME Check
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 last day of the reporting period, and the EndDate is null or is on or after the first
day of the reporting period.
If found,
LME Summary NOXR Record.MoviLocld = current location ID
LME Summary NOXR . Rc po rt i n g Pc r i od I d = current reporting period ID
LME Summary NOXR Ttecon/.ParameterCode = "NOXR"
If LME Summary NOXM Record. Rcport i ngPcriodTota 1 == 0
LME Summary NOXR /fec-wrf. Current Report ingPeriodTotal = 0
else
LME Summary NOXR Ttecon/.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
= "NOXR".
If found,
NOXRValue = Op Value.
Locate the Op Supp Data records for the location and reporting period WHERE the
OpTypeCode = "HIT".
If found,
Add Op Value * \( ci I tic (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
Environmental Protection Agency
Page 730 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
LME Summary NOXR . Yea rTo D a t cTo t a 1 = LME Summary NOXR Ttecon/.CurrentReportingPeriodTotal.
Results:
Result
A
B
Response
The program could not determine year-to-date for [param], because the Op Supp Data
record for this parameter is missing for one or more previous reporting periods. If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The program could not determine year-to-date for [param], because the Op Supp Data
record for HIT is missing for one or more previous reporting periods. If you have
submitted emissions data for prior quarters, you should be able to retrieve these records
by logging on to the EPA host.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: LME Emissions Data Generation Summary Value Data
Environmental Protection Agency
Page 731 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-40
Check Name: Check LME MHHI Indicator
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
If Current LME Hourly Op Record is not null,
If MHHIIndicator is equal to 1,
If LME Gen HI Substitute Data is not equal to "MHHI",
set Generate LME to false, and return result A.
Results:
Result Response Severity
A You reported a MHHIIndicator, but you did not report an active LTFF heat input Critical Error Level 1
method with a SubstituteDataCode of "MHHI".
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 732 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
LME-44
Check Name:
Related Former Checks:
Check Fuel Codes against LTFF Records
Applicability:
Description:
Specifications:
LME Check
If Current LME Hourly Op Record is not null and LME Gen HI Method = "LTFF",
If MHHIIndicator is not equal to 1 and FuelCodeList is not null,
Locate all Unit Stack Configuration Records where the unit location is the location in the Current LME Hourly Op
Record, the StackID begins with "CP", the BeginDate and BeginHour is on or before the Date and Hour in the Current
LME Hourly Op Record, and the EndDate is null or the EndDate and EndHour is on or after the Date and Hour in the
Current LME Hourly Op Record.
For each FuelCode in FuelCodeList,
Locate & LTFF Record for the configuration and reporting period where the location is the location in the
Current LME Hourly Op Record or is any of the common pipes in the retrieved Unit Stack Configuration
Records, and the FuelCode of the associated fuel flow system is equal to the FuelCode in the FuelCodeList that is
being evaluated.
If not found for any FuelCode,
set Generate LME to false, and return result A.
Results:
Result
A
You did not report a Long Term Fuel Flow record for a fuel flow system for one or
more fuels in the FuelCodeList in the LME Hourly record. If you burn a fuel that is
not measured by a fuel flow meter, you must use maximum hourly heat input for the
hour.
Response
Severity
Critical Error Level 1
Usage:
1 Process/Category: LME Emissions Data Generation Hourly Emissions Data
Environmental Protection Agency
Page 733 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-45
Check Name: Duplicate LTFF Record
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
Locate another LTFF record for the location with same ReportingPeriod, MonitoringSystemID, and FuelFlowPeriodCode as the
current record.
If found,
return result A.
Results:
Result Response Severity
A Another [recordtype] record already exists with the same [fieldnames]. Fatal
Usage:
1 Process/Category: LME Emissions Data Generation LTFF Heat Input Data
Environmental Protection Agency
Page 734 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-18
Check Name: Check LME Begin Hour
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LME Hourly Op record:
If BeginHour is null or is not between 0 and 23 (inclusive),
return result A.
Results:
Result Response Severity
A The Hour is missing or invalid. Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 735 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-19
Check Name: Check LME Begin Date
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LME Hourly Op record:
If BeginDate is null or is not within the reporting period,
return result A.
Results:
Result Response Severity
A The Date is missing or not within the reporting period. Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 736 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-20
Check Name: Duplicate LME Hourly Op Record
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LME Hourly Op record:
Locate another Hourly Op record for the location with same BeginDate and BeginHour.
If found,
return result A.
Results:
Result Response Severity
A Another [recordtype] record already exists with the same [fieldnames]. Fatal
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 737 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-23
Check Name: Check LME Data Entry Screen Op Time
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LME Hourly Op record:
If OpTime is null, or is not between 0 and 1 inclusive,
return result A.
Results:
Result Response Severity
A The [fieldname] reported in the LME Hourly record is missing or invalid. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 738 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-25
Check Name: Check LME Data Entry Screen Load Value
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LME Hourly Op record:
If LoadValue is null,
If OperatingTime is greater than 0,
return result A.
else if LoadValue is less than 0,
return result A.
else
If OperatingTime is equal to 0,
return result B.
Results:
Result Response Severity
A The [fieldname] reported in the LME Hourly record is missing or invalid. Critical Error Level 1
B You reported a LoadValue in the LME Hourly record. This field should be blank for a Non-Critical Error
non-operating hour.
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation Hourly Op Data Evaluation
Environmental Protection Agency
Page 739 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: LME-43
Check Name: Check LTFF Fuel Flow Period Code
Related Former Checks:
Applicability: LME Check
Description:
Specifications:
For the LTFF record:
If the Quarter of the reporting period is not equal to 2,
If the FuelFlowPeriodCode is not null,
return result A.
Results:
Result Response Severity
A You reported a FuelFlowPeriodCode in the LTFF record for [key], but this value is only Critical Error Level 1
appropriate during the second quarter.
Usage:
1 Process/Category: Emissions Data Entry Screen Evaluation LTFF Data Evaluation
Environmental Protection Agency
Page 740 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Calculated Hourly Value Checks
Environmental Protection Agency
Page 741 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-1
Check Name: Initialize HGRE Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HGRE.
Specifications:
CalculationConversionFactor = 6.24 x 10 A -11
CurrentDh v Parameter = MatsHgDhv Parameter
CurrentDhvRecordValid = MatsHgDhvValid
MatsDh v Record = MatsHgDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHgcValue
MatsMh v Record = MatsHgcMh v Record
MatsMoistureEquationList = {A-3}
MatsDhvMeasuredModcList to {36, 39}
MatsDhvUnavailableModcList to {38}
If CurrentHourlyOpRecord.MatsHourLoad is NOT equal to 0, AND is NOT null,
FinalConversionFactor = 10A3 / CurrentHourlyOpRecord.MatsHourLoad
Else
FinalConversionFactor = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RE Calculation Verification
Environmental Protection Agency
Page 742 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-2
Check Name: Initialize HCLRE Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for
HCLRE.
Specifications:
CalculationConversionFactor = 9.43 x 10 A -8
CurrentDh v Parameter = M atsHclDh v Parameter
CurrentDhvRecordValid = MatsHclDhvValid
MatsDh v Record = MatsHclDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValue
MatsMh v Record = MatsHclcMh v Record
MatsMoistureEquationList = {HC-3}
MatsDhvMeasuredModcList to {36, 39}
MatsDhvUnavailableModcList to {38}
If CurrentHourlyOpRecord.MatsHourLoad is NOT equal to 0, AND is NOT null,
FinalConversionFactor = 1 / CurrentHourlyOpRecord.MatsHourLoad
Else
FinalConversionFactor = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 RE Calculation Verification
Environmental Protection Agency
Page 743 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-3
Check Name: Initialize HFRE Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HFRE.
Specifications:
CalculationConversionFactor = 5.18 x 10 A -8
CurrentDh v Parameter = M atsHfDh v Parameter
CurrentDhvRecordValid = MatsHfDhvValid
MatsDh v Record = MatsHfDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHfcValue
MatsMh v Record = MatsHfcMh v Record
MatsMoistureEquationList = {HF-3}
MatsDhvMeasuredModcList to {36, 39}
MatsDhvUnavailableModcList to {38}
If CurrentHourlyOpRecord.MatsHourLoad is NOT equal to 0, AND is NOT null,
FinalConversionFactor = 1 / CurrentHourlyOpRecord.MatsHourLoad
Else
FinalConversionFactor = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RE Calculation Verification
Environmental Protection Agency
Page 744 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-4
Check Name: Initialize S02RE Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for S02RE.
Specifications:
CalculationConversionFactor = 1.66 x 10 A -7
CurrentDh v Parameter = MatsSo2I)h v Parameter
CurrentDhvRecordValid = MatsSo2D1iv Valid
MatsDh v Record = MatsSo2Dh v Record
MatsMoistureEquationList = {S-3}
MatsDhvMeasuredModcList to {36, 39}
MatsDhvUnavailableModcList to {38}
If CurrentHourlyOpRecord.MatsHourLoad is NOT equal to 0, AND is NOT null,
FinalConversionFactor = 1 / CurrentHourlyOpRecord.MatsHourLoad
Else
FinalConversionFactor = null
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RE Calculation Verification
Environmental Protection Agency
Page 745 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-5
Check Name: Initialize HGRH Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HGRH.
Specifications:
CalculationConversionFactor = 6.24 x 10 A -11
CurrentDh v Parameter = MatsHgDhv Parameter
CurrentDhvRecordValid = MatsHgDhvValid
MatsDh v Record = MatsHgDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHgcValue
MatsMh v Record = MatsHgcMh v Record
MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}
MatsDhvMeasuredModcList to {36, 37}
MatsDhvUnavailableModcList to {38}
FinalConversionFactor = 10A6
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RH Calculation Verification
Environmental Protection Agency
Page 746 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-6
Check Name: Initialize HCLRH Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for
HCLRH.
Specifications:
CalculationConversionFactor = 9.43 x 10 A -8
CurrentDh v Parameter = M atsHclDh v Parameter
CurrentDhvRecordValid = MatsHclDhvValid
MatsDh v Record = MatsHclDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHclcValue
MatsMh v Record = MatsHclcMh v Record
MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}
MatsDhvMeasuredModcList to {36, 37}
MatsDhvUnavailableModcList to {38}
FinalConversionFactor = 1
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1RH Calculation Verification
Environmental Protection Agency
Page 747 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-7
Check Name: Initialize HFRH Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for HFRH.
Specifications:
CalculationConversionFactor = 5.18 x 10 A -8
CurrentDh v Parameter = M atsHfDh v Parameter
CurrentDhvRecordValid = MatsHfDhvValid
MatsDh v Record = MatsHfDh v Record
MatsMhvCalculatedValue = MatsMhvCalculatedHfcValue
MatsMh v Record = MatsHfMh v Record
MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}
MatsDhvMeasuredModcList to {36, 37}
MatsDhvUnavailableModcList to {38}
FinalConversionFactor = 1
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RH Calculation Verification
Environmental Protection Agency
Page 748 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-8
Check Name: Initialize S02RH Calculated Hourly Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent Calculated hourly checks for
S02RH.
Specifications:
CalculationConversionFactor = 1.66 x 10 A -7
CurrentDh v Parameter = MatsSo2I)h v Parameter
CurrentDhvRecordValid = MatsSo2D1iv Valid
MatsDh v Record = MatsSo2Dh v Record
MatsMoistureEquationList = {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}
MatsDhvMeasuredModcList to {36, 37}
MatsDhvUnavailableModcList to {38}
FinalConversionFactor = 1
Results:
Result Response
Usage:
1 Process/Category: Emissions Data Evaluation Report
Severity
MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 749 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSCHV-9
Check Name:
Related Former Checks:
Determine the Calculation Concentration for a MATS Parameter
Applicability:
Description:
Determines the main concentration value to use in calculations.
Specifications:
CalculationConcentration = null
CalculationConcentrationSubstituted = false
If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If {MatsMhvCalculatedValue is not null)
CalculationConcentration = MatsMhvCalculatedValue (convert from Scientific Notation)
If (MatsMhvRecordMatsMhvRecord is not null) AND (MatsMhvRecord.IVTodcCodc is equal to "34" or "35")
CalculationConcentrationSubstituted = true
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS HC1RH Calculation Verification
3
Process/Category: Emissions Data Evaluation Report MATS HF RE Calculation Verification
4 Process/Category: Emissions Data Evaluation Report MATS HF RH Calculation Verification
5
Process/Category: Emissions Data Evaluation Report MATS Hg RE Calculation Verification
6 Process/Category: Emissions Data Evaluation Report MATS Hg RH Calculation Verification
Environmental Protection Agency
Page 750 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSCHV-10
Check Name:
Related Former Checks:
Determine the Calculation Concentration for S02
Applicability:
Description:
Determines the S02 concentration value to use in calculations.
Specifications:
CalculationConcentration = null
CalculationConcentrationSubstituted = false
If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If CurrentSo2MonitorHourlyRecord is not null
CalculationConcentration = CurrentSo2MonitorHourlyRecord.VnadjustedRourlyYalue
If (CurrentSo2MonitorHourlyRecord.IVTodcCodc in set {05, 06, 07, 08, 09, 10, 12, 13, 15, 18, 23, 55})
CalculationConcentrationSubstituted = true
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 751 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-11
Check Name: Determine the Calculation Flow
Related Former Checks:
Applicability:
Description: Determines the flow value for equations.
Specifications:
CalculationFlow = null
CalculationFlowSubstituted = false
If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If (CurrentStackFlowHourlyRecord is NOT null)
CalculationFlow = CurrentStackFlowHourlyRecord.UnadjustedHourlyValue
If (CurrentStackFlowHourlyRecord.ModcCode not in set {01, 02, 03, 04, 20, 53, 54})
CalculationFlowSubstituted = true
Else
CalculationFlow = null
CalculationFlowSubstituted = false
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1 RE Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RE Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RE Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RE Calculation Verification
Environmental Protection Agency
Page 752 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-12
Check Name: Determine the Calculation Diluent Value
Related Former Checks:
Applicability:
Description: Determines the diluent value to use in calculations involving formula 19 equations.
Specifications:
CalculationDiluent = null
CalculationDiluentSubstituted = false
If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If (MatsDhvRecord.EquationCodc in set {19-3D, 19-5D} OR MatsDhvRecord.ModcCode == 37)
If (MatsDhvRecord.EquationCodeinset{19-l, 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 (02MonitorDefaultRecordDefaultVahie is NULL OR 02MonitorDefaultRecordDQfaultValuQ <= 0)
return result C
Else
CalculationDiluent = 02MonitorDefaultRecordDQfmxltVahxQ
Else if (MatsDhvRecord.EqnationCode in set {19-6, 19-7, 19-8, 19-9})
Co2MonitorDefaultMatches = count of MonitorDefaultRecordsByHourLocation where:
1) ParameterCode = "C02N"
2) DefaultPurposeCode = "DC"
3) FuelCode = "NFS"
If (Co2MonitorDefaultMatches> 1)
return result D
Else if (Co2MonitorDefaultMatches== 0)
return result E
Else
C02MonitorDefaultRecord = the single matched record
If (Co2MonitorDefaultRecord. Default Value is NULL OR Co2MonitorDefaultRecord. Default Value <= 0)
return result F
Else
Environmental Protection Agency
Page 753 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
CalculationDiluent=Co2Moni torDefaultRecord. D efault Value
Else
If (MatsDhvRecord.EquationCodc in set { 19-1, 19-4} AND 02DryNeededForMats == true)
CalculationDiluent = 02DryCalculatedAdjustedValue
If (02DryModc not in set {01, 02, 03, 04, 17, 20, 53, 54})
CalculationDiluentSubstituted = true
Else if (MatsDhvRecord.EquiiUonCodc in set {19-2. 19-3, 19-5} AND ()2WetNeededForMats == true)
CalculationDiluent = 02WetCalculatedAdjustedValue
If (02WetModc not in set {01, 02, 03, 04, 17, 20, 53, 54})
CalculationDiluentSubstituted = true
Else if (MatsDhvRecord.EqmUonCodc in set { 19-6, 19-7, 19-8, 19-9; AND Co2I)iluentNeededForMats== true)
CalculationDiluent = Co2cMhvCalculatedAdjustedValue
If (Co2cMhvModc not in set {01, 02, 03, 04, 17, 20, 21, 53, 54})
CalculationDiluentSubstituted = true
Results:
Result
A
B
C
D
E
F
Usage:
Response
You reported more than one diluent cap default record for 02X in your monitoring
plan that was active during current hour.
You did not report a default record for 02X in your monitoring plan that was active
during current hour.
The Default Value reported in the active Default record for 02X in your monitoring
plan is invalid. The value must be greater than 0.
You reported more than one diluent cap default record for C02N in your monitoring
plan that was active during the current hour.
You did not report an active C02N diluent cap default record in your monitoring plan
for the hour.
The Default Value reported in the active Default record for C02N in your monitoring
plan is invalid. The value must be greater than 0.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
1
Process/Category:
Emissions Data Evaluation Report —
— MATS
2
Process/Category:
Emissions Data Evaluation Report —
— MATS
3
Process/Category:
Emissions Data Evaluation Report —
— MATS
4
Process/Category:
Emissions Data Evaluation Report —
— MATS
Environmental Protection Agency
Page 754 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSCHV-13
Check Name:
Related Former Checks:
Determine the Calculation Moisture
Applicability:
Description:
Determines the moisture value for equations.
Specifications:
CalculationMoisture = null
CalculationMoistureSubstituted = false
If CurrentDhvRecordValid AND (MatsDhvRecord.ModcCode in MatsDhvMeasuredModcList)
If (MatsDh vRecord. Equat i onCodc in MatsMoistureEquationList)
If (H2oMethodCode is equal to "MWD") AND H2oDerivedHourlyChecksNeeded AND
(H2oDhvCalculatedAdjustedValue is not null)
CalculationMoisture = H2oDhvCalculatedAdjustedValue
If (H2oDhvModc not in set {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
CalculationMoistureSubstituted = true
Else if (H2oMethodCode in set {MMS, MTB}) AND H2oMonitorHourlyChecksNeeded AND
{H2oMhvCalculatedAdjustedValue is not null)
CalculationMoisture = H2oMhvCalculatedAdjustedValue
If (H2oMhvModc not in set {01, 02, 03, 04, 06, 07, 08, 09, 10, 12, 21, 53, 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 {01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 12, 21, 53, 54, 55})
CalculationMoistureSubstituted = true
Else if (H2oMethodCode is equal to "MDF") AND (H2oDerivedHourlyChecksNeeded is false) AND (H2oDefaultValue
is not null)
CalculationMoisture = H2oDefaultValue
Results:
Result
Response
Severity
Environmental Protection Agency
Page 755 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1 RE Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1RH Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RE Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RH Calculation Verification
5
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RE Calculation Verification
6
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RH Calculation Verification
7
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RE Calculation Verification
8
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 756 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSCHV-14
Check Name:
Related Former Checks:
Check MODC and determine the MATS Formula Calculated Unadjusted Value
Applicability:
Description:
Specifications:
Calculates the Unadjusted Value using MATS formula equations.
CalculatedUnadjustedValue = null
If CurrentDhvRecordValid
If (MatsDh vRecord. IVTodcCodc in MatsDhvMeasuredModcList)
If (MatsDh vRecord. Equat i onCodc is NOT null)
If (MatsDh vRecord. Equat i onCodc 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 if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor * CalculationConcentration *
CalculationFlow* (1 - CalculationMoisture 1100)) * FinalConversionFactor
If CalculationConcentrationSubstituted OR CalculationFlowSubstituted
return result C
Else if (CalculationConcentration is null) OR (CalculationFlow is null)
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor * CalculationConcentration *
CalculationFlow) * FinalConversionFactor
Else
Else
return result E
Environmental Protection Agency
Page 757 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You reported an incorrect MODCCode in the MATS Derived Hourly Value record for
[param], as you reported substitute data for one or more essential auxiliary parameters.
You reported 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
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1 RE Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RE Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RE Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RE Calculation Verification
Environmental Protection Agency
Page 758 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSCHV-15
Check Name:
Related Former Checks:
Check MODC and determine the Formula 19 Calculated Unadjusted Value
Applicability:
Description:
Specifications:
Calculates the Unadjusted Value using Formula 19 equations.
CalculatedUnadjustedValue = null
If CurrentDhvRecordValid
If (MatsDh vRecord. IVTodcCodc in MatsDhvMeasuredModcList)
If (MatsDh vRecord. Equat i onCodc is NOT null)
Case (MatsDhvRecord.EquationCode)
"19-1" :
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false)
return result C
Else if (CalculationDiluent is equal to 20.9)
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor * [20.9 / (20.9 -
CalculationDiluent)]) * FinalConversionFactor
"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 Default Value is greater than 0 AND
is less than 1)
MoistureFraction = MonitorDefaultRecordsByHourLocation record's
DefaultValue
Else
return result F
If (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFwFactorExists is false) OR {MoistureFraction is null)
Else
Environmental Protection Agency
Page 759 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
return result C
Else if (CalculationDiluent is equal to 20.9 * (1 - MoistureFractiori))
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord.FwFactor * [20.9 / (20.9
*(1 - MoistureFractiori) - CalculationDiluent)]) * FinalConversionFactor
"19-3":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C
Else if (CalculationDiluent is equal to 20.9 * (100 - CalculationMoisture) / 100)
return result D
Else if (FinalConversionFactor is NOT null)
h2oFactor = (100 - CalculationMoisture) / 100.0
denom = ((20.9 * h2oFactor) - CalculationDiluent)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdF&ctor * (20.9 /denom))*
FinalConversionFactor
"19-3D":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C
Else if (CalculationDiluent is equal to 20.9)
return result D
Else if (FinalConversionFactor is NOT null)
h2oFactor = (100 - CalculationMoisture) / 100.0
denom = (20.9 * h2oFactor) - (CalculationDiluent * h2oFactor)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor *(20.9 / denom)) *
FinalConversionFactor
"19-4":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Environmental Protection Agency
Page 760 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
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 if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor *
{CalculationConcentration * CurrentHourlyOpRecord.FdFactor / ((100 -
CalculationMoisture) / 100.0)) * (20.9 / (20.9 - CalculationDiluent))) *
FinalConversionFactor
"19-5":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false) OR (CalculationMoisture is null)
return result C
Else if (CalculationDiluent is equal to 20.9) OR (CalculationMoisture is equal to 100)
return result D
Else if (FinalConversionFactor is NOT null)
h2oFactor = (100 - CalculationMoisture) / 100.0
denom = 20.9 - (CalculationDiluent / h2oFactor)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor * 20.9 / denom) *
FinalConversionFactor
"19-5D":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFdFactor Exists is false)
return result C
Else if (CalculationDiluent is equal to 20.9)
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FdFactor * (20.9/ (20.9 -
CalculationDiluent))) * FinalConversionFactor
"19-6" or "19-7":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactorExists is false)
Environmental Protection Agency
Page 761 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result C
Else if (CalculationDiluent is equal to 0.0)
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FcFactor * (100.0 /
CalculationDiluent)) * FinalConversionFactor
"19-8":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactor Exists is false) OR (CalculationMoisture is null)
return result C
Else if (CalculationDiluent is equal to 0.0) OR (CalculationMoisture is equal to 100)
return result D
Else if (FinalConversionFactor is NOT null)
CalculatedUnadjustedValue = (CalculationConversionFactor * (
{CalculationConcentration * CurrentHourlyOpRecord.FcFactor) /((100 -
CalculationMoisture) / 100.0) )* (100.0 / CalculationDiluent)) *
FinalConversionFactor
"19-9":
If CalculationConcentrationSubstituted OR CalculationDiluentSubstituted OR
CalculationMoistureSubstituted
return result A
Else if (CalculationDiluent is null) OR (CalculationConcentration is null) OR
(ValidFcFactor Exists is false) OR (CalculationMoisture is null)
return result C
Else if (CalculationDiluent is equal to 0.0)
return result D
Else if (FinalConversionFactor is NOT null)
h2oFactor = (100 - CalculationMoisture) / 100.0
co2Term = 100.0 / CalculationDiluent
CalculatedUnadjustedValue = (CalculationConversionFactor *
CalculationConcentration * CurrentHourlyOpRecord .FcFactor * h2oFactor *
co2Term) * FinalConversionFactor
Else
return result B
Environmental Protection Agency
Page 762 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
F
Usage:
Response
You reported an incorrect MODCCode in the MATS Derived Hourly Value record for
[param], as you reported substitute data for one or more essential auxiliary parameters.
You reported an incorrect MODCCode in the MATS Derived Hourly Value record for
[param], as you reported measured data for essential auxiliary parameters.
You reported a Formulaldentifier in the MATS Derived Hourly Value record for
[param], but you did not report a value for all the essential parameters needed to
perform the calculation.
The [param] could not be recalculated, because the diluent value would result in
division by zero.
You did not report a single valid MonitorDefault record for ParameterCode BWAfor
the hour.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
1
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1RH Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RH Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RH Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 763 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSCHV-16
Check Name: Stash Hg Calculated Value
Related Former Checks:
Applicability:
Description: Stores the HGRE or HGRH Calculated Unadjusted Value in the appropriate check parameters.
Specifications:
MatsCalculatedHgRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS Hg RH Calculation Verification
Environmental Protection Agency
Page 764 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSCHV-17
Check Name: Stash HC1 Calculated Value
Related Former Checks:
Applicability:
Description: Stores the HCLRE or HCLRH Calculated Unadjusted Value in the appropriate check parameters.
Specifications:
MatsCalculatedHclRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS HC1RH Calculation Verification
Environmental Protection Agency
Page 765 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSCHV-18
Check Name: Stash HF Calculated Value
Related Former Checks:
Applicability:
Description: Stores the HFRE or HFRH Calculated Unadjusted Value in the appropriate check parameters.
Specifications:
MatsCalculatedHfRateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS HF RH Calculation Verification
Environmental Protection Agency
Page 766 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSCHV-19
Check Name: Stash S02 Calculated Value
Related Former Checks:
Applicability:
Description: Stores the S02RE or S02RH Calculated Unadjusted Value in the appropriate check parameters.
Specifications:
MatsCalculatedSo2RateValue = CalculatedUnadjustedValue (converted to Scientific Notation, with 3 significant digits)
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RE Calculation Verification
2 Process/Category: Emissions Data Evaluation Report MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 767 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSCHV-20
Check Name: Check Unadjusted Hourly Value Tolerance
Related Former Checks:
Applicability:
Description: Ensures that the percent difference between the Unadjusted Hourly Value and Calculated Unadjsuted Hourly
Value is less than or equal to 5%.
Specifications:
If CurrentDhvRecordValid
If (MatsDh vRecord. IVTodcCodc in MatsDhvMeasuredModcList) AND (MafsDAvTtecon/.UnadjustedHourlyValue is NOT null)
AND (CalculatedUnadjustedValue is NOT null)
If (CurrentSo2 Monitor Hourly Record. Pa ra mctc rCodc is not S02RH and
CurrentSo2 Monitor Hourly Record. Pa ra mctc rCodc is not S02RE) OR (CurrentSo2MonitorHourly Record is null or
CurrentSo2MonitorHourlyRecord.ModcCodQ is not 16)
Set roundedCalculatedValue = CalculatedUnadjustedValue rounded to 3 significant digits
If ((MatsDhvRecord. UnadjustcdHourly Va 1 lie + roundedCalculatedValue) is NOT equal to 0)
Set PercentDifference = 100 * A B S( MatsDh v Record. U nadj ustcdHourly Va 1 lie - roundedCalculatedValue)
/ ((MaM)Av7te£w 5)
return result A
Results:
Result Response Severity
A The UnadjustedHourlyValue reported in the DHV record for [param] is inconsistent Critical Error Level 1
with the recalculated value.
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1 RE Calculation Verification
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1RH Calculation Verification
3
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RE Calculation Verification
4
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RH Calculation Verification
5
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RE Calculation Verification
6
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RH Calculation Verification
7
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RE Calculation Verification
8
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RH Calculation Verification
Environmental Protection Agency
Page 768 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Derived Hourly Value Checks
Environmental Protection Agency
Page 769 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-1
Check Name: Initialize HGRE Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for Hg
Specifications:
CurrentDh v Parameter = "HGRE"
MatsDh v Record = MatsHgDh v Record
MatsEquationCodeWithH2o = "A-3"
MatsEquationCodeWithoutH2o = "A-2"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RE Derived Hourly Evaluation
Environmental Protection Agency
Page 770 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-2
Check Name: Initialize HGRH Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for Hg
Specifications:
CurrentDh v Parameter = "HGRH"
MatsDh v Record = MatsHgDh v Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RH Derived Hourly Evaluation
Environmental Protection Agency
Page 771 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-3
Check Name: Initialize HCLRE Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HCL
Specifications:
CurrentDh v Parameter = "HCLRE"
MatsDh v Record = MatsHctDh v Record
MatsEquationCodeWithH2o = "HC-3"
MatsEquationCodeWithoutH2o = "HC-2"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 RE Derived Hourly Evaluation
Environmental Protection Agency
Page 772 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-4
Check Name: Initialize HCLRH Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HCL
Specifications:
CurrentDh v Parameter = "HCLRH"
MatsDh v Record = MatsHctDh v Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1RH Derived Hourly Evaluation
Environmental Protection Agency
Page 773 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-5
Check Name: Initialize HFRE Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HF
Specifications:
CurrentDhvParameter = "HFRE"
MatsDh v Record = MatsHfDh v Record
MatsEquationCodeWithH2o = "HF-3"
MatsEquationCodeWithoutH2o = "HF-2"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RE Derived Hourly Evaluation
Environmental Protection Agency
Page 774 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-6
Check Name: Initialize HFRH Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for HF
Specifications:
CurrentDhvParameter = "HFRH"
IVT atsDh v Record = MatsHfDh v Record
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RH Derived Hourly Evaluation
Environmental Protection Agency
Page 775 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-7
Check Name: Initialize S02RE Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for S02
Specifications:
CurrentDh v Parameter = "S02RE"
MatsDh v Record = MatsSo21)h v Record
MatsEquationCodeWithH2o = "S-3"
MatsEquationCodeWithoutH2o = "S-2"
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RE Derived Hourly Evaluation
Environmental Protection Agency
Page 776 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-8
Check Name: Initialize S02RH Derived Hourly Value Data
Related Former Checks:
Applicability:
Description: This check sets generic parameters and output parameters for subsequent derived hourly checks for S02
Specifications:
CurrentDh v Parameter = "S02RH"
M atsDhvRecord = MatsSo2DhvRecord
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 777 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-9
Check Name: Check Mats MODC in DHV Records
Related Former Checks:
Applicability:
Description: Basic check to ensure that Mats MODC reported in the DHV record is valid.
Specifications:
DerivedHourlyModcStatus = false
If IV! dtsDh vRecord. IVTodcCodc is equal to 36 or 38,
DerivedHourlyModcStatus = true
Else if M Atsl)h v Record. IVT odcCodc is equal to 37,
If Mats/)/?v7te/?6'cwY/.IVIatsStartupSluitdo\\ iiFlag is NOT null,
DerivedHourlyModcStatus = true
Else
return result B
Else if M Atsl)h v Record. IVT odcCodc is equal to 39,
If Mats/)/?v7te/?6'cwY/.IVIatsStartupSluitdo\\ iiFlag is NOT null,
DerivedHourlyModcStatus = true
Else
return result C
Else
return result A
Results:
Result
A
B
C
Response Severity
You reported an MODC code that is not valid for the MATS DHV. Critical Error Level 1
You reported MODC 37 for [PARAM], but did not report both a heat-input based Informational Message
MATS parameter, and a Startup/Shutdown Flag.
You reported MODC 39 for [PARAM], but did not report both an output based MATS Informational Message
parameter and a Startup/Shutdown Flag.
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1 RE Derived Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— MATS HC1RH Derived Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RE Derived Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— MATS HF RH Derived Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RE Derived Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— MATS Hg RH Derived Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RE Derived Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 778 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-10
Check Name: Check Formula in MATS DHV Record
Related Former Checks:
Applicability:
Description: (Copy of DHV-24 tailored to MATS)
Checks the Formula ID in the MATS Derived Hourly Value record and ensures that it can be used for the
calculation
Specifications:
DerivedHourlyFormulaStatus = false
If (DerivedHourlyModcStatus = true)
If (MatsD hv Record.F or muh\Kc\ is null)
If MatsDh vRecord. IVTodcCodc = "38"
return result G
else
return result A
else //FormulaKey not null
If (MatsDhv Record.V or mu\'c\kcU\c\r\A is NOT equal to 1)
return result B
Else if (MaM)Av7te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
8
Process/Category:
Emissions Data Evaluation Report
MATS HC1 RE Derived Hourly Evaluation
MATS HC1RH Derived Hourly Evaluation
MATS HF RE Derived Hourly Evaluation
MATS HF RH Derived Hourly Evaluation
MATS Hg RE Derived Hourly Evaluation
MATS Hg RH Derived Hourly Evaluation
MATS S02 RE Derived Hourly Evaluation
MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 780 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSDHV-11
Check Name: Check Equation Code for MATS RE
Related Former Checks:
Applicability:
Description: Gets Equation Code from Mats Active Monitor Formula Record and verifies that it is an appropriate equation
for calculation of HCLRE,HFRE,HGRE, S02RE
Specifications:
DerivedHourlyEquationStatus = false
If (DerivedHourlyFormulaStatus == true)
If (MatsDh vRecord. Equat i onCodc is not null)
If (MatsDhvRecord.EquationCodc ==MatsEquationCodeWithoutH2o)
DerivedHourlyEquationStatus = true
FlowMonitorHourlyChecksNeeded = true
Else If (MatsDhvRecord. EquationCodc ==MatsEquationCodeWithH2o)
Derived Hourly Equation Status = true
Flow Monitor Hourly Checks Needed = true
Moisture Needed = true
append "MIN" to H20MissingDataApproach
Else
return result A
Else
DerivedHourlyEquationStatus = true
Results:
Result Response Severity
A You reported a formula code that does not match any of the MATS derived hourly Critical Error Level 1
value formulas.
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS
2
Process/Category:
Emissions Data Evaluation Report —
— MATS
3
Process/Category:
Emissions Data Evaluation Report —
— MATS
4
Process/Category:
Emissions Data Evaluation Report —
— MATS
Environmental Protection Agency
Page 781 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSDHV-12
Check Name:
Related Former Checks:
Check Equation Code for MATS RH
Applicability:
Description:
Gets Mats Equation Code from Active Mats Monitor Formula Record and verifies that it is an appropriate
equation for Mats Current parameter.
Specifications:
DerivedHourlyEquationStatus = false
If (DerivedHourlyFormulaStatus == true)
If (MatsDh vRecord. Equat i onCodc is not null)
If (MatsDhvRecordEqaationCode in set {19-1, 19-2, 19-3, 19-3D, 19-4, 19-5, 19-5D, 19-6, 19-7, 19-8, 19-9})
DerivedHourlyEquationStatus = true
If (MatsDh vRecord. Equat i onCodc in set {19-1, 19-4} )
02DryNeededForMats = true
FD FactorNeeded = true
Else if (MatsDhvRecord.EqnationCode in set {19-3,19-3D, 19-5, 19-5D} )
()2 Wet NeededForM(its = true
FD Factor Needed = true
Else if (MatsDh vRecord. Equat i onCodc in set {19-2} )
()2 Wet Needed ForMats = true
FWFactor Needed = true
Else if (MatsDhvRecord.EqnationCode in set {19-6, 19-7, 19-8, 19-9})
C02DiluentNeededForMats = true
FCFactorNeeded = true
If (MatsDhvTtecwrf.EquationCode in set {19-3, 19-3D, 19-4, 19-5, 19-8, 19-9}
MoistureNeeded = true
Else
return result A
Else
DerivedHourlyEquationStatus= true
Results:
Result
A
Response
You reported a formula code that does not match any of the MATS derived hourly
value formulas.
Severity
Critical Error Level 1
Environmental Protection Agency
Page 782 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1 Process/Category:
2 Process/Category:
3 Process/Category:
4 Process/Category:
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
Emissions Data Evaluation Report
MATS HC1RH Derived Hourly Evaluation
MATS HF RH Derived Hourly Evaluation
MATS Hg RH Derived Hourly Evaluation
MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 783 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-13
Check Name: Complete HGRE and HGRH Derived Hourly Value
Related Former Checks:
Applicability:
Description: This check assigns parameter specific check parameters used by the associated calculation checks.
Specifications:
MatsHgDhv Parameter = CurrentI)h v Parameter
MatsHgDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg RE Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS Hg RH Derived Hourly Evaluation
Environmental Protection Agency
Page 784 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-14
Check Name: Complete HCLRE and HCLRH Derived Houly Value
Related Former Checks:
Applicability:
Description: This check assigns parameter specific check parameters used by the associated calculation checks.
Specifications:
M atsHclDh v Parameter = CurrentI)h v Parameter
MatsHclDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 RE Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HC1RH Derived Hourly Evaluation
Environmental Protection Agency
Page 785 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-15
Check Name: Complete HERE and HFRH Derived Hourly Value
Related Former Checks:
Applicability:
Description: This check assigns parameter specific check parameters used by the associated calculation checks.
Specifications:
M atsHfDh v Parameter = CurrentI)h v Parameter
MatsHfDhvValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF RE Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF RH Derived Hourly Evaluation
Environmental Protection Agency
Page 786 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSDHV-16
Check Name: Complete S02RE and S02RH Derived Hourly Value
Related Former Checks:
Applicability:
Description: This check assigns parameter specific check parameters used by the associated calculation checks.
Specifications:
MatsSo21)h v Parameter = CurrentI)h v Parameter
MatsSo2D1ivValid = DerivedHourlyEquationStatus AND DerivedHourlyUnadjustedValueStatus
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS S02 RE Derived Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 787 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSDHV-17
Check Name:
Check Unadjusted Value
Related Former Checks:
Applicability:
Description:
Specifications:
DerivedHourlyUnadjustedValueStatus = false
If (DerivedHourlyModcStatus = true)
If (MatsDhvRecord.IVTodcCodc in set {36, 37, 39})
If (MaM)Av7te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
2
Process/Category:
Emissions Data Evaluation Report
3
Process/Category:
Emissions Data Evaluation Report
4
Process/Category:
Emissions Data Evaluation Report
5
Process/Category:
Emissions Data Evaluation Report
6
Process/Category:
Emissions Data Evaluation Report
7
Process/Category:
Emissions Data Evaluation Report
8
Process/Category:
Emissions Data Evaluation Report
MATS HC1 RE Derived Hourly Evaluation
MATS HC1RH Derived Hourly Evaluation
MATS HF RE Derived Hourly Evaluation
MATS HF RH Derived Hourly Evaluation
MATS Hg RE Derived Hourly Evaluation
MATS Hg RH Derived Hourly Evaluation
MATS S02 RE Derived Hourly Evaluation
MATS S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 789 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSDHV-18
Check Name: Set Diluents Needed for Calculation
Related Former Checks:
Applicability: General Check
Description: Uses measured MODC list and C02 Diluent, 02 Dry and 02 Wet Needed for MATS check parameters to set
corresponding Needed for MATS Calculation check parameters.
Specifications:
If (DerivedHourlyEquationStatus = true) AND (DerivedHourlyModcStatus = true) AND ( MatsDhv Record Mo AcCo Ac set J 36. 37.
39})
If ( C02DiluentNeededForMats = true)
C02DiluentNeededForMatsCalculation = true
If ( 02DryNeededForMats = true)
02DryNeededForMatsCalculation = true
If ( 02WetNeededForMats = true)
02WetNeededForMatsCalculation = true
Results:
Result Response Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report —
— MATS
HC1 RE Derived Hourly Evaluation
2
Process/Category:
Emissions Data Evaluation Report —
— MATS
HC1RH Derived Hourly Evaluation
3
Process/Category:
Emissions Data Evaluation Report —
— MATS
HF RE Derived Hourly Evaluation
4
Process/Category:
Emissions Data Evaluation Report —
— MATS
HF RH Derived Hourly Evaluation
5
Process/Category:
Emissions Data Evaluation Report —
— MATS
Hg RE Derived Hourly Evaluation
6
Process/Category:
Emissions Data Evaluation Report —
— MATS
Hg RH Derived Hourly Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
— MATS
S02 RE Derived Hourly Evaluation
8
Process/Category:
Emissions Data Evaluation Report —
— MATS
S02 RH Derived Hourly Evaluation
Environmental Protection Agency
Page 790 of 959
-------
ECMPS Emissions Check Specifications
Check Category:
MATS Hourly GFM Data
3/4/2020 12:00:00AM
Environmental Protection Agency
Page 791 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSGFM-1
Check Name: Component ID Valid
Related Former Checks:
Applicability:
Description: Ensure that the Component ID is associated with "STRAIN".
Specifications:
Set MatsGfmSamplingTrain Records to null.
Set MatsHourlyGFMComponentldValid = false.
Set MatsSamplingTrainRecord to null.
Set MatsSamplingTrainQaStatus to null.
Set MatsSorbentTrapBeginDateHour to null.
Set MatsSorbentTrapEndDateHour to null.
Set MatsSamplingTrainCount to null.
If theMatsHourlyGFMRecord.ComponentlD is null,
Return result A.
Else
Locate MatsSamplingTrainRecords where:
1) Componentld is equal to MatsHourlyGFMRecord. Componcn11D
2) SorbentTrapBeginDateHour is on or before CurrentDateHour
3) SorbentTrapEndDateHour is on or after CurrentDateHour
4) Records are sorted by SorbentTrapBeginDateHour and SorbentTrapEndDateHour // The earliest sampling train is the correct
train.
Set MatsSamplingTrainCount to the number of records located in MatsSamplingTrainsRecords.
Set MatsGfmSamplingTrain Records to the records located in MatsSamplingTrainsRecords.
If not found,
Return result B.
Else
Set MatsHourlyGFMComponentldValid to true.
Set MatsSamplingTrainRecord to the first record located in MatsSamplingTrainsRecords.
Set MatsSamplingTrainQaStatus to MatsSamplingTrainRecord raiiiQAStatusCode.
Set MatsSorbentTrapBeginDateHour to MatsSamplingTrainRecord.BeginDateHour.
Set MatsSorbentTrapEndDateHour to MatsSamplingTrainRecord.EndDateHow.
Results:
Result Response
A You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
B For [key], you reported a sorbent train GFM Component ID that does not match a
sorbent train Component ID record.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hourly Gas Flow Meter Evaluation
Seventy
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 792 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSGFM-2
Check Name:
Related Former Checks:
Begin and End Hour Flags Valid
Applicability:
Description:
Check that Begin and End Hour Flags are valid
Specifications:
If MatsHourlyGFMComponentldValid is true,
If Hourly(tFMI)«. B e g i n E n d H o u r F1 a g is "I",
If CurrentDateHour is not equal to the MatsSorbentTrapBeginDateHour and is not the hour after the
MatsSorbentTrapBeginDateHour.
Return result A
Else if the Hou rly (i FM1) ?
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hourly Gas Flow Meter Evaluation
Environmental Protection Agency
Page 794 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSGFM-3
Check Name:
Related Former Checks:
Hourly GFM Reading Valid
Applicability:
Description:
Specifications:
Hourly GFM Reading Null or Reported to Two Decimal Places
If MatsHourlyGFMComponentldValid is true,
If the MatsHourlyGFMRecord.HourlyGFMRsading is null,
If the MatsSamplingTrainQaStatus is NOT equal to "INC", "EXPIRED", or "LOST", AND
Hourly(iFM1)?
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSGFM-4
Check Name:
Related Former Checks:
Average Hourly Sampling Rate Valid
Applicability:
Description:
Specifications:
Average Hourly Sampling Rate Null or Reported to Two Decimal Places
If MatsHourlyGFMComponentldValid is true,
If the MatsHourlyGFMRecord.AvgHourlySamplingRate is null,
If the MatsSamplingTrainQaStatus is NOT equal to "INC", "EXPIRED", or "LOST", AND
Hourly(iFM1)?
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSGFM-5
Check Name: Sampling Rate UOM Valid
Related Former Checks:
Applicability:
Description: Sampling Rate UOM Null or Matches UOM Code
Specifications:
If MatsHourlyGFMComponentldValid is true,
If the MatsHourlyGFMRecord. Sampl i ngRatcUOM is null,
If the MatsSamplingTrainOiiStutus is NOT equal to "INC", "EXPIRED", or "LOST", AND
Hourly(iFM1)?
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSGFM-6
Check Name:
Related Former Checks:
Hourly SFSR Ratio Valid
Applicability:
Description:
Specifications:
Hourly SFSR Ratio Null or Reported in Required Range and Decimal Places
If MatsHourlyGFMComponentldValid is true,
If the MatsHourlyGFMRecord.HourlySFSRRatio is null,
If MatsSamplingTrainQaStatus is not "INC", "EXPIRED", "LOST" or "FAILED", AND
CurrentStackFlowHourlyRecord is NOT null AND CurrentStackFlowHourlyRecord.ModcCode in set {01, 02, 03, 04,
20, 53, 54}, AND Hourly (1FMI) at a. B c g i n E n d H o u r F1 a g is NOT equal to 'N',
Return result A.
If Hourly(iFMI)?
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Add one to MatsSamplingTrainDictionary DeviatedSFSRRatioCount where the key equals
MatsSamplingTrainRecord. T raintD
Results:
Result Response
A You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
B You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
C The [fieldname] value for [key] should be reported to one decimal place.
D The [fieldname] value for [key] must be a number between 1 and 100.
E You reported a [fieldname] value in the [key] records which is not reported if the stack
gas flow rate for the hour is a substitute data value.
F You reported a [fieldname] value in the [key] records which you should not report
when a stack gas flow rate is not reported for the hour.
G 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.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hourly Gas Flow Meter Evaluation
Seventy
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 799 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSGFM-7
Check Name:
Related Former Checks:
Count Begin and End Hour Flags
Applicability:
Description:
Updates the total hours that a GFM exists for a sampling train and the count of hours where the Begin and
End Flag equals "N".
Specifications:
If MatsGfmSamplingTrainRecords is not null,
For each SamplingTrainRecord in MatsGfmSamplingTrainRecords,
If SamplingTrainRecord.TrainQAStatusCode is equal to "PASSED", "FAILED" or "UNCERTAIN", AND
SamplingTrainRecord.Ratalnd is equal to 0 (zero) or null,
If MatsSamplingTrainDictionary contains a key equal to SamplingTrainRecord.TrainID,
Add one to MatsSamplingTrainDictionary .TotalGfmCount where the key equals
SamplingTrainRecord .TrainID
If MatsHourly(tFMI)?
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Monitor Hourly Value Checks
Environmental Protection Agency
Page 801 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-1
Check Name: MATS HgC: Initialize
Related Former Checks:
Applicability:
Description:
Specifications:
Set CurrentMh v Parameter to "HGC"
Set MatsMh vRecord to MatsHgcMhvRecord
Set MatsMh vSorbentTraps to null
Set MatsMhvSupplementalSorbentTraps to null
If (MatsHgMethodRecord.IVIcthodCodc is equal to "ST") OR ((MatsHgMethodRecord.McihodCodc is equal to "CEMST") AND
(MatsHgcMhv Record.SystcmTypcCodc is equal to "ST"))
Set CurrentMhvSystemType to "ST"
Set CurrentMhvComponentType to "STRAIN"
Set MatsMhvMeasuredModcList to {01, 02, 32, 33, 41, 42, 43, 44}
Locate MatsSorbentTrapRecords where:
1) Systemld is equal to MatsMh vRecord. System ID
2) BeginDateHour is on or before CurrentDateHour
3) EndDateHour is on or after CurrentDateHour
Set MatsMh vSorb ent Traps to the located records
Else
Set CurrentMh vSystem Type to "HG"
Set CurrentMhvComponentType to "HG"
Set MatsMhv Measured ModelAst to {01, 02, 17, and 21}
Set MatsMhvUnavailableModcList to {34 and 35}
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 802 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-2
Check Name: MATS HC1C: Initialize
Related Former Checks:
Applicability:
Description:
Specifications:
Set CurrentMhvParameter to "HCLC"
Set MatsMh vRecord to MatsHclcMh vRecord
Set CurrentMhvComponentType to "HCL"
Set CurrentMh vSystem Type to"HCL"
Set MatsMhv Measured ModelAst to {01, 02, 17, and 21}
Set MatsMhvUnavailableModcList to {34 and 35}
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 803 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-3
Check Name: MATS HFC: Initialize
Related Former Checks:
Applicability:
Description:
Specifications:
Set CurrentMhv Parameter to "HFC"
Set MatsMh vRecord to MatsHfcMhvRecord
Set CurrentMhvComponentType to "HF"
Set CurrentMh vSystem Type to "HF"
Set MatsMhvMeasuredModcList to {01, 02, 17 and 21}
Set MatsMhvUnavailableModcList to {34 and 35}
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 804 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-4
Check Name: MATS: Check MODC
Related Former Checks:
Applicability:
Description: Ensure that the reported MODC is one of the valid measured or unavailable MODC for the MATS parameter.
Specifications:
Set MonitorHourlyModcStatus to false
If (MatsMh vRecord. IVTodcCodc is null)
return result A
Else if (MatsMh v Record. IVT odcCodc not in MatsMhvMeasuredModcList AND not in MatsMhv UnavailableModcList)
return result B
Else if (CurrentMhvSystemType is equal to "ST") AND (MatsMh v Record. IVT odcCodc is NOT equal to "41" or "42")
If MatsMh vSorbentTraps count is greater than 0,
If a MatsMh vSorb ent Traps record exists where:
1) ModcCode is equal to MatsMh v Record. IVT odcCodc
2) HgConcentration is equal to MatsMh vRecord. U nadj listedVa 1 uc
Then
MonitorHourlyModcStatus = true
Else
return result D
Else
MonitorHourlyModcStatus = true
Else
MonitorHourlyModcStatus = true
Results:
Result
Response
Severity
A
You did not provide a [fieldname], which is required, for [key].
Critical Error Level 1
B
The MODCCode reported for MATS Monitor Hourly Value is invalid.
Critical Error Level 1
C
The MODCCode reported for MATS Monitor Hourly Value is invalid for Hg sorbent
trap systems.
Critical Error Level 1
D
The MODCCode and UnadjustedValue combination reported for MATS Monitor
Hourly Value do not match the values for a reported Hg sorbent trap systems.
Critical Error Level 1
Environmental Protection Agency
Page 805 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 806 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-5
Check Name: MATS: Check Percent Monitor Availability
Related Former Checks:
Applicability:
Description: Ensures that the Percent Monitor Availability (PMA) was reported and is inclusively between 0 and 100.
Specifications:
Set MonitorHourlyPmaStatus = false
If (MonitorHourlyModcStatus == true)
If ( MatsMhvRecord.Pcrcclit A\ ailable is NULL)
return result A
Else if (MatsMh v Record. Pc rcc lit A\ ail ab 1 e> 100.0 OR MatsMhv Record.Vc.xcc.n\.kxi\i\i\b\c. < 0.0)
return result B
Else
Set MonitorHourlyPmaStatus = true
Results:
Result Response Severity
A You did not report a PMA for the MATS Monitor Hourly Value. Critical Error Level 1
B The PMA must be in a range from 0 to 100. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 807 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-6
Check Name: MATS: Monitoring System
Related Former Checks:
Applicability:
Description: Ensures that a Monitor System is reported when a measured MODC is reported, and that is not reported when
an unavailable MODC is reported. When Monitor System is and should have been reported, the check ensures
that the system type is valid for the MATS parameter being reported.
Specifications:
Set MonitorHourlySystemStatus = false
If (MonitorHourlyModcStatus == true)
If MatsMhv Record Mo\\\{onngSystcmID is null
If (MatsMh vRecord. IVTodcCodc in MatsMhvMeasuredModcList)
return result A
Else
return result F
Else if MatsMh vRecord. Systcm Idcnt i fic r is null
return result B
Else if (MatsMhvRecord.S\s{cmT\\~>cCoAc <> CurrentMhvSystemType)
return result C
Else if (MatsMhvRecord.SystemTypeCode is equal to "ST")
If MatsMh vSorbentTraps count is greater than 0,
MonitorHourlySystemStatus = true
Else
If (MatsMh v Record. IVT odcCodc in MatsMhvMeasuredModcList)
return result E
Else
MonitorHourlySystemStatus = true
Environmental Protection Agency
Page 808 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Response
You did not report a MonitoringSystemID for the [param] MATS Monitor Hourly
Value. MonitoringSystemID is required when you report measured data.
You reported MonitoringSystemID [ID] in the MATS MHV record for [param], but
there is no Monitoring System record 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.
You reported sorbent trap system [ID] in the MATS MHV record for [param], but the
emissions report does not contain a sorbent trap record for the system that was active
during the current hour.
You did not report a MonitoringSystemID for the [param] MATS Monitor Hourly
Value. MonitoringSystemID is required when you report unavailable data.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 809 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSMHV-7
Check Name: MATS: System Designation
Related Former Checks:
Applicability:
Description: Ensure that the System Designation Code is valid for the reported MODC.
Currently, the system designation should be 'P' for MODC 01 and 17, 'B' or 'PB' for MODC 02.
Specifications:
If (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true AND MatsMhvRecord. Systcm Idcnti ficr is not null)
case (MatsMh vRecord. IVTodcCodc)
01 OR 17: If (MatsMhvRecord.SystcmDcsignationCode <> "P")
return result A
02: If (MatsMhvRecord.SystcmDcsignationCode NOT in set {B, RB}
return result B
Results:
Result Response Severity
A You reported a MATS Hourly Value MODCCode that is only used with primary or Critical Error Level 1
temporary like kind monitoring systems.
B You reported a MATS Monitor Hourly Value MODCCode that is only used with backup Critical Error Level 1
or redundant backup monitoring systems.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 810 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-8
Check Name: MATS: Check Like Kind Analyzer Use
Related Former Checks:
Applicability:
Description: Ensures that the conditions exist that allow the use of particular MODC.
Currently only checks MODC 17.
Specifications:
If (MonitorHourlyModcStatus == true AND MonitorHourlySystemStatus == true)
If (MatsMhvRecord.IVTodcCodc == "17")
HoursOfUseOJLikeKindAnalyzer = Count of MonitorHourlyValueData records for the location and reporting period
where:
1) ParameterCode = CurrentMhvParameter
2) ModcCode == "17"
3) BeginDateHour < CurrentOperatingDateHour
If HoursOfUseOJLikeKindAnalyzer >= 720
FirstUseOJLikeKindAnalyzerRecord = MonitorHourlyValueData record at earliest time for the location and
reporting period where:
1) ParameterCode = CurrentMhvParameter
2) ModcCode == "17"
3) BeginDateHour < CurrentOperatingDateHour
Locate a RATATestRecordsByLocationForQAStatus for the location where:
1) MonitoringSystemID is equal to MatsMhv Record Mo\\\{onngSystcmID
2) TestResultCode begins with "PASS"
3) EndDate/EndHour is after the FirstUseOfLikeKindAnalyzerRecord.Date/Hour and on or prior to the
CurrentOperatingDateHour.
If not found,
return result A
Results:
Result Response
A You reported an MODCCode of 17 in the MATS Monitor Hourly Value record for
[param], indicating the use of a like-kind analyzer, but you have used a like-kind
analyzer to monitor this parameter for more than 720 hours during this reporting
period. You are not allowed to use a like-kind analyzer for more than 720 hours
during a calendar year, unless the analyzer is identified as a non-redundant backup and
a RATA is performed.
Seventy
Critical Error Level 1
Environmental Protection Agency
Page 811 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 812 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-9
Check Name: MATS: Component
Related Former Checks:
Applicability:
Description:
Specifications:
MonitorHourlyComponentStatus = false
If (CurrentMhvSystemType <> "ST")
If (MonitorHourlyModcStutus = true)
If MatsMhv Record. Component ID is null
If (MatsMh vRecord. IVTodcCodc in set MatsMhvMeasuredModcList)
return result A
Else
return result G
Else if MatsMh vRecord. Componcn11dcnt i ficr is null
return result B
Else if (MatsMhv Record.Com\~>o\\c\\{J\\~>cCoAc <> CurrentMhvComponentType)
return result C
Else if MatsMh v Record. IVT odcCodc ==17 AND MatsMh v Record. Componentldentifier does not begin with "LK"
return result D
Else
MonitorHourlyComponentStatus = true
Else
If MatsMhv Record. Component ID is NOT null
return result F
Else
MonitorHourlyComponentStatus = true
Ensures that a Component is reported when a measured MODC is reported, and that is not reported when an
unavailable MODC is reported. When Component is and should have been reported, the check ensures that
the system type is valid for the MATS parameter being reported.
Environmental Protection Agency
Page 813 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
Usage:
1
2
3
Response Severity
You did not report a ComponentID for the [param] MATS Monitor Hourly Value. Critical Error Level 1
Your reported ComponentID [ID] in the MATS MHV record for [param], but there is Critical Error Level 1
no Component record for this component in your monitoring plan.
The component type associated with the ComponentID for the [param] MATS Monitor Critical Error Level 1
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.
You did not report a ComponentID for the [param] MATS Monitor Hourly Value.
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Process/Category:
Process/Category:
Process/Category:
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 814 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-10
Check Name: MATS: System Component
Related Former Checks:
Applicability:
Description: Ensure that at least one active Monitoring System Component record exists for the Monitoring System Id and
Component Id in the current MATS MHV record.
Specifications:
If (MonitorHourlySystemStatus == true) AND (MatsMhv Record Mom{or\ ngSystcm ID is not null) AND
(MonitorHourlyComponentStatus == true) AND (MatsMhv Record.ComponentD is not null)
CountMonSysCompRecord = count MonitoringSystemComponentByHourLocation records where:
1) MonitoringSystemID = MatsMhvRecord. MonitoringSystemID
2) ComponentID = MatsMhvRecord. Component ID
If CountMonSysCompRecord = 0
return result A
Results:
Result Response Severity
A You reported MonitoringSystemID [sys] ComponentID [ID] in the MATS MHV record Critical Error Level 1
for [param], but there is no MonitorSystemComponent record for this system and
component in your monitoring plan that was active during the hour.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 815 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-11
Check Name: MATS: Max/Min Value
Related Former Checks:
Applicability:
Description: Determines the MPC for the active Monitor Span record for the hour, location and component type, returning
a check result if the a single row is not found or the MPC is not greater than 0.
Specifications:
CurrentMHVMaxMin Value = null
If (MonitorHourlyModcStatus == true AND MatsMhvRecord. IVTodcCodc in set MatsMhvMeasuredModcList)
If (CurrentMhvComponentType == "HG")
MonitorSpanRecordCount = Find active MonitorSpanRecordByHourAndLocation where:
1) ComponentTypeCode = CurrentMhvComponentType AND
2) SpanScaleCode = "H"
If (.MonitorSpanRecordCount > 1)
return result A
Else if (.MonitorSpanRecordCount = 0)
return result B
Else
CurrentMonitorSpanRecord = the single matched record
If CurrentMonitorSpanRecord.MPCValue > 0)
CurrentMhvMaxMinValue = CurrentMonitorSpanRecord.MPCValuQ
Else
return result C
Results:
Result Response Severity
A You have more than one active High Range SpanScaleCode at the current location for Critical Error Level 1
the hour.
B You have no active High Range SpanScaleCode at the current location for the hour. Critical Error Level 1
C The value in the reported span record for [param] is invalid. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 816 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSMHV-12
Check Name:
Related Former Checks:
MATS: Unadjusted Value
Applicability:
Description:
Specifications:
Validates the value and format of the reported unadjusted hourly value.
MonitorHourlyUnadjustedValueStatus = false
Mats Mil v' Calcu Iated Value = null
If (MonitorHourlyModcStatus == true)
Case (MatsMh vRecord. IVTodcCodc)
= 21:
MatsMhvCalculatedValue= 0.00E0
If (MatsMhv'wy/.UnadjustedHourly Va 1 ue == 0.00E0)
MonitorHourlyUnadjustedValueStatus = true
Else
return result A
= All Other Codes:
If (MatsMh v Record. IVT odcCodc in set MatsMhvMeasuredModcList)
If (MatsMh v'wy/. U nadj ustedHourly Va 1 ue is null)
return result B
Else if (MatsMh vRecord. U n a dj u s t cd H o u r l y Va 1 uc is not reported in scientific notation to three significant
digits)
return result C
Else if (MatsMh v Record. U n a dj u s t cd H o u r ly Va 1 lie < 0.00E0)
return result D
MonitorHourlyUnadjustedValueStatus = true
MatsMhvCalculatedValue = MatsMh v /?6'cmy/ . U n a dj u s t c d H o u r ly Va 1 u c
If (CurrentMhvMaxMinValue is not null AND MatsMh v Record. U n a dj u s t cd H o u r ly Va 1 lie >
CurrentMhvMaxMin Value)
return result E
Else
Else
If (MatsMh v /?6'cmy/ . U n a dj ii s t c d H o ii r ly Va 1 ii c is not null)
return result F
Environmental Protection Agency
Page 817 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
Response
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 UnadjustedHourly 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.
You reported a negative value, which is invalid, in the field [fieldname] for [key].
Warning: The UnadjustedHourly Value 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 UnadjustedHourly Value.
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 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 818 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSMHV-13
Check Name:
Related Former Checks:
MATS: QA Status Required and QA Status Parameters
Applicability:
Description:
Sets QA Status value and is required parameters.
Specifications:
Set QaStatusComponentBeginDate = MatsMh vRecord. Componcnt Begi n Datc
Set QaStatusComponentld = MatsMh vRecord. Componcn11d
Set QaStatusComponentldentifier = MatsMh vRecord. Componcn11dcnt i ficr
Set QaStatusComponentTypeCode = MatsMh vRecord. ComponcntTypcCode
Set QaStatusSystemDesignationCode = MatsMh vRecord. Sy s t c m D c s i g n a t i o n C ode
Set QaStatusSystemld = MatsMh vRecord. System Id
Set QaStatusSystemldentifier = MatsMh v Record. Sy s t e m I dc n t i fi e r
Set QaStatusSystemTypeCode = MatsMh v Record. Sy s t c m Ty pc C ode
If MatsMhvRecord.ParamctcrCodc is equal to "HGC", "HCLC" or "HFC",
Locate the earliest record in EmLocation Program Records based on EmissionsRecordingBeginDate where:
1) ProgramCode is equal to 'MATS'.
2) EmissionsRecordingBeginDate is less than or equal to the Date of CurrentDateHour.
3) EndDate is null or is greater than or equal to the Date of CurrentDateHour.
Set QaStatusMatsErbDate to EmissionsRecordingBeginDate in the record located in LocationProgramRecords.
else
Set QaStatusMatsErbDate to null.
Set QaStatusMatsErbDate to null.
Set DailyCalStatusRequired = false.
Set LinearityStatusRequired = false.
Set QuarterlyGasAuditStatus = false.
Set RataStatusRequired = false.
Set WsiStatusRequired = false.
if (MonitorHourlyModcStatus == true) AND (MatsMhvRecord. IVTodcCodc in MatsMhvMeasuredModcList) AND
(MatsMh v'wy/. U nadj ustcdHourly Va 1 uc is not null)
if (MonitorHourlyComponentStatus = true) AND (MatsMhvRecord.ComponentD is not null)
if found
else
if (MatsMh v Record. Pa ra mctc rCodc is equal to "HGC")
If (MatsMhvRecord.ComponcniTxpcCodc is equal to "HG")
Set DailyCalStatusRequired = true.
Set LinearityStatusRequired = true.
Set WsiStatusRequired = true.
else if (MatsMh v Record. Pa ra mctc rCodc is in set {"HCLC", "HFC"})
Set Quarterly GasAuditStatus = true.
if (MonitorHourlySystemStatus = true) AND (MatsMhv Record.MonUonngSystcmID is not null)
Environmental Protection Agency
Page 819 of 959
-------
ECMPS Emissions Check Specifications
Set RataStatusRequired = true.
3/4/2020 12:00:00AM
Results:
Result
Usage:
1
2
3
Response
Process/Category:
Process/Category:
Process/Category:
Severity
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 820 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-14
Check Name: MATS HgC: Complete
Related Former Checks:
Applicability:
Description: Assigns the calculated values for MATS Hg Concentration Monitor Hourly.
Specifications:
MatsMhvCalculatedHgcValue = MatsMhvCalculatedValue
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 821 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-15
Check Name: MATS HC1C: Complete
Related Former Checks:
Applicability:
Description: Assigns the calculated values for MATS HC1 Concentration Monitor Hourly.
Specifications:
MatsMhvCalculatedHclcValue = MatsMhvCalculatedValue
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 822 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-16
Check Name: MATS HFC: Complete
Related Former Checks:
Applicability:
Description: Assigns the calculated values for MATS HF Concentration Monitor Hourly.
Specifications:
MatsMhvCalculatedHfcValue = MatsMhvCalculatedValue
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 823 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSMHV-17
Check Name:
Related Former Checks:
MATS: QA Status Analyzer Range Parameters
Applicability:
Description:
Sets analyzer range parameters for Linearity and Daily Calibration QA status checking.
Specifications:
If (LinearityStatusRequired == true) OR (DailyCalStatusRequired == true)
Set DualRangeStatus = false.
Set ApplicableComponentID = null.
Set ApplicableSystemlDs = null.
Set CurrentAnalyzerRangeUsed = null.
Set HighRangeComponentID = null.
Set LowRangeComponentID = null.
Locate a record in AnalyzerRangeRecordsByHourLocation for the hour and location where the ComponentID is equal to the
QaStatusComponentld.
If (AnalyzerRangeRecordsByHourLocation is not found OR if more than one AnalyzerRangeRecordsByHourLocation is found)
Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result A
Else if (AnalyzerRangeRecordsByHourLocationDualRangelndicator = 1)
Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result B
Else if (AnalyzerRangeRecords/iyHourLocation. Am\\zcrRm\gcCodc <> "H")
Set LinearityStatusRequired = false
Set DailyCalStatusRequired = false
return result C
Else
Set CurrentAnalyzerRangeUsed = AnalyzerRangeRecordsByHourLocation. AnalyzerKangeCode.
Set ApplicableComponentID = QaStatusComponentld.
Set HighRangeComponentID = QaStatusComponentld.
For each record in MonitorSystemComponentRecordsByHourLocation where the ComponentID is equal to the
ApplicableComponentID
Append MonitorSystemComponentRecordsByHourLocation. SystemID to ApplicableSystemlDs.
if (MonitorSystemComponentRecordsByHourLocation is not found)
set LinearityStatusRequired = false
Environmental Protection Agency
Page 824 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
set DailyCalStatusRequired = false
return result D
Results:
Result
A
B
C
D
Response
You did not report one (and only one) valid Analyzer Range record in your monitoring
plan for ComponentID [COMPID] for this hour. The QA Status of the linearity and/or
daily calibration tests for this component will not be evaluated.
You reported that ComponentID [COMPID] is a dual range analyzer, but dual range
analyzers are not allowed for MATS. The QA Status of the linearity and/or daily
calibration tests for this component will not be evaluated.
You reported that ComponentID [COMPID] is not a high range analyzer, but only a
high range analyzer is allowed for MATS. The QA Status of the linearity and/or daily
calibration tests for this component will not be evaluated.
You did not report any System Component records for ComponentID [compid] in your
monitoring plan for the hour. The Q A Status of the linearity and/or daily calibration
tests for this component will not be evaluated.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS HC1 Concentration Monitor Hourly Evaluation
2 Process/Category: Emissions Data Evaluation Report MATS HF Concentration Monitor Hourly Evaluation
3 Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 825 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-19
Check Name: MATS HgC: 3-Level System Integrity Status Check
Related Former Checks:
Applicability:
Description: Ensures that a 3-Level system integrity was performed for a non-like-kind analyzer component. If a 120 or
125 certification event occurred, this check ensures that either 168 hours or 90/180 has not elapsed since the
event, or that a 3-Level system integrity was performed after the event.
Specifications:
Set MatsHg3LevelSiTesttRecord to null.
Set MatsHg3LevelSiEventRecord to null.
Set MatsHg3LevelSiMissingOpSuppData to null.
If WsiStatusRequired is equal to true, AND QaStatusComponentldentifler does not begin with "LK"
Set CertEventRecord to null.
Locate the most recent Mats3LevelSystemIntegrityRecordsForQaStatus record where:
1) ComponentID is equal to QaStatusComponentld.
2) EndDateHour is prior to CurrentDateHour, OR EndDateHour is CurrentDateHour, EndMinute is less than 45.
3) TestResult is equal to "PASSED" or "PASSAPS".
If found,
Set MatsHg3LevelSiTesttRecord to the located record in Mats3LevelSystemIntegrityRecordsForQaStatus.
If MatsHg3LevelSiTesttRecord is NOT null,
Locate the most recent record in QACertiflcationEventRecords where:
la) QaCertEventDateHour is equal to CurrentDateHour and ConditionalBeginDateHour, OR
lb) QaCertEventDateHour is prior to CurrentDateHour.
2) ComponentID is equal to QaStatusComponentld.
3) QaCertEventCode is equal to "100", "101", "120" or "125".
4) QaCertEventDateHour is after MatsHg3/. eve/Si TesttRecord. EndDateHour.
If found,
Set CertEventRecord to the located record in QACertiflcationEventRecords
Else
Locate the most recent record in QACertiflcationEventRecords where:
la) QaCertEventDateHour is equal to CurrentDateHour and ConditionalBeginDateHour, OR
lb) QaCertEventDateHour is prior to CurrentDateHour.
2) ComponentID is equal to QaStatusComponentld.
3) QaCertEventCode is equal to "100", "101", "120" or "125".
If found,
Set CertEventRecord to the located record in QACertiflcationEventRecords
If CertEventRecord is NOT null,
Set MatsHg3LevelSiEventRecord to CertEventRecord.
If CertEventRecord. ConditionalBeginDateHour is NOT null, AND is on or prior to CurrentDateHour,
Environmental Protection Agency
Page 826 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Determine ConditionalDataStatus:
When CertEventRecord.QaCertEyentCode is equal to "125":
1) If QaStatusComponentBeginDate is null, set ConditionalDataStatus to EXPIRED.
2) Locate a record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where ProgramCode equals "MATS" and
UnitMonitorCertBeginDate is on or before QaStatusComponentBeginDate.
3) If not found, locate a record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where ProgramCode equals "MATS" and
EmissionsRecordingBeginDate on or before QaStatusComponentBeginDate.
4) If a LocationProgramRecordsByHourLocation was not located, set ConditionalDataStatus
to MISSINGPROGRAM.
5) Else if UnitMonitorCertDeadline of the located record is NOT null, AND is on or prior to the
date of CurrentDateHour, set ConditionalDataStatus to EXPIRED.
6) Else if UnitMonitorCertDeadline of the located record is null, AND
UnitMonitorCertBeginDate + 180 is on or prior to the date of CurrentDateHour, set
ConditionalDataStatus to EXPIRED.
7) Otherwise set ConditionalDataStatus to VALID.
When CertEventRecord.QaCertEventCode is equal to "100", "101" or "120":
1) If CerffiVewtftecordConditionalBeginDateHourisnull, set ConditionalDataStatus to
EXPIRED
2) Else if the number of clock hours on or after CerffiVewtftecordConditionalBeginDateHour
and on or before CurrentDateHour is less than or equal to 168, set ConditionalDataStatus to
VALID
3) Else if (ecore/.ConditionalBcginDatcHour and CurrentDateHour are in the same
quarter,
a) Count the HourlyOperatingDataRecordsForLocation where:
• OpTime is greater than 0.
• DateHour is on or after ('m/tVe^/tecwi:/. Conditional Begin DateHour.
• DateHour is on or before CurrentDateHour.
b) If count is greater than 168, set ConditionalDataStatus to EXPIRED.
c) Otherwise set ConditionalDataStatus to VALID.
4) Else
/* Grab the operating hours for the current quarter on or before the current hour */
a) Set OperatingHoursCurrentQuarter to:
• The value of RptPeriodOpHoursAccumulatorArray for the location when it is
not -1.
• Otherwise, 0.
b) If OperatingHoursCurrentQuarter is greater than 168, set ConditionalDataStatus to
EXPIRED
/* Find sum of Op Hours for supplemental record between the quarter of the event
quarter and the current quarter */
c) Else set OperatingHoursBetweenQuarters to the sum of Op Value for
OperatingSuppDataRecordsByLocation where:
• OpTypeCode equals "OPHOURS".
• FuelCode is null.
• ReportingPeriod is for a quarter after the quarter of
('m/'.Vw?/^ £'«;«/. Conditional Begin DateHour and before the quarter of
CurrentDateHour.
/* Determine whether the operating hours for the current and 'between' quarters exceed
the allowed */
d) If OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters is greater than
168, set ConditionalDataStatus to EXPIRED.
Environmental Protection Agency
Page 827 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
/* Stop checking if subsequent checks are affected by missing data */
e) Else if value of RptPeriodOpHoursAccumulatorArray for the location is -1, set
ConditionalDataStatus to MISSINGACCUM.
f) Else if an OperatingSuppDataRecordsByLocation was missing for any quarter, set
ConditionalDataStatus to MISSINGOPSUPP and append the quarter description to
MatsHg3LevelSiMissingOpSuppData.
/* Use QA Cert Event Supplemental Data for Conditional Begin Date if it exists */
g) Else if Cm/•.Ve«//fe6r;re/.ConditionalBcginHourSuppDataExists is true.
i) If OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
CerffiVewtftecoriiConditionalBeginOpHoursCount is less than or equal to 168,
set ConditionalDataStatus to VALID.
ii) Otherwise set ConditionalDataStatus to EXPIRED.
/* Find Op Hours supplemental record for the quarter of the event */
h) Else set OperatingHoursEventQuarter to Op Value of the
OperatingSuppDataRecordsByLocation where:
• OpTypeCode equals "OPHOURS".
• FuelCode is null.
• ReportingPeriod is the quarter of
('ert/'.Ve/?/^ ecore/. Conditional BcginDatcHour.
i) If a record was not found, set ConditionalDataStatus to MISSINGOPSUPP and
append the quarter description to MatsHg3LevelSiMissingOpSuppData.
/* Check whether assuming that every hour in the event quarter is operating would not
exceed allowed */
j) Else if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
OperatingHoursEventQuarter is less than or equal to 168, set ConditionalDataStatus to
VALID
/* Check whether assuming the minimum number of operating hours in the event
quarter would exceeding allowed */
k) Else if OperatingHoursEventQuarter is greater than the number of clock hours in the
quarter prior to CerffiVewtftecordConditionalBeginDateHour,
1) And if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
0OperatingHoursEventQuarter minus the number of prior clock hours) is greater than
168,
m) Then set ConditionalDataStatus to EXPIRED
/* Check that treating every calendar hour on or after the conditional data begin hour as
an operating hour does not exceed allowed */
n) Else if OperatingHoursEventQuarter is greater than the number of clock hours in the
quarter on or after CerffiVewtftecordConditionalBeginDateHour,
o) And if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters + the
number of on or after clock hours is less than or equal to 168
p) Then set ConditionalDataStatus to VALID,
/* Cannot determine whether allowed operating hours were exceeded because of
uncertainty about operating hours in event quarter */
q) Else set ConditionalDataStatus to UNDETERMINED
If ConditionalDataStatus is equal to EXPIRED,
If SystemlntegrityRecord is null,
return result A.
Else
return result B.
Else if ConditionalDataStatus is equal to UNDETERMINED,
If SystemlntegrityRecord is null,
Environmental Protection Agency
Page 828 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
return result D.
Else
return result E.
Else if ConditionalDataStatus is equal to MISSINGPROGRAM,
return result F.
Else if ConditionalDataStatus is equal to MISSINGACCUM,
return result G.
Else if ConditionalDataStatus is equal to MISSINGOPSUPP,
return result H.
Else if ConditionalDataStatus is equal to MISSINGVALUE,
return result I.
Else
return result J.
Else if MatsHg3LevelSiTesttRecord is null
return result C.
Else if MatsHg3/.eve/SiTesttRecorcLQnNeedsEva 1 uationF1 ag is equal to "Y",
return result K.
Environmental Protection Agency
Page 829 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Usage:
1
Response
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. A prior test was ignored.
You did not report a prior [testtype] or certification event for [key].
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for [key]
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for [key]
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 [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 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.
A prior required parameter for check execution has failed to load. Please contact
technical support.
You reported a QA Certification Event record for Component [key], QACertEventCode
[code] and QACertEventDate [eventdate], but the conditional data period has not
started.
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
Informational Message
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
Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 830 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSMHV-20
Check Name: MATS HgC: Linearity Status Check
Related Former Checks:
Applicability:
Description: Ensures that a Hg Linearity was performed for a non-like-kind analyzer component. If a 120 or 125
certification event occurred, this check ensures that either 168 hours or 90/180 has not elapsed since the event,
or that an Hg Linearity was performed after the event.
Specifications:
Set MatsHgLinearityTestRecord to null.
Set MatsHgLinearityEventRecord to null.
Set MatsHgLinearityMissingOpSuppData to null.
If WsiStatusRequired is equal to true, AND QaStatusComponentldentifier does not begin with "LK"
Set CertEventRecord to null.
Locate the most recent Mats3LevelSystemIntegrityRecordsForQaStatus record where:
1) ComponentID is equal to QaStatusComponentld.
2) EndDateHour is prior to CurrentDateHour, OR EndDateHour is CurrentDateHour, EndMinute is less than 45,
3) TestResult is equal to "PASSED" or "PASSAPS".
If found,
Set MatsHgLinearityTestRecord to the located record in Mats3LevelSystemIntegrityRecordsForQaStatus.
If MatsHgLinearityTestRecord is NOT null,
Locate the most recent record in QACertificationEventRecords where:
la) QaCertEventDateHour is equal to CurrentDateHour and ConditionalBeginDateHour, OR
lb) QaCertEventDateHour is prior to CurrentDateHour.
2) ComponentID is equal to QaStatusComponentld.
3) QaCertEventCode is equal to "100", "101", "120" or "125".
4) QaCertEventDateHour is after MatsHgL in earity Test Record .EndDateHour.
If found,
Set CertEventRecord to the located record in QACertificationEventRecords
Else
Locate the most recent record in QACertificationEventRecords where:
la) QaCertEventDateHour is equal to CurrentDateHour and ConditionalBeginDateHour, OR
lb) QaCertEventDateHour is prior to CurrentDateHour.
2) ComponentID is equal to QaStatusComponentld.
3) QaCertEventCode is equal to "100", "101", "120" or "125".
If found,
Set CertEventRecord to the located record in QACertificationEventRecords
If CertEventRecord is NOT null
Set MatsHgLinearityEventRecord to CertEventRecord.
Environmental Protection Agency
Page 831 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If ('m/'.Ve«//^ecore/.ConditionalBcginDatcHour is NOT null, AND is on or prior to CurrentDateHour,
Determine ConditionalDataStatus:
When CertEventRecord.QaCertEyentCode is equal to "125":
1) If QaStatusComponentBeginDate is null, set ConditionalDataStatus to EXPIRED.
2) Locate a record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where ProgramCode equals "MATS" and
UnitMonitorCertBeginDate is on or before QaStatusComponentBeginDate.
3) If not found, locate a record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where ProgramCode equals "MATS" and
EmissionsRecordingBeginDate on or before QaStatusComponentBeginDate.
4) If a LocationProgramRecordsByHourLocation was not located, set ConditionalDataStatus
to MISSINGPROGRAM.
5) Else if UnitMonitorCertDeadline of the located record is NOT null, AND is on or prior to the
date of CurrentDateHour, set ConditionalDataStatus to EXPIRED.
6) Else if UnitMonitorCertDeadline of the located record is null, AND
UnitMonitorCertBeginDate + 180 is on or prior to the date of CurrentDateHour, set
ConditionalDataStatus to EXPIRED.
7) Otherwise set ConditionalDataStatus to VALID.
When CertEventRecord.QaCertEventCode is equal to "100", "101" or "120":
1) If CerffiVewtftecordConditionalBeginDateHourisnull, set ConditionalDataStatus to
EXPIRED
2) Else if the number of clock hours on or after CerffiVewtftecordConditionalBeginDateHour
and on or before CurrentDateHour is less than or equal to 168, set ConditionalDataStatus to
VALID
3) Else if (ecore/.ConditionalBcginDatcHour and CurrentDateHour are in the same
quarter,
a) Count the HourlyOperatingDataRecordsForLocation where:
• OpTime is greater than 0.
• DateHour is on or after ('m/tVe^/tecwi:/. Conditional Begin DateHour.
• DateHour is on or before CurrentDateHour.
b) If count is greater than 168, set ConditionalDataStatus to EXPIRED.
c) Otherwise set ConditionalDataStatus to VALID.
4) Else
/* Grab the operating hours for the current quarter on or before the current hour */
a) Set OperatingHoursCurrentQuarter to:
• The value of RptPeriodOpHoursAccumulatorArray for the location when it is
not -1.
• Otherwise, 0.
b) If OperatingHoursCurrentQuarter is greater than 168, set ConditionalDataStatus to
EXPIRED
/* Find sum of Op Hours for supplemental record between the quarter of the event
quarter and the current quarter */
c) Else set OperatingHoursBetweenQuarters to the sum of Op Value for
OperatingSuppDataRecordsByLocation where:
• OpTypeCode equals "OPHOURS".
• FuelCode is null.
• ReportingPeriod is for a quarter after the quarter of
('m/'.Vw?/^ £'«;«/. Conditional Begin DateHour and before the quarter of
CurrentDateHour.
/* Determine whether the operating hours for the current and 'between' quarters exceed
the allowed */
d) If OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters is greater than
Environmental Protection Agency
Page 832 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
168, set ConditionalDataStatus to EXPIRED.
/* Stop checking if subsequent checks are affected by missing data */
e) Else if value of RptPeriodOpHoursAccumulatorArray for the location is -1, set
ConditionalDataStatus to MISSINGACCUM.
f) Else if an OperatingSuppDataRecordsByLocation was missing for any quarter, set
ConditionalDataStatus to MISSINGOPSUPP and append the quarter description to
MatsHgLinearityMissingOpSuppData.
/* Use QA Cert Event Supplemental Data for Conditional Begin Date if it exists */
g) Else if Cm/•.Ve«//fe6r;re/.ConditionalBcginHourSuppDataExists is true.
i) If OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
CerffiVewtftecoriiConditionalBeginOpHoursCount is less than or equal to 168,
set ConditionalDataStatus to VALID.
ii) Otherwise set ConditionalDataStatus to EXPIRED.
/* Find Op Hours supplemental record for the quarter of the event */
h) Else set OperatingHoursEventQuarter to Op Value of the
OperatingSuppDataRecordsByLocation where:
• OpTypeCode equals "OPHOURS".
• FuelCode is null.
• ReportingPeriod is the quarter of
('ert/'.Ve/?/^ecore/.ConditionalBcginDatcHour.
i) If a record was not found, set ConditionalDataStatus to MISSINGOPSUPP and
append the quarter description to MatsHgLinearityMissingOpSuppData.
/* Check whether assuming that every hour in the event quarter is operating would not
exceed allowed */
j) Else if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
OperatingHoursEventQuarter is less than or equal to 168, set ConditionalDataStatus to
VALID
/* Check whether assuming the minimum number of operating hours in the event
quarter would exceeding allowed */
k) Else if OperatingHoursEventQuarter is greater than the number of clock hours in the
quarter prior to CerffiVewtftecordConditionalBeginDateHour,
1) And if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters +
0OperatingHoursEventQuarter minus the number of prior clock hours) is greater than
168,
m) Then set ConditionalDataStatus to EXPIRED
/* Check that treating every calendar hour on or after the conditional data begin hour as
an operating hour does not exceed allowed */
n) Else if OperatingHoursEventQuarter is greater than the number of clock hours in the
quarter on or after CerffiVewtftecordConditionalBeginDateHour,
o) And if OperatingHoursCurrentQuarter + OperatingHoursBetweenQuarters + the
number of on or after clock hours is less than or equal to 168
p) Then set ConditionalDataStatus to VALID,
/* Cannot determine whether allowed operating hours were exceeded because of
uncertainty about operating hours in event quarter */
q) Else set ConditionalDataStatus to UNDETERMINED
If ConditionalDataStatus is equal to EXPIRED,
If HgLinearityRecord is null,
return result A.
Else
return result B.
Else if ConditionalDataStatus is equal to UNDETERMINED,
Environmental Protection Agency
Page 833 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If HgLinearityRecord is null,
return result D.
Else
return result E.
Else if ConditionalDataStatus is equal to MISSINGPROGRAM,
return result F.
Else if ConditionalDataStatus is equal to MISSINGACCUM,
return result G.
Else if ConditionalDataStatus is equal to MISSINGOPSUPP,
return result H.
Else if ConditionalDataStatus is equal to MISSINGVALUE,
return result I.
Else
return result J.
Else if MatsHgLinearityTestRecord is null
return result C.
Else if MatsHgLinearityTestf/tecon/.QaNeedsEvaluationFlag is equal to "Y",
return result K.
Environmental Protection Agency
Page 834 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
F
G
H
I
J
K
Usage:
1
Response
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. A prior test was ignored.
You did not report a prior [testtype] or certification event for [key].
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for [key]
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for [key]
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 [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 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.
A prior required parameter for check execution has failed to load. Please contact
technical support.
You reported a QA Certification Event record for Component [key], QACertEventCode
[code] and QACertEventDate [eventdate], but the conditional data period has not
started.
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
Informational Message
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
Process/Category: Emissions Data Evaluation Report MATS Hg Concentration Monitor Hourly Evaluation
Environmental Protection Agency
Page 835 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Operating Hour Checks
Environmental Protection Agency
Page 836 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-1
Check Name: MATS Hg: Locate Active Monitor Method
Related Former Checks:
Applicability:
Description: Locates the active Monitor Method record with Parameter Code equal to 'HGRE' or 'HGRH' and for the current
hour and location. Returns a negative result if more than one active record is found. Returns the record and
the Parameter Code in the record as output parameters if one record is found.
Specifications:
Set MatsHgMethodRecord to null.
Set MatsHgParameterCode to null.
Set MatsHgMethodCode 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.
Set MatsHgMethodCode to MatsHgMethodRecord.MethodCode.
If MatsHgMethodCode is equal to "ST" or "CEMST",,
Set FlowMhvOptionallyAllowed to true.
Results:
Result Response Severity
A You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1
location.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 837 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-2
Check Name: MATS HC1: Locate Active Monitor Method
Related Former Checks:
Applicability:
Description: Locates the active Monitor Method record with Parameter Code equal to 'HCLRE' or 'HCLRH' and for the
current hour and location. Returns a negative result if more than one active record is found. Returns the
record and the Parameter Code in the record as output parameters if one record is found.
Specifications:
Set MatsHclMethodRecord to null.
Set MatsHclParameterCode to null.
Set MatsHclMethodCode 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.
Set MatsHclMethodCode to MatsHclMethodRecord.MethodCode.
Results:
Result Response Severity
A You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1
location.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 838 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-3
Check Name: MATS HF: Locate Active Monitor Method
Related Former Checks:
Applicability:
Description: Locates the active Monitor Method record with Parameter Code equal to 'HFRE' or 'HFRH' and for the current
hour and location. Returns a negative result if more than one active record is found. Returns the record and
the Parameter Code in the record as output parameters if one record is found.
Specifications:
Set MatsHfMethodRecord to null.
Set MatsHfParameterCode to null.
Set MatsHfMethodCode to null.
If DerivedHourlyChecksNeeded is equal to true,
Locate Monitor MethodRecordsBy Hour Location 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.
Set MatsHfMethodCode to MatsHfMethodRecordMeihoACoAe.
Results:
Result Response Severity
A You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1
location.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 839 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-4
Check Name: MATS S02: Locate Active Monitor Method
Related Former Checks:
Applicability:
Description: Locates the active Monitor Method record with Parameter Code equal to 'S02RE' or 'S02RH' and for the
current hour and location. Returns a negative result if more than one active record is found. Returns the
record and the Parameter Code in the record as output parameters if one record is found.
Specifications:
Set MatsSo2 Met It otlRecord to null.
Set MatsSo2ParameterCode to null.
Set MatsSo2 Met It odCode 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 MatsSo 2 Met It odRecord to the located record.
Set MatsSo2 ParameterCode to MatsSo2 Met It od Record. Pa ra m c t c rC ode.
Set MatsSo2 Met It odCode to MatsSo2 MethodRecord.McihodCodc.
Results:
Result Response Severity
A You reported more than one monitoring method record for [param] for the hour and Critical Error Level 1
location.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 840 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-5
Check Name: MATS: Set MATS Expected Flag
Related Former Checks:
Applicability:
Description: Uses whether MATS Hg Method Code, MATS HC1 Method Code, MATS HF Method Code or MATS S02
Method Code is not null to determine whether MATS is expected.
Specifications:
If MatsHgParameterCode, MatsHclParameterCode, MatsHfParameterCode or MatsSo2ParameterCode is not null,
Set MatsExpected to true.
Else
Set MatsExpected to false.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 841 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-6
Check Name: MATS Hg: Locate Derived Hourly Record
Related Former Checks:
Applicability:
Description: Locates the MATS Derived Hourly record with Parameter Code equal to 'HGRE' or 'HGRH' and for the current
hour and location. Returns a negative result if more than one active record is found. Returns the record, flags
indicating whether 'HGRE' or 'HGRH' checks are needed, and a flag indicating that Hg Concentration is
needed, if one record is found.
Specifications:
Set MatsHgreDhvChecksNeeded to false.
Set MatsHgrhDhvChecksNeeded to false.
Set MatsHgcNeeded to false.
Set MatsHgDhvRecord to null.
Set 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.OpcraUngTunc is greater than 0
If MatsHgParameterCode is null,
If RecordCount is greater than 0,
return result A.
Else /* Method Exists for Hg */
If RecordCount is equal to 0,
return result E
Else if RecordCount is greater than 1,
return result B.
Else /* RecordCount is equal to 1 */
Set MatsHgDhvRecord to the located MatsDhvRecordsByHourLocation record
Append MatsHgDh vRecord. U n a d j u s t ed H o u r 1 y Va 1 lie to ApportionmentHgRateArray
Append MatsHgDhvRecord.ModcCode to MatsMSl HgModcCodeArray
If MatsHgDhvRecord. ParamctcrCodc is equal to MatsHgParameterCode
If MatsHgMethodCode is equal to "CALC",
If MatsHgDhvRecord. Equat i onCodc is null,
If MatsHgDhvRecord .ModcCode is NOT equal to "38",
return result F.
Else
return result H.
Environmental Protection Agency
Page 842 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Else
If MatsHgDhvRecord.EquationCode is NOT equal to "MS-1",
return result F.
Else if MatsHgDhvRecord.ModcCode is NOT equal to "38",
Set MatsMslHgDhvId to MatsHgDhvRecord. IVIatsDhv Id
Set MatsMslHgUnadjustedHrlyValue to
MatsHgDhvRecord. U nadj ustcdH rly Va 1 lie
Set MatsParameterPluginHg to MatsHgDhvRecord.ParameterCode
Else
If MatsHgDhvRecord.EquationCodc is equal to "MS-1",
return result G.
Else
Set MatsHgcNeeded to true.
If MatsHgDhvRecord. ParamctcrCodc is equal to 'HGRE',
Set MatsHgreDhvChecksNeeded to true.
Else if MatsHgDhvRecord.ParameterCode is equal to 'HGRH',
Set MatsHgrhDhvChecksNeeded to true.
Else /* DHV and Method parameter code mismatch */
return result C.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Results:
Result Response Severity
A MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
B You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1
hour.
C MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
D You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1
the unit did not operate in the hour.
E No required MATS Derived Hourly Value records were reported for [param]. Critical Error Level 1
F The reported MATS method code is equal to "CALC." However, the appropriate Critical Error Level 1
Formula Code "MS-1" has not been reported.
G The reported Formula Code of "MS-1" is inconsistent with the reported MATS Method Critical Error Level 1
Code.
H The reported MATS method code is equal to "CALC." However, the appropriate Informational Message
Formula Code "MS-1" has not been reported.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 843 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-7
Check Name: MATS HC1: Locate Derived Hourly Record
Related Former Checks:
Applicability:
Description: Locates the MATS Derived Hourly record with Parameter Code equal to 'HCLRE' or 'HCLRH' and for the
current hour and location. Returns a negative result if more than one active record is found. Returns the
record, flags indicating whether 'HCLRE' or 'HCLRH' checks are needed, and a flag indicating that Hg
Concentration is needed, if one record is found.
Specifications:
Set MatsHclreDhvChecksNeeded to false.
Set MatsHclrhDhvChecksNeeded to false.
Set MatsHclcNeeded to false.
Set MatsHclDhvRecord to null.
Set MatsHclDhv 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.OpcraUngTunc is greater than 0
If MatsHclParameterCode is null,
If RecordCount is greater than 0,
return result A.
Else /* Method Exists for HC1 */
If RecordCount is equal to 0,
return result E
Else if RecordCount is greater than 1,
return result B.
Else /* RecordCount is equal to 1 */
Set MatsHclDhvRecord to the located MatsDhvRecordsByHourLocation record.
Append MatsHdDh vRecord. U n a d j u s t ed H o u r 1 y Va 1 lie to ApportionmentHclRateArray
Append MatsHclDhvRecord.ModcCode to MatsMSl HclModcCodeArray
If MatsHclDhvRecord.ParameterCode is equal to MatsHclParameterCode
If MatsHclMethodCode is equal to "CALC",
If MatsHdDh vRecord. Equat i onCodc is null,
If MatsHgDhvRecord.ModcCode is NOT equal to "38",
return result F.
Else
return result H.
Environmental Protection Agency
Page 844 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
If MatsHcIDhvRecord.EquationCodc is NOT equal to "MS-1",
return result F.
Else if MatsHcIDhvRecord.IVTodcCodc is NOT equal to "38",
Set MatsMslHclDhvId to MatsHcIDh vRecord. IVIatsDhv Id
Set MatsMslHclUnadjustedHrlyValue to
MatsHcIDh v Record. U nadj ustcdH rly Va 1 lie
Set MatsParameterPluginHcl to MatsHcIDh vRecord. Pa ra mctc rCodc
Else
If MatsHcIDhvRecord.EquationCodc is equal to "MS-1",
return result G.
Else
Set MatsHclcNeeded to true.
If MatsHclDhvRecord.ParameterCode is equal to 'HCLRE',
Set MatsHclreDhvChecksNeeded to true.
Else if MatsHcIDh vRecord. Pa ra mctc rCodc is equal to 'HCLRH',
Set MatsHclrhDhvChecksNeeded to true.
Else /* DHV and Method parameter code mismatch */
return result C.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Results:
Result Response Severity
A MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
B You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1
hour.
C MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
D You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1
the unit did not operate in the hour.
E No required MATS Derived Hourly Value records were reported for [param]. Critical Error Level 1
F The reported MATS method code is equal to "CALC." However, the appropriate Critical Error Level 1
Formula Code "MS-1" has not been reported.
G The reported Formula Code of "MS-1" is inconsistent with the reported MATS Method Critical Error Level 1
Code.
H The reported MATS method code is equal to "CALC." However, the appropriate Informational Message
Formula Code "MS-1" has not been reported.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 845 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-8
Check Name: MATS HF: Locate Derived Hourly Record
Related Former Checks:
Applicability:
Description: Locates the MATS Derived Hourly record with Parameter Code equal to 'HFRE' or 'HFRH' and for the current
hour and location. Returns a negative result if more than one active record is found. Returns the record, flags
indicating whether 'HFRE' or 'HFRH' checks are needed, and a flag indicating that Hg Concentration is
needed, if one record is found.
Specifications:
Set MatsHfreDhvChecksNeeded to false.
Set MatsHfrhDhvChecksNeeded to false.
Set MatsHfcNeeded to false.
Set MatsHfDhvRecord to null.
Set MatsHfDhvParameterDescription to "MATS HF Rate".
If DerivedHourlyChecksNeeded is equal to true,
Set RecordCount equal to the number of records in MatsDhvRecordsByHourLocation where ParameterCode is equal to "HFRE"
or "HFRH".
If CurrentHourlyOpRecord.OpcraUngTunc is greater than 0
If MatsHf ParameterCode is null,
If RecordCount is greater than 0,
return result A.
Else /* Method Exists for HF */
If RecordCount is equal to 0,
return result E
Else if RecordCount is greater than 1,
return result B.
Else /* RecordCount is equal to 1 */
Set MatsHfDhvRecord to the located MatsDhvRecordsByHourLocation record.
Append \///7) A v /fecvw/. U n a d j u s t e d H o u r 1 y Va 1 u e to ApportionmentHfRateArray
Append MatsHfDhvRecord.ModcCode to MatsMSlHfModcCodeArray
If MatsHfDhvRecord. ParameterCode is equal to MatsHf ParameterCode
If MatsHfMethodCode is equal to "CALC",
If MatsHfDhvRecord. Equat i onCodc is null,
If MatsHgDhvRecord.ModcCode is NOT equal to "38",
return result F.
Else
return result H.
Environmental Protection Agency
Page 846 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
If MatsHfDhvRecord.EquationCodc is NOT equal to "MS-1",
return result F.
Else if MatsHfDhv Record. IVTodcCodc is NOT equal to "38",
Set MatsMslHfDhvId to MatsHfDhvRecord. IVIatsDhv Id
Set MatsMslHfUnadjustedHrlyValue to
MatsHfDhv Record. U nadj ustcdH rly Va 1 lie
Set MatsParameterPluginHfto MatsHfDhv Record. Pa ra mete rCode
Else
If MatsHfDhvRecord.EquationCodc is equal to "MS-1",
return result G.
Else
Set MatsHfcNeeded to true.
If MatsHfDhv Record. Pa ra mctc rCodc is equal to 'HFRE',
Set MatsHfreDhvChecksNeeded to true.
Else if MatsHfDhv Record. Pa ra mctc rCodc is equal to 'HFRH',
Set MatsHfrhDhvChecksNeeded to true.
Else /* DHV and Method parameter code mismatch */
return result C.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Results:
Result Response Severity
A MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
B You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1
hour.
C MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
D You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1
the unit did not operate in the hour.
E No required MATS Derived Hourly Value records were reported for [param]. Critical Error Level 1
F The reported MATS method code is equal to "CALC." However, the appropriate Critical Error Level 1
Formula Code "MS-1" has not been reported.
G The reported Formula Code of "MS-1" is inconsistent with the reported MATS Method Critical Error Level 1
Code.
H The reported MATS method code is equal to "CALC." However, the appropriate Informational Message
Formula Code "MS-1" has not been reported.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 847 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-9
Check Name: MATS S02: Locate Derived Hourly Record
Related Former Checks:
Applicability:
Description: Locates the MATS Derived Hourly record with Parameter Code equal to 'S02RE' or 'S02RH' and for the
current hour and location. Returns a negative result if more than one active record is found. Returns the
record, flags indicating whether 'S02RE' or 'S02RH' checks are needed, and a flag indicating that Hg
Concentration is needed, if one record is found.
Specifications:
Set MatsSo2reDhvChecksNeeded to false.
Set MatsSo2rhDhvChecksNeeded to false.
Set MatsSo2cNeeded to false.
Set MatsSo2DhvRecord to null.
Set MatsSo2DhvParameterDescription to "MATS S02 Rate".
If DerivedHourlyChecksNeeded is equal to true,
Set RecordCount equal to the number of records in MatsDhvRecordsByHour Location where ParameterCode is equal to "S02RE"
or "S02RH".
If CurrentHourlyOpRecorcl.OpcrMingTimc is greater than 0
If MatsSo2 ParameterCode is null,
If RecordCount is greater than 0,
return result A.
Else /* Method Exists for S02 Surrogate */
If RecordCount is equal to 0,
return result E
Else if RecordCount is greater than 1,
return result B.
Else /* RecordCount is equal to 1 */
Set MatsSo2DhvRecord to the located MatsDhvRecordsByHourLocation record.
Append MatsSo2Dh vRecord. U n a d j u s t ed H o u r 1 y Va 1 lie to ApportionmentSo2RateArray
Append MatsSo2I)h vRecord. IVTodcCodc to MatsMS 1 So2ModcCodeArray
If MatsSo2Dh vRecord. Pa ra mctc rCodc is equal to MatsSo2ParameterCode
If MatsSo2MethodCode is equal to "CALC",
If MatsSo2Dh vRecord. Equat i onCode is null,
If MatsHgDhvRecord.ModcCode is NOT equal to "38",
return result F.
Else
return result H.
Environmental Protection Agency
Page 848 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
If MatsSo2l)hvRecord.EquationCode is NOT equal to "MS-1",
return result F.
Else if MatsSo2DhvRecord.ModcCode is NOT equal to "38",
Set MatsMslSo2DhvId to MatsSo2l)h vRecord. IVIatsDhv Id
Set MatsMslSo2UnadjustedHrlyValue to
MatsSo2Dh v Record. U nadj ustcdH rly Va 1 lie
Set MatsParameterPluginSo2 to MatsSo2Dh vRecord. Pa ra mctc rCodc
Else
If MatsSo2l)hvRecord.EquationCode is equal to "MS-1",
return result G.
Else
Set MatsSo2cNeeded to true.
If MatsSo2I)h vRecord. Pa ra mctc rCodc is equal to 'S02RE',
Set MatsSo2reDhvChecksNeeded to true.
Else if MatsSo2I)h vRecord. Pa ra mctc rCodc is equal to 'S02RH',
Set MatsSo2rhDhvChecksNeeded to true.
Else /* DHV and Method parameter code mismatch */
return result C.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Results:
Result Response Severity
A MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
B You reported more than one MATS Derived Hourly Value records for [param] for the Critical Error Level 1
hour.
C MATS Derived Hourly Value records were reported for [param], but no supporting Critical Error Level 1
method exists.
D You reported MATS Derived Hourly Value records for [param] that are not reported if Critical Error Level 1
the unit did not operate in the hour.
E No required MATS Derived Hourly Value records were reported for [param]. Critical Error Level 1
F The reported MATS method code is equal to "CALC." However, the appropriate Critical Error Level 1
Formula Code "MS-1" has not been reported.
G The reported Formula Code of "MS-1" is inconsistent with the reported MATS Method Critical Error Level 1
Code.
H The reported MATS method code is equal to "CALC." However, the appropriate Informational Message
Formula Code "MS-1" has not been reported.
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 849 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSHOD-10
Check Name:
Related Former Checks:
MATS Hg: Locate Monitor Hourly Record
Applicability:
Description:
Locates the MATS Monitor Hourly record with Parameter Code equal to 'HGC' and for the current hour and
location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HGC' checks are needed, if one record is found.
Additionally, if the system type of the HGC MHV record is "ST", the check sets
FlowMonitorHourlyChecksNeeded to true.
Specifications:
Set MatsHgcMhvChecksNeeded to false.
Set MatsHgcMhvRecord to null.
If DerivedHourlyChecksNeeded is equal to true,
Set RecordCount equal to the number of records in MatsMhvHgcRecordsByHourLocation.
If CurrentHourlyOpRecord.OpcrMingTimc is greater than 0,
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 MatsHgcMhvRecord to the located MatsMh vHgcRecordsByHourLocation record.
Set MatsHgcMhvChecksNeeded to true.
If MatsHgcMhvRecord.System TypeCode is equal to "ST",
FlowMonitorHourlyChecksNeeded = true
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Environmental Protection Agency Page 850 of 959
If MatsHgcNeeded is equal to false,
If RecordCount is greater than 0,
return result A.
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
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:
1
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 851 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-11
Check Name: MATS HC1: Locate Monitor Hourly Record
Related Former Checks:
Applicability:
Description: Locates the MATS Monitor Hourly record with Parameter Code equal to 'HCLC' and for the current hour and
location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HCLC' checks are needed, if one record is found.
Specifications:
Set MatsHclcMhvChecksNeeded to false.
Set MatsHclcMh vRecord to null.
If DerivedHourlyChecksNeeded is equal to true,
Set RecordCount equal to the number of records in MatsMhvHclcRecordsByHourLocation.
If CurrentHourlyOpRecord.OpcrMingTimc is greater than 0
If MatsHclcNeeded is equal to false,
If RecordCount is greater than 0,
return result A.
Else if RecordCount is equal to 0,
return result B.
Else if RecordCount is greater than 1,
return result C.
Else /* RecordCount is equal to 1 */
Set MatsHclcMh vRecord to the located MatsMhvHclcRecordsByHourLocation record.
Set MatsHclcMhvChecksNeeded to true.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Results:
Result
A
B
C
D
Response
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
Environmental Protection Agency
Page 852 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 853 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-12
Check Name: MATS HF: Locate Monitor Hourly Record
Related Former Checks:
Applicability:
Description:
Specifications:
Set MatsHfcMhvChecksNeeded to false.
Set MatsHfcMhvRecord 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.OpcrMingTimc 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 MatsHfcMhvRecord to the located MatsMh vHfcRecordsByHourLocation record.
Set MatsHfcMhvChecksNeeded to true.
Else /* Non Operating Hour */
If RecordCount is greater than 0,
return result D.
Locates the MATS Monitor Hourly record with Parameter Code equal to 'HFC' and for the current hour and
location. Returns a negative result if more than one active record is found. Returns the record and a flag
indicating whether 'HFC' checks are needed, if one record is found.
Results:
Result
A
B
C
D
Response
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
Environmental Protection Agency
Page 854 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 855 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: MATSHOD-13
Check Name: MATS: Check MATS Load
Related Former Checks:
Applicability:
Description: Enusres that the MATS Load is reported when the current hour is operating and an active HGRE, HCLRE,
HFRE or S02RE method exists.
Specifications:
Set ApportionmentMatsLoadArray for this Location to null
If CurrentHourlyOpRecord is not null
If CurrentHourlyOpRecord.Opcxa\\ngY\mc is greater than 0,
/* Count the number of RE methods active during the hour and associates with a location in the monitoring plan */
Count the record in MonitorMethodRecordsByHour where ParameterCode is equal to "HGRE", "HCLRE", "HFRE", or
"S02RE",
If the count is greater than 0,
Set ApportionmentMatsLoadArray for this Location to CurrentHourlyOpRecord.MatsRowLoad.
If CurrentHourlyOpRecord MatsYSomLoad is null,
return result A
Else if CurrentHourlyOpRecord.LoadUnitsOfMeasureCode = "MW" AND
CurrentHourlyOpRecord.MatsRowLoad is less than CurrentHourlyOpRecord .HourLoad
If MpStackConfigForHourlyChecks is NOT equal to "MS",
return result D
Else
If CurrentHourlyOpRecordMatsYSomLoad is not null,
return result B.
If CurrentHourlyOpRecord.MatsRowLoad is not null,
return result C.
Else
Results:
Result Response Severity
A You did not provide a MATSHourLoad record, which is required when you report an Critical Error Level 1
output based emission rate.
B You provided a MATSHourLoad record which is not required when you report a heat Informational Message
input based emission rate.
C You reported a MATSHourLoad record, but this is not appropriate for a non-operating Critical Error Level 1
hour.
D The reported MATSHourLoad is less than the reported HourLoad value. Critical Error Level 1
Environmental Protection Agency
Page 856 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 857 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-14
Check Name: Update Sorbent Trap Operating Date List
Related Former Checks:
Applicability:
Description: For operating hours, this check inserts the current date into OperatingDateList for the current location's
sorbent traps that are active for the current hour.
Specifications:
If CurrentHourlyOpRecord is NOT null,
For each entry in MatsSorbentTrapListByLocationArray where the array index is CurrentMonitorPlanLocationPosition,
When:
1) CurrentHourlyOpRecord.OpcraUngTunc is greater than 0.
2) CurrentOperatingDate is on or after the date of the entry's SorbentTrapBeginDatehour.
3) CurrentOperatingDate is on or before the date of the entry's SorbentTrapEndDatehour.
4) CurrentOperatingDate is not in the entry's OperatingDateList.
Then:
Append CurrentOperatingDate to the entry's OperatingDateList.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Environmental Protection Agency
Page 858 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSHOD-15
Check Name:
Related Former Checks:
Initialize Message Plug-ins
Applicability:
Description:
Initializes the plugin parameters.
Specifications:
Set MatsHclDhvParameterDescription to "HCLRE or HCLRH".
Set MatsHclMhvParameterDescription to "HCLC".
Set MatsHfDhv Parameter Description to "HFRE or HFRH".
Set MatsHfMhvParameterDescription to "HFC".
Set MatsHgDhvParameterDescription to "HGRE or HGRH".
Set MatsHgMhvParameterDescription to "HGC".
Set MatsSo2 Dhv ParameterDescription to "S02RE or S02RH".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Summary Value Initialization
Environmental Protection Agency
Page 859 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSHOD-16
Check Name: Verify Hourly GFM for Active Sampling Trains
Related Former Checks:
Applicability:
Description: Verifies that a GFM exists for each passed, failed or uncertain sampling trains active for a particular operating
hour. Allows GFM records for any operating hour as long as an associated sampling trains exists, but does not
allow GFM for non operating hours.
Specifications:
Set MatsMissingGfmList to
Set MatsMultipleGfmList to
If DerivedHourlyChecksNeeded is equal to true,
If CurrentHourlyOpRecorcl.OpcrMingTimc is greater than 0
If MatsHgcMhvRecord is null, OR MatsHgcMhvRecord.ModcCode is NOT equal to "41" or "42",
Set LocatedMatsSamplingTrainRecords to the records in MatsSamplingTrainRecords where:
1) Locationld is equal to CurrentHourlyOpRecord .Locationld
2) SorbentTrapBeginDateHour is on or before CurrentDateHour
3) SorbentTrapEndDateHour is on or after CurrentDateHour
For each MatsSamplingTrainRecord in LocatedMatsSamplingTrainRecords,
Count the number of MatsHourlyGfmRecordsForHourAndLocation where Componentld is equal to
MatsSamplingTrainRecord. Componentld.
If the count is equal to 0,
If MatsSamplingTrainRecord.TrainQAStatus is equal to "PASSED" or "UNCERTAIN", AND
MatsHgcMhvRecord is null OR MatsHgcMhvRecord.ModcCode is NOT equal to "34",
If MatsHgcMhvRecord is NOT null, AND MatsHgcMhvRecord.ModcCode is equal to
"32",
Count the number of LocatedMatsSamplingTrainRecords where:
1) Componentld is equal to MatsSamplingTrainRecord. Componentld.
2) TrapModcCode is equal to "32".
3) TrainQAStatus is NOT equal to "PASSED" or "UNCERTAIN".
If the count is equal to 0,
Append MatsSamplingTrainRecord.Descrvption to
MatsMissingGfmList.
Else
Append MatsSamplingTrainRecord.Descrvption to MatsMissingGfmList.
Else if the count is greater than 1,
Append MatsSamplingTrainRecord.Descrvption to MatsMultipleGfmList.
If bo\h MatsMissingGfmList and MatsMultipleGfmList are NOT empty,
Environmental Protection Agency
Page 860 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
return result A.
Else if MatsMissingGfmList is NOT empty,
return result B.
Else if MatsMultipleGfmList is NOT empty,
return result C.
Count the number of MatsHourlyGfmRecordsForHourAndLocation.
If the count is greater than 0,
return result D.
Results:
Result
A
B
C
D
Usage:
1
Response
For the current hour, GFM records are missing for "PASSED" or "UNCERTAIN"
sampling train(s) [Missing], and multiple GFM records exist for sampling train(s)
[Multiple].
For the current hour, GFM records are missing for "PASSED" or "UNCERTAIN"
samplingtrain(s) [Missing],
For the current hour, multiple GFM records exist for sampling train(s) [Multiple].
You reported a GFM record for a non-operating hour, which is not appropriate.
Process/Category: Emissions Data Evaluation Report Operating Hour Evaluation
Severity
Informational Message
Informational Message
Informational Message
Informational Message
Environmental Protection Agency
Page 861 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Sampling Train Checks
Environmental Protection Agency
Page 862 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-1
Check Name: Component ID Valid
Related Former Checks:
Applicability:
Description: Ensure that sampling train component id exists and that the associated component type is "STRAIN".
Specifications:
Set MatsSamplingTrainComponentldValid equal to false.
If MatsSampling Train Record. Com po lie n 11D is null,
Set MatsSamplingTrainProblemComponentExists equal to true.
Return result A.
Else if MatsSamplingTrainRecord.ComponentTypeCode is not equal to "STRAIN",
Set MatsSamplingTrainProblemComponentExists equal to true.
Return result B.
Else
Set MatsSamplingTrainComponentldValid equal to true.
Add an entry to MatsSamplingTrainDictionary with a key equal to MatsSampling Train Record. T ra i n ID and the value record
initialized with the following values:
1) Set HgConcentration equal to null
2) Set TrainQAStatusCode equal to null
3) Set ReferenceSFSRRatio equal to null
4) Set TotalSFSRRatioCount equal to MatsSamplingTrainRecord.SfsrTotalCount with a default of 0 when
MatsSamplingTrainRecord.SwpplementalDatalnd is equal to 1. Otherwise set to 0.
5) Set DeviatedSFSRRationCount equal to MatsSamplingTrainRecord.SfsrDeviatedCount with a default of 0 when
MatsSamplingTrainRecord.SwpplementalDatalnd is equal to 1. Otherwise set to 0.
6) Set TotalGfmCount equal to MatsSamplingTrainRecord.GfmTotalCount with a default of 0 when
MatsSamplingTrainRecord.SwpplementalDatalnd is equal to 1. Otherwise set to 0.
7) Set NotAvailableGfmCount equal to MatsSamplingTrainRecord.GfmNotAvailableCount with a default of 0 when
MatsSamplingTrainRecord.SwpplementalDatalnd is equal to 1. Otherwise set to 0.
8) Set SamplingTrainValid equal to true
9) Set IsBorderTrap to (MatsSampling Train Record. Bo rdc rT ra p I ndi ca to r is equal to 1).
10) Set IsSupplementalData to (MatsSamplingTrainRecord.SwpplemmtalDatalndicator is equal to 1).
Add the same entry to MatsSorbentTrapSamplingTrainList.
Results:
Result
A
B
Response
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.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report -
¦ MATS Sampling Train Initialization
Environmental Protection Agency
Page 863 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-2
Check Name: Sorbent Trap Serial Number
Related Former Checks:
Applicability:
Description: Check that a sorbent trap serial number is provided.
Specifications:
If the MatsSampling Train Record. So rbc n tT ra p S n is null,
Return result A.
Results:
Result Response Severity
A You did not provide a [fieldname], which is required, for [key]. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Evaluation
Environmental Protection Agency
Page 864 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRN-3
Check Name:
Related Former Checks:
Train Quality Assurance Status Valid
Applicability:
Description:
Check Sampling Train Quality Assurance Status Matches Lookup Table
Validation Tables:
Train Qa Status Code (Lookup Table)
Specifications:
Set MatsSamplingTrainQaStatusCodeValid to false.
If MatsSampling Train Record. T ra inQ AStat usCodc is null,
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result A,
Else if MatsSampling Train Record. T ra inQ AStat usCodc does not match a value in MatsSamplingTrainQaStatusLookupTable,
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam pi i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result B.
Else
Set MatsSamplingTrainQaStatusCodeValid to true.
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. T ra inQ AStat usCodc to MatsSampling Train Record. T ra inQ AStat usCodc where the
key equals MatsSampling Train Record. T ra i n ID.
Results:
Result
A
B
Response
For [key], you have not reported a value for [fieldname], which is required.
For [key] you reported a [value] which is not valid for [fieldname].
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Evaluation
Environmental Protection Agency
Page 865 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-4
Check Name: Main Trap Hg Valid
Related Former Checks:
Applicability:
Description: Main Trap Hg Null or Reported to Two Decimal Places
Specifications:
Set MatsMain TrapHgVal'ul to false.
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord.MainTmpHg is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",
Return result A.
Otherwise
Set MatsMain TrapHgVal'ul to true.
Else,
If the MatsSampling Train Record. Q A S ta t us Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else, if the MatsSamplingTrainRecord.MainTmpllg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),
Return result C.
Otherwise
Set MatsMain TrapHgValid to true.
Results:
Result
A
B
C
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 866 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-5
Check Name: BT Trap Hg Valid
Related Former Checks:
Applicability:
Description: BT Trap Hg Null or Reported to Two Decimal Places
Specifications:
Set MatsBtTrapHgValid to false.
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord. BTTrapHg is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",
Return result A.
Otherwise
Set MatsBtTrapHgValid to true.
Else,
If the MatsSamplingTrainRecord.QAStatxxs Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else if the MatsSamplingTrainRecord. BTT rapHg is not reported in scientific notation rounded to three decimal places,
keeping one to the left of the decimal point (x.xx-E-x),
Return result C.
Otherwise
Set MatsBtTrapHgValid to true.
Results:
Result
A
B
C
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 867 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-6
Check Name: Spike Trap Hg Valid
Related Former Checks:
Applicability:
Description: Spike Trap Hg Null or Reported to Two Decimal Places
Specifications:
Set MatsSpikeTrapHgValid to false.
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord.SpikcTrapHg is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",
Return result A.
Otherwise
Set MatsSpikeTrapHgValid to true.
Else,
If the MatsSampling Train Record. Q A S ta t us Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else if the MatsSampling Train Record. S p i keT ra p Hg is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x),
Return result C.
Otherwise
Set MatsSpikeTrapHgValid to true.
Results:
Result
A
B
C
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 868 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-7
Check Name: Spike Reference Value Valid
Related Former Checks:
Applicability:
Description: Spike Reference Value Null or Reported to Two Decimal Places
Specifications:
Set MatsSpikeReference Value Valid to false.
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSampling Train Record. S p i kc Rc fc rc ncc Va 1 lie is null,
If the Sampling Train Data. Q A S ta t usCodc is not "INC", "EXPIRED", or "LOST",
Return result A.
Otherwise
Set IVTa t sSpikeReference Value Valid to true.
Else,
If the MatsSampling Train Record. Q A S ta t us Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else if the MatsSampling Train Record. S p i kc Rc fc rc ncc Va 1 lie is not reported in scientific notation rounded to three
decimal places, keeping one to the left of the decimal point (x.xx-E-x),
Return result C.
Otherwise
Set IVT a t sSpikeReference Value Valid to true.
Results:
Result
A
B
C
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 869 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-8
Check Name: Total Sample Volume DSCM Valid
Related Former Checks:
Applicability:
Description: Total Sample Volume DSCM Null or Reported to Two Decimal Places
Specifications:
Set MatsTotalS ample VolumeDSCMValid to false.
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord.TotalSampleVolumeDSCM is null,
If the Sampling Train Data. Q A S ta t usCodc is not "INC", "EXPIRED", or "LOST",
Return result A.
Otherwise
Set MatsTotalS ample VolumeDSCMValid to true.
Else,
If the MatsSampling Train Record. Q A S ta t us Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else if the MatsSampling Train Record. To t a 1S a m p 1 c Vo 1 u m c D S CIVT is less than than two decimal places,
Return result C.
Otherwise
Set MatsTotalSampleVolumeDSCMValid to true.
Results:
Result
A
B
C
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
For [key], the [fieldname] value must be reported to at least two decimal places.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 870 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRN-9
Check Name:
Related Former Checks:
Reference SFSR Ratio Valid
Applicability:
Description:
Specifications:
Reference SFSR Ratio Null or Reported to Two Decimal Places
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSampling Train Record. Rc fc rc ncc S FS R Ra t i o is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST", AND the
MatsSampling Train Record. R ATA I ndi ca t o r is NOT equal to 1,
If MatsSamplingTrainDictionary contains a lookup key equal to MatsSamplingTrainRecord rainlD.
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result A.
If the MatsSamplingTrainRecord.QAStatusCode is not "PASSED", "FAILED", or "UNCERTAIN",
If MatsSamplingTrainDictionary contains a lookup key equal to MatsSamplingTrainRecord rainlD.
Set MatsSampling Train Dictionary. Sam pi i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result B.
Else if the MatsSampling Train Record. Rc fc rc ncc S FS R Ra t i o is not reported to one decimal place,
If MatsSamplingTrainDictionary contains a lookup key equal to MatsSamplingTrainRecord rainlD.
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result C.
Else if the MatsHourly(iFMRecord. HourlySFSRRatio is not greater than or equal to 1.0 and less than or equal to 100.0,
If MatsSamplingTrainDictionary contains a lookup key equal to MatsSamplingTrainRecord^rainlD.
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord^ rainlD.
Return result D.
Else
If MatsSamplingTrainDictionary contains a lookup key equal to MatsSamplingTrainRecord^rainlD.
Set MatsSampling Train Dictionary. Rc fc rc ncc S FS R Ra t i o to
MatsSampling Train Record. Rc fc rc ncc S FS R Ra t i o where the key equals
MatsSamplingTrainRecord^ rainlD.
Else,
Environmental Protection Agency
Page 871 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value for [key] should be reported to one decimal place.
The [fieldname] value for [key] must be a number between 1 and 100.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 872 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-10
Check Name: Sampling Ratio Check Result Code Valid
Related Former Checks:
Applicability:
Description: Sampling Ratio Check Result Code Valid
Specifications:
If MatsSamplingTrainQaStatusCodeValid is true,
If MatsSamplingTrainRecord.Samplin^atioCheckResultCode is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED", or "LOST",
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result A.
Else,
If MatsSamplingTrainRecord.SmnpUngRi\UoC\\cckRcsu\lCodc is equal to "PASSED",
If MatsSamplingTrainRecord.QAStatus Code is not equal "PASSED", "FAILED", or "UNCERTAIN",
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam pi i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result B.
Else if MatsSamplingTrainRecord.SmnpUngRnUoChcckRcsullCodc is equal to "FAILED",
If MatsSampling Train Record. Q A S ta t us Code is not equal "FAILED",
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result C.
Otherwise
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord rainlD.
Return result D.
Environmental Protection Agency
Page 873 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
For [key], you reported that the sampling train SFSR Ratio check FAILED, but did not
also report the train QA Status Code as FAILED.
For [key], the [fieldname] is not reported as PASSED or FAILED..
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 874 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-11
Check Name: Post Leak Check Result Code Valid
Related Former Checks:
Applicability:
Description: Post Leak Check Result Code Valid
Specifications:
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord.PostLeakCheckResultCode is null,
If the MatsSamplingTrainRecord.QAStatusCode is not "INC", "EXPIRED" or "LOST",
Return result A.
Else
If MatsSamplingTrainRecord.PostLeakCheckResultCode is equal to "PASSED",
If MatsSamplingTrainRecord.QAStatus Code is not equal to "PASSED", "FAILED", OR "UNCERTAIN",
Return result B.
Else if MatsSamplingTrainRecord.PostLeakCheckResultCode is equal to "FAILED",
If MiitsSampling Train Record. Q A S ta t us Code is not equal to "FAILED",
Return result C.
Otherwise
Return result D.
Results:
Result
A
B
C
D
Usage:
1
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value 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.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 875 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-12
Check Name: Sample Damage Explanation
Related Former Checks:
Applicability:
Description: Sample Damage Explanation is provided if QA Status Code equals LOST.
Specifications:
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord. SampleDamageExplanation is null,
If the MatsSamplingTrainRecord QAStatus Code is equal to "LOST",
Return result A.
Results:
Result Response Severity
A For [key], you did not report a SampleDamageExplanation which is required if the Critical Error Level 1
sorbent train QA Status Code is LOST.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Evaluation
Environmental Protection Agency
Page 876 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRN-13
Check Name:
Related Former Checks:
Hg Concentration reported properly
Applicability:
Description:
Specifications:
Hg Concentration is reported properly
Set MatsCalcTrainHgConcentration = null.
If MatsSamplingTrainQaStatusCodeValid is true,
If MatsSampling Train Record. HgCo ncc n t ra t i o n is null,
If MatsSamplingTrainRecord.TraiiiQAStatusCode is not "INC", "EXPIRED", or "LOST",
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result A.
If MatsSamplingTrainRecord.T raiiiQAStatusCode is not "PASSED", "FAILED", or "UNCERTAIN",
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam pi i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result B.
Else if MatsSampling Train Record. HgCo ncc n t ra t i o n is not reported in scientific notation rounded to three decimal
places, keeping one to the left of the decimal point (x.xx-E-x).
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result C.
Else if MatsSamplingTrainRecord.ModcCodc is 43 or 44,
Set MatsCalcTrainHgConcentration = MatsSamplingTrainRecord.HgConccnln\Uon.
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. HgCo ncc n t ra t i o n to MatsSamplingTrainRecord.HgConccnlmUon
where the key cq ua 1 s MatsSampling Train Record. T ra i n ID.
Else if MatsMainTrapHgValid is true AND MatsBTTrapHgValid is true AND Mats'TotalSampleVolumeDSCMValid is
true,
Set MatsCalcTrainHgConcentration = (MatsSamplingTrain Record. IVTai nTrapHg +
MatsSamplingTrainRecord.BTTrapHg) / MatsSamplingTrainRecord.ToVA\Smnp\cVo\umcDSCM. rounded to
three significant figures, using scientific notation (x.xx-E-2).
If MatsSamplingTrainComponentldValid is true,
Else,
Environmental Protection Agency
Page 877 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set MatsSamplingTrainDictionary.HgConccnlmlion to MatsCalcTrainHgConcentration where the key
equals MatsSamplingTrainRecord.TmmSD.
If MatsSampling Train Record. HgCo ncc n t ra t i o n is not equal to MatsCalcTrainHgConcentration,
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam p 1 i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Return result D
Else // A calculation input is not valid
If MatsSamplingTrainComponentldValid is true,
Set MatsSampling Train Dictionary. Sam pi i ngT ra i n Va 1 i d to false where the key equals
MatsSamplingTrainRecord.T rainlD.
Results:
Result
A
B
C
D
Response
You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
The [fieldname] is inconsistent with the value [value] calculated from the reported
[key] records used in the calculation.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 878 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRN-14
Check Name:
Related Former Checks:
Percent Breakthrough reported properly.
Applicability:
Description:
Specifications:
Percent Breakthrough is reported properly. Includes alternate criteria for RATAs
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSamplingTrainRecord.PerceniBreakthrough is null,
If the MatsSamplingTrainRecord.QAStatus Code is "PASSED", "FAILED", or "UNCERTAIN", AND the.
MatsSampling Train Record. HgCo ncc n t ra t i o n is greater than or equal to 0.2,
Return result A.
If the MatsSamplingTrainRecord.QAStatusCode is "LOST", "EXPIRED", or "INC",
Return result B
Else if the MatsSamplingTrainRecord.PercentBreakthrough is NOT reported to one decimal place.
Return result C
Else if MatsMainTrapHgValid is equal to true, and MatsBtTrapHgValid is equal to true,
Set MatsCalcTrainPercentBreakthrough = (MatsSamplingTrainRecord. BTT rapHg /
MatsSamplingTrainRecord. IVTa i nTrapHg) x 100, rounded to one decimal place.
If MatsSamplingTrainRecord.PcrccnlBrcnklhrough is NOT equal to MatsCalcTrainPercentBreakthrough,
If the MatsSamplingTrainRecord. SorbcntTrapApsCodc is equal to 'RATA',
If MatsSamplingTrainRecord.HgConccnlmUon is greater than 1 AND
MatsSamplingTrainRecord.PcrccnlBrcnklhrough rounded to an integer is greater than 10%, OR
MatsSampling Train Record. HgCo ncc n t ra t i o n is greater than 0.5 AND
MatsSamplingTrainRecord.PcrccnlBrcnklhrough rounded to an integer is greater than 20%, OR
MatsSampling Train Record. HgCo ncc n t ra t i o n is greater than 0.1 AND
MatsSamplingTrainRecord.PcrccnlBrcnklhrough rounded to an integer is greater than 50%,
If MatsSampling Train Rdcord. T ra i nQ A S ta t usCodc is NOT equal to "FAILED1,
Else,
Return result D,
Else,
Return result F.
Else
If the MatsSampling Train Record. HgCo ncc n t ra t i o n is NOT less than 0.2,
If ThcMatsSamplingTrainRecord.PcrccnlBrc'dklhrough rounded to an integer is greater
than 10%, OR
the MatsSamplingTrainRecord.PcrccnlBrcnklhrough rounded to an integer is greater
Environmental Protection Agency
Page 879 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
than 5%, AND the MatsSampling Train Record. HgCo ncc n t ra t i o n is greater than
0.5,
If MatsSamplingTrainRecord.TrainQAStatusCode is NOT equal to "FAILED",
Return result E
Results:
Result
A
B
C
D
E
F
Usage:
1
Response
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 or less
than or equal to 0.1 ug/dscm if performing a RATA.
For [key], you reported a [fieldname] value which is not reported if the sorbent train
QA 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.
You reported a Sampling Train Data QA Status of PASSED or UNCERTAIN, but at
least one of the alternative performance specifications listed in Section 4.1.2.2 in
Appendix A CFR Part 63 to PS 12B was not met.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sampling Train Evaluation
Environmental Protection Agency
Page 880 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-15
Check Name: Percent Spike Recovery reported properly
Related Former Checks:
Applicability:
Description: Percent Spike Recovery reported properly
Specifications:
If MatsSamplingTrainQaStatusCodeValid is true,
If the MatsSampling Train Record. Pc rcc lit S p i kc Rcco vc ry is null,
If the MatsSamplingTrainRecord:QAStatus Code is not "INC", "EXPIRED", or "LOST",
Return result A.
Else
If the MatsSampling Train Record. QAStatus Code is not "PASSED", "FAILED", or "UNCERTAIN",
Return result B.
Else if the MatsSampling Train Record. Pc rcc lit S p i kc Rcco vc ry is not reported to one decimal place,
Return result C.
Else if MatsSpikeTrapHgValid is equal to true, AND MatsSpikeReference Value Valid, is equal to true,
Set MatsCalcTrainPercentSpikeRecovery = MatsSampling Train Record. S p i kcT ra p Hg /
MatsSampling Train Record. S p i kc Re fc re rice Va 1 lie) x 100, rounded to one decimal place.
If MatsSampling Train Record. Pc rcc lit S p i kc Rcco vc ry is not equal to MatsCalcTrainPercentSpikeRecovery,
Return result D.
Else if the MatsSampling Train Record. Pc rcc lit S p i kc Rcco vc ry is less than 75% or greater than 125%
If MatsSampling Train Record. T ra inQ AStat usCodc is not equal to "FAILED",
Return result E
Results:
Result Response
A You did not report a [fieldname] value in the [key] records which is required if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
B You reported a [fieldname] value in the [key] records which is reported only if the
sorbent train QA Status Code is PASSED, FAILED, or UNCERTAIN, and the stack
flow rate for the hour is a measured data value.
C The [fieldname] value for [key] should be reported to one decimal place.
D The [fieldname] is inconsistent with the value [value] calculated from the reported
[key] records used in the calculation.
E The [fieldname] value of [value] from the [key] records exceeds the PS-12B
breakthrough criteria, but you did not report the train QA Status Code as FAILED.
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 881 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Evaluation
Environmental Protection Agency
Page 882 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRN-16
Check Name: Check Hourly Sampling Ratios
Related Former Checks:
Applicability:
Description: Compare Hourly Sampling Ratio with PS 12B Requirement
Specifications:
If MatsSamplingTrainDictionary contains the key MatsSampling Train Record. T ra i n ID.
Set SamplingTrainValid to MatsSamplingTrainDictionary.SamplingTrainValid where the key equals
MatsSamplingTrainRecord.T rainlD.
Else
Set SamplingTrainValid to false.
If SamplingTrainValid is true,
Set TotalSFSRRatioCount to MatsSamplingTrainDictionary.TotalSFSRRatioCount where the key equals
MatsSamplingTrainRecord.T rainlD.
Set DeviatedSFSRRatioCount to MatsSamplingTrainDictionary.DeviatedSFSRRatioCount where the key equals
MatsSamplingTrainRecord.T rainlD.
Set SamplingTrainCountsAreComplete to (MatsSamplingTrainDictionary.IsBorderTrain is false OR
MatsSamplingTrainDictionary.IsSwpplementalData is true).
If TotalSFSRRatioCount is greater than or equal to 100,
Set MatsCalcPercentSFSRRatioDev to DeviatedSFSRRatioCount / TotalSFSRRatioCount x 100, rounded to an integer.
If the MatsSamplingTrainRecord.SmnpUngRaUoChcckRcsuhCodc is equal to "PASSED"
If the MatsCalcPercentSFSRRatioDev is greater than 5,
Return result A.
Else // TotalSFSRRatioCount is less than 100
If the MatsSamplingTrainRecord.SmnpUngRaUoChcckRcsuhCodc is equal to "PASSED"
If the DeviatedSFSRRatioCount is greater than 5,
Return result C.
Results:
Result
A
B
C
D
Response
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
Environmental Protection Agency
Page 883 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Last Hour Evaluation
Environmental Protection Agency
Page 884 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRN-17
Check Name:
Related Former Checks:
Check the Not Available GFM count compared to the Total GFM Count
Applicability:
Description:
Checks the percentage of GFM with an "N" (Not Allowed) Begin End Flag.
Specifications:
If MatsSampling Train Record. T ra inQ AStat usCodc is equal to "PASSED", "FAILED" or "UNCERTAIN",
AND MatsSamplingTrainRecord.Ratalnd is equal to 0 (zero) or null,
If MatsSamplingTrainDictionary contains the key MatsSampling Train Record. T ra i n ID.
Set DictionaryEntry to MatsSamplingTrainDictionary where the key equals MatsSamplingTrainRecord.TrainlD.
If I)iclionar vEntry. Sa mp 1 i ngTra i n Va 1 id is true,
If I) i c lion ar vEn try. To t a 1G fin C o u n t is greater than 0, AND I) i c lion ar vEn i. N o t Ava i 1 a b 1 c G fin C o u n t is greater
than or equal to 0,
Set NotAvailableGfinPercent to 100 * I) i c lion ar vEn i. N o t Ava i 1 a b 1 c G fin C o u n t /
I) i c lion ar vEn /r i. To t a 1G fin C o u nt.
If NotAvailableGfinPercent is greater than or equal to 20%,
Return result A.
Results:
Result
A
Response
For sampling train [key], at least 20 percent of the gas flow meter hours reported a
Begin-EndFlagof "N".
Severity
Informational Message
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sampling Train Last Hour Evaluation
Environmental Protection Agency
Page 885 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
MATS Sorbent Trap Data
Environmental Protection Agency
Page 886 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-1
Check Name: Begin Date Valid
Related Former Checks:
Applicability:
Description: This check determines if the sorbent trap data begin date is valid.
Specifications:
Set MatsSorbentTrapBeginDateValid equal to false.
If the MatsSorbentTrapRecord. Begi nDate is null,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result A.
Else
Set MatsSorbentTrapBeginDateValid equal to true.
Results:
Result Response Severity
A For [key], a value for [fieldname] is required. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation
Environmental Protection Agency
Page 887 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-2
Check Name:
Related Former Checks:
Begin Hour Valid
Applicability:
Description:
This check determines if the sorbent trap data begin hour is valid
Specifications:
Set MatsSorbentTrapBeginDateHourValid equal to false.
If MatsSorbentTrapBeginDateValid,
If the MatsSorbentTrapRecord. Begi nHoiir is null,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result A.
Else, if the MatsSorbent TrapRecord. Begi nHoiir is less than 0 or greater than 23,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result B.
Else
MatsSorbentTrapBeginDateHourValid equal to true.
Results:
Result
A
B
Response
For [key], a value for [fieldname] is required.
For [key], you have reported a Begin Hour not between 0 and 23.
Severity
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation
Environmental Protection Agency
Page 888 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-3
Check Name:
Related Former Checks:
End Date Valid
Applicability:
Description:
This check determines if the sorbent trap data end date and hour is valid
Specifications:
Set MatsSorbentTrapEndDateValid equal to false.
If the MatsSorbentTrapRecord.EndDate is null,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result A.
Else
Set MatsSorbentTrapEndDateValid equal to true.
Results:
Result Response Severity
A For [key], a value for [fieldname] is required. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation
Environmental Protection Agency
Page 889 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-4
Check Name: End Hour Valid
Related Former Checks:
Applicability:
Description: This check determines if the sorbent trap data end hour is valid
Specifications:
Set MatsSorbentTrapEndDateHourValid equal to false.
If the MatsSorbentTrapRecord. E ndHour is null,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result A.
Else, if the MatsSorbent TrapRecord. E ndHour is less than 0 or greater than 23,
Set MatsSorbentTrapEvaluationNeeded to false.
Return Result B.
Else
Set MatsSorbentTrapEndDateHourValid equal to true.
Results:
Result Response Severity
A For [key], a value for [fieldname] is required. Critical Error Level 1
B For [key], you have reported an End Hour that is not between 0 and 23. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation
Environmental Protection Agency
Page 890 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-5
Check Name: Begin and End Times Consistent
Related Former Checks:
Applicability:
Description: Check that the Sorbent Trap end date and time occurs after the begin date and time.
Specifications:
Set MatsSorbentTrapDatesAndHoursConsistent to false.
If MatsSorbentTrapBeginDateHourValid is true AND MatsSorbentTrapEndDateHourValid is true,
If the the MatsSorb ent Trap Record. B c g i n D a t c H o u r is after the MatsSorb ent Trap Record. E nd D a t c H o ur.
Set MatsSorbentTrapEvaluationNeeded to false.
Return result A.
Else
Set MatsSorbentTrapDatesAndHoursConsistent to true.
Results:
Result Response Severity
A For [key], the BeginDate/Hour is inconsistent with the EndDate/Hour. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report — MATS Sorbent Trap Hour and Range Evaluation
Environmental Protection Agency
Page 891 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-6
Check Name: Check For Overlap With Another Sorbent Trap
Related Former Checks:
Applicability:
Description: Check for overlap with the last Sorbent Trap from the previous emission report or with another Sorbent Trap
reported in the current emission report.
Specifications:
Locate MatsSorbentTrapRecords where:
1) Systemld equals MatsSorbentTrapRecord.Systemld
2) Trapld does not equal MatsSorb ent Trap Record. T ra p I d
3) BeginDateHour is before MatsSorb ent TrapRecord. E nd D a t c H o u r
4) EndDateHour is after MatsSorb ent TrapRecord. BeginDateHour
If found,
Set MatsSorbentTrapEvaluationNeeded to false.
Return result A.
Results:
Result Response Severity
A For [key], you reported sorbent traps with overlapping sampling periods. Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Overlap Evaluation
Environmental Protection Agency
Page 892 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-7
Check Name:
Related Former Checks:
Initialize MATS Sorbent Trap Parameters
Applicability:
Description:
Initialize MATS Sampling Train Data
Specifications:
Set MatsSorbentTrapValidExists to false.
Set MatsSorbentTrapSamplingTrainList to null.
Set MatsSamplingTrainProblemComponentExists to false.
For MatsSorbentTrapRecord:
Set SorbentTrapInformation record with:
1) SorbentTrapValidExists set to true.
2) IsBorderTrap set to (MatsSorbentTrapRecord.BordcrTrapInd is equal to 1).
3) IsSupplementalData set to (Mat sS orb ent TrapRecord. S u p p 1 c m c n t a 1D a t a I n d is equal to 1).
4) SorbentTrapId set to MatsSorbentTrapRecord.J n\\~>\A
5) SorbentTrapBeginDateHour set to MatsSorb ent TrapRecord. B c g i n D a t c H o u r
6) SorbentTrapEndDateHour set to MatsSorb ent TrapRecord. E nd D a t c H o u r
7) SorventTrapModcCd set to MatsSorbentTrapRecord.ModcCd
8) SamplingTrainProblemComponentExists set to false.
9) 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
10) OperatingDateList set to an empty list of dates.
Set MatsSorbentTrapDictionary to SorbentTrapInformation, where the Trapld key is equal MatsSorbentTrapRecord.TrapId.
Append SorbentTrapInformation to MatsSorbentTrapListByLocationArray element for CurrentMonitorPlanLocationPosition.
Set MatsSorbentTrapValidExists to MatsSorbentTrapDictionary.SorbentTrapValidExists where MatsSorbentTrapDictionary key
is equal to MatsSorbent TrapRecord. T ra p Id.
Set MatsSorbentTrapSamplingTrainList to MatsSorbentTrapDictionary.SamplingTrainList where MatsSorbentTrapDictionary
key is equal to MatsSorbentTrapRecord J rapid.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap First Hour Initialization
Environmental Protection Agency
Page 893 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-8
Check Name:
Related Former Checks:
Monitoring System Check
Applicability:
Description:
Ensure that Monitoring System exists for Monitoring System ID, and that the Monitoring System type is "ST".
Specifications:
If the MatsSorbentTrapRecord Mon\\ox\ngSystcmID is null,
Set MatsSorbentTrapValidExists to false.
Return result A.
Else if the MatsSorb ent Trap Record. System TypeCode of the associated system is not equal to "ST",
Set MatsSorbentTrapValidExists to false.
Return result B.
Else if MatsSorbent TrapRecord. Sy s t c m Beg i n Da t c Hou r is a ft c r MatsSorbent TrapRecord. Bcgi n D a t c Hou r. OR
MatsSorb ent TrapRecord. Sy s t c m E n d D a t c Ho u r is NOT null and is before MatsSorb ent TrapRecord. E nd D a t c H o u r.
Set MatsSorbentTrapValidExists to false.
Return result C.
Results:
Result
A
B
Response
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.
The system reported for the sorbent trap does not span the period of the sorbent trap.
Severity
Critical Error Level 1
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 894 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-9
Check Name:
Related Former Checks:
Number and Validity of Sampling Trains
Applicability:
Description:
Check that two Sorbent Train Data Records are provided for each Sorbent Trap Data Record.
Specifications:
Set MatsSamplingTrainsValid to false,
If MatsSamplingTrainProblemComponentExists is false,
If number of entries in MatsSorbentTrapSamplingTrainList is not equal to 2,
Set 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
A
Response
For [key], you did not report two sets of sorbent train records for the sorbent trap.
Severity
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 895 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-10
Check Name:
Related Former Checks:
Sorbent Trap MODC Code is Valid
Applicability:
Description:
Check Sorbent Trap MODC Code Valid
Specifications:
Set MatsSorbentTrapMODCCodeValid to false
If MatsSorbentTrapRecord.MODCCode is not equal to "01", "02", "32", "33", "34", "35", "43" or "44",
Set MatsSorbentTrapValidExists to false.
Return result A.
Else if MatsSamplingTrainsValid,
If MatsSorbentTrapRecord. MODCCode is equal to "01" or "02" or "43",
If MatsSorhentTrapSamplingTrainList.TrainQAStatusCode for both sampling train components are equal to "PASSED",
Set MatsSorbentTrapMODCCodeValid equal to true.
Else
Set MatsSorbentTrapValidExists to false.
Return result B
Else if MatsSorbentTrapRecord.MODCCode is equal to "32" or "44",
If MatsSorhentTrapSamplingTrainList.TrainQAStatusCode are equal to "PASSED" for one sampling train component,
AND "FAILED" or "LOST" for the other,
Set MatsSorbentTrapMODCCodeValid equal to true.
Else
Set MatsSorbentTrapValidExists to false.
Return result C
Else if the MatsSorbentTrapRecord.MODCCode is equal to "33",
If MatsSorhentTrapSamplingTrainList.T rainQAStatusCode for both sampling train components are equal to
"UNCERTAIN",
Set MatsSorbentTrapMODCCodeValid equal to true.
Else
Set MatsSorbentTrapValidExists to false.
Return result D
Else if the MatsSorb ent Trap Record. MOD C Code is equal to "34",
If MatsSorhentTrapSamplingTrainList.T rainQAStatusCode for both sampling train components are equal to "FAILED",
Set MatsSorbentTrapMODCCodeValid equal to true.
Else If MatsSorhentTrapSamplingTrainList.T rainQAStatusCode for both sampling train components are equal to
"UNCERTAIN",
Environmental Protection Agency
Page 896 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set MatsSorbentTrapMODCCodeValid equal to true.
Else if MatsSorhentTrapSamplingTrainList.TrainQAStatusCode for one or both sampling train components is equal to
"LOST", "EXPIRED" or "INC",
Else
Set MatsSorbentTrapMODCCodeValid equal to true.
Set MatsSorbentTrapValidExists to false.
Return result E
Else if the MatsSorbentTrapRecord.MODCCode is equal to "35",
Set MatsSorbentTrapMODCCodeValid equal to true.
Results:
Result
A
B
C
D
E
Usage:
1
Severity
Critical Error Level 1
Response
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 Critical Error Level 1
of both trains is PASSED.
For [key], you reported a [fieldname] of [value] which is valid if the QA Status Code Critical Error Level 1
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 Critical Error Level 1
both trains is UNCERTAIN.
For [key], you reported a [fieldname] of [value] which is valid if the QA Status Code of Critical Error Level 1
both trains is FAILED or UNCERTAIN, or one or both trains is LOST, EXPIRED, or
INC.
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 897 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-11
Check Name:
Related Former Checks:
Paired Trap Agreement Validation and Re-calculation
Applicability:
Description:
Specifications:
Determine if the Paired Trap Agreement is Valid.
Set MatsSorbentTrapPairedTrapAgreementValid to false.
Set MatsCalcTrapAbsoluteDifference = null.
Set MatsCalcTrapPercentDifference = null.
If the MatsSorbentTrapMODCCodeValid is equal to true,
If MatsSorb ent Trap Record. Pa i rcdT ra p A g rcc m c n t is null,
If MatsSorbentTrapRecord.MODCCode is not "32", "34", "35", or "44",
Set MatsSorbentTrapValidExists to false.
Return result A.
Else if MatsSorbentTrapRecord. Abso\\AsDiSQXQUCQlu6iic?Aox is not null,
Set MatsSorbentTrapValidExists to false.
Return result B.
Else
Set MatsSorbentTrapPairedTrapAgreementValid to true
If MatsSorbentTrapRecord.MODCCode is not "01", "02", "33", or "43",
Set MatsSorbentTrapValidExists to false.
Return result C.
Else if MatsSorbentTrapRecord.PmrcdTmpAgrccmcnl is not rounded to two decimal places
Set MatsSorbentTrapValidExists to false.
Return result D.
Else if MatsSorbentTrapRecord. AbsolvLteDi&QKncelndicator is equal to 0, OR
MatsSorbentTrapRecord. AbsolvLteDi&QKncelndicator is equal to 1,
Set MatsCalcTrapAbsoluteDifference = the absolute value of the difference between the
MatsSorbentTrapSamplingTrainlJst.HgConccnlraUon for each train.
If the sum of the MatsSorbentTrapSamplingTrainList.HgConccnlrMion from each train is NOT equal to 0,
Set MatsCalcTrapPercentDifference = 100 * MatsCalcTrapAbsoluteDifference divided by the sum of
the MatsSorbentTrapSamplingTrainList.HgConcentration from each train.
Else
Else
Set MatsCalcTrapPercentDifference = 0
Round MatsCalcTrapAbsoluteDifference to 2 decimal places.
Round MatsCalcTrapPercentDifference to 2 decimal place.
If MatsSorbentTrapRecord. AbsoluteDififerencelndicator is equal to 0,
Environmental Protection Agency
Page 898 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If MatsSorb ent Trap Record. Pa i rcdT ra p A g rcc m c n t does not equal MatsCalcTrapPercentDifference,
Set MatsSorbentTrapValidExists to false.
Return result G.
Else if MatsSorbentTrapRecorcl.PmrcdTmpAgrccmcnl is less than or equal to 10,
If MatsSorbentTrapRecord.MODCCode is not equal to "01", "02" OR "43",
Set MatsSorbentTrapValidExists to false.
Return result H.
Else
Set MatsSorbentTrapPairedTrapAgreementValid to true.
Else if MatsSorbentTrapRecord.PmrcdTmpAgrccmcnl is less than or equal to 20, and the
MatsSorbent TrapRecord. H g Sy s t c m C o n cc n t ra t i o n is less than or equal to 1.0,
If MatsSorbent TrapRecord. MOD C Code is not equal to "01", "02" OR "43",
Set MatsSorbentTrapValidExists to false.
Return result I.
Else
Set MatsSorbentTrapPairedTrapAgreementValid to true.
Else
If MatsSorbent TrapRecord. MOD C Code is not equal to "33",
Set MatsSorbentTrapValidExists to false.
Return result J.
Else
Set MatsSorbentTrapPairedTrapAgreementValid to true.
Else // AbsoluteDilferencelndicator is equal to 1
If MatsSorb ent TrapRecord. Pa i rcdT ra p A g rcc m c n t is less than or equal to 0.03,
If MatsSorbentTrapRecord.PmrcdTmpAgrccmcnl does not equal
MatsCalc Trap A bsoluteDifference.
Set MatsSorbentTrapValidExists to false.
Return result E.
Else
Set MatsSorbentTrapPairedTrapAgreementValid to true.
Else
Set MatsSorbentTrapValidExists to false.
Return result F.
Else // AbsoluteDilferencelndicator is null (not 0 or 1)
Set MatsSorbentTrapValidExists to false.
Return result K.
Environmental Protection Agency
Page 899 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
A
B
C
D
E
G
H
I
J
K
Response
For [key], you did not report a [fieldname] value which is required if the sorbent trap
system MODC Code is [value].
For [key], you reported a [fieldname2], but did not report a [fieldname].
For [key], you reported a [fieldname] value which is not reported if the sorbent trap
system MODC Code is [value].
The [fieldname] value for [key] should be reported to two decimal places.
The [fieldname] is inconsistent with the value [value 1] calculated from the reported
[key] records used in the calculation.
For [key], you reported an Absolute Difference Indicator of 1 that can only be used if
the absolute difference between the Hg concentrations of the paired traps is less than or
equal to 0.03 ug/m3.
The [fieldname] is inconsistent with the value [value2] calculated from the reported
[key] records used in the calculation.
For [key], you reported a passing Paired Trap Agreement that is not consistent with an
MODC Code other than 01, 02 or 43.
For [key], you reported a passing Paired Trap Agreement that is not consistent with an
MODC Code other than 01, 02 or 43.
For [key], you reported a failed Paired Trap Agreement that is not consistent with an
MODC Code other than 33.
For [key], you did not report a [fieldname2] value which is required if the sorbent trap
system MODC Code is [value].
Severity
Critical
Error
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Critical
Error
Error
Level 1
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Critical
Error
Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 900 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-12
Check Name:
Related Former Checks:
Hg System Concentration Validation and Re-calculation
Applicability:
Description:
Specifications:
Determine if the Hg System Concentration is Valid.
Set MatsCalcHgSystemConcentration equal to null.
If the MatsSorbentTrapPairedTrapAgreementValid is equal to true,
If the MatsSorbentTrapRecord. H g Sy s t e m C o n cc n t ra t i o n is null,
If the Mat sS orb ent TrapRecord. MOD C Code is not "34" or "35",
Set MatsSorbentTrapValidExists to false.
Return result A.
Else
If the MatsSorbent TrapRecord.MOBCCode is not "01", "02", "32", "33", "43" or "44",
Set MatsSorbentTrapValidExists to false.
Return result B.
Else if the MatsSorbent TrapRecord. Hg Sy s t c m Co ncc n t ra t i o n 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 if the MatsSorb ent TrapRecord. H g Sy s t c m C o n cc n t ra t i o n is 0,
Set MatsSorbentTrapValidExists to false.
Return result E
Else if any of the MatsSorbentTrapSamplingTrainList.YlgConcentmtion entries are 0,
Set MatsSorbentTrapValidExists to false.
Return result F
Else
If MatsSorb ent TrapRecord. MOD C Code is equal to "32" or "44",
Set HgConcentrationCalculation = multiply 1.111 times the
MatsSorbentTrapSamplingTrainList.YlgConcentmtion entry where
MatsSorhentTrapSamplingTrainList.TraiiiQAStatusCode is equal to "PASSED".
Else if MatsSorbentTrapDataRecord.MODCCodc is equal to "33",
Set HgConcentrationCalculation = the higher of the
MatsSorbentTrapSamplingTrainList.YlgConcentmtion entries for the sampling train components.
Else //MODC "01", "02" or "43"
Set HgConcentrationCalculation = the sum of the
MatsSorbentTrapSamplingTrainlJst.HgConccnlraUon for each train divided by two.
Set MatsCalcHgSystemConcentration to HgConcentrationCalculation in scientific notation with three
significant digits, keeping one to the left of the dicmal point (x.xxEx).
Environmental Protection Agency
Page 901 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If MatsSorb ent Trap Record. H g Sy s t c m C o n cc n t ra t i o n does not equal MatsCalcHgSystemConcentration,
Results:
Result
A
B
C
D
E
Usage:
1
Set MatsSorbentTrapValidExists to false.
Return result D.
Response
For [key], you did not report a [fieldname] value which is required if the sorbent trap
system MODC Code is [value].
For [key], you reported a [fieldname] value which is not reported if the sorbent trap
system MODC Code is [value].
The [fieldname] value in the [key] records is not reported in scientific notation rounded
to three significant figures, with one digit to the left of the decimal point.
The [fieldname] is inconsistent with the value [value 1] calculated from the reported
[key] records used in the calculation.
For [key], you reported a 0 for the Hg Concentration at the Sorbent Trap. When the
measured Hg concentration is less than the detection limit, the Method Detection Limit
should be reported at the Sorbent Trap and one or both Sampling Trains, as per
63.10007(e)(1).
For [key], you reported a 0 for the Hg Concentration at one or both Sampling Trains.
When the measured Hg concentration is less than the detection limit, the Method
Detection Limit should be reported instead of zero, as per 63.10007(e)(1).
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Process/Category: Emissions Data Evaluation Report ¦
¦ MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 902 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
MATSTRP-13
Check Name:
Update Sorbent Trap Parameters
Related Former Checks:
Applicability:
Description:
Specifications:
For SorbentTrapDictionary entry where the key is equal to MatsSorbentTrapRecord.Trapid, set:
1) SorbentTrapValidExists set to MatsSorbentTrapValidExists.
2) SamplingTrainProblemComponentExists set to MatsSamplingTrainProblemComponentExists.
Results:
Result
Response
Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 903 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-14
Check Name: Number of Unit Operating Days
Related Former Checks:
Applicability:
Description: Check the Number of Unit Operating Days During Sampling Period.
Specifications:
If MatsSorbentTrapRecord.ModcCode is NOT equal to "34",
If MatsSorbentTrapDictionary.OpcrMingD'McLisl where MatsSorbentTrapDictionary key is equal to
MatsSorbentTrapRecord.Trapid contains more than 15 dates,
Return result A.
Results:
Result Response Severity
A You reported a sorbent trap sampling period longer than the maximum 15 operating Critical Error Level 1
days.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Last Hour Evaluation
Environmental Protection Agency
Page 904 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: MATSTRP-15
Check Name: Ensure that Active Methods Span the Sorbent Trap Period.
Related Former Checks:
Applicability: General Check
Description: This check ensures that active ST or CEMST methods exists and span the period of the sorbent trap.
Specifications:
Locate MethodRecords for the location where:
1) MethodCode is equal to "ST" or "CEMST".
2) BeginDateHour is less than or equal to MatsSorbentTrapRecord. E ndDatcHour.
3) EndDateHour is null OR greater than or equal to Mat sS orb ent TrapRecord. BeginDateHour.
If not found,
return result A.
Else if BeginDateHour and EndDateHour of the retrieved MethodRecords records do not span the entire period of the
MatsSorbentTrapRecord BeginDateHour and EndDateHour,
return result B.
Results:
Result Response Severity
A You reported sorbent trap [KEY], but no sorbent trap methods are active during the Critical Error Level 1
period the trap is active.
B You reported sorbent trap [KEY], but the sorbent trap methods are not active for the Critical Error Level 1
entire period the trap is active.
Usage:
1 Process/Category: Emissions Data Evaluation Report MATS Sorbent Trap Evaluation
Environmental Protection Agency
Page 905 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
NSPS4T Summary, Compliance Period and Annual Checks
Environmental Protection Agency
Page 906 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: NSPS4T-1
Check Name: NSPS4T Summary: Validate Record Count
Related Former Checks:
Applicability:
Description: Ensures that the correct number of NSPS4T Summary rows exists, based on whether NSPS4T is an active
program.
Specifications:
Set Nsps4tCurrentSummaryRecord to null.
Locate CurrentSummaryRecords in Nsps4tSummaryRecords where MonitorLocationKey is equal to
CurrentMonitorPlanLocationRecord.MonitorLoctionKey.
If the first two characters of CurrentMonitor Plan Location Record.Loci\UonNi\mc do not equal to "CS", "MS", "CP" or "MP",
Locate CurrentLocationProgramRecord in EmLocationProgramRecords where:
1) ProgramCode is equal to "NSPS4T".
2) ClassCode is equal to "A".
3) UnitMonitorCertBeginDate is on or before the CurrentReportingPeriodEndDate.
4) EndDate is null, OR is on or after CurrentReportingPeriodBeginDate.
If CurrentLocationProgramRecord does not exist,
If the count of CurrentSummaryRecords is greater than 0,
Return result A.
Else
Else
If the count of CurrentSummaryRecords is greater than 1,
Return result B.
Else
Set Nsps4tCurrentSummaryRecord to the single record in CurrentSummaryRecords.
If the count of CurrentSummaryRecords is greater than 0,
Return result C.
Results:
Result Response Severity
A You have reported data for the NSPS4T program, but based on information in the Critical Error Level 1
monitoring plan, this unit is not NSPS4T affected.
B You have reported more than one set of NSPS4TSummary data for this location. Critical Error Level 1
C You have reported NSPS4T summary data for a stack or pipe, but the data is only Critical Error Level 1
allowed for a unit.
Usage:
1 Process/Category: Emissions Data Evaluation Report NSPS4T Summary Data Evaluation
Environmental Protection Agency Page 907 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
NSPS4T-2
Check Name:
Related Former Checks:
NSPS4T Compliance Period: Validate Record Count
Applicability:
Description:
Ensures that an allowed number of NSPS4T Compliance Period rows exists.
Specifications:
Set Nsps4tCurrentCompliancePeriodlRecord to null.
Set Nsps4tCurrentCompliancePeriod2Record to null.
Set Nsps4tCurrentCompliancePeriod3Record to null.
If Nsps4tCurrentSummaryRecord is NOT null,
Locate CurrentCompliancePeriodRecords in Nsps4tCompliancePeriodRecords where Nsps4tSummaryKey is equal to
Nsps-ltCurrentSummaryRecord.NspsMSummnvyKcy.
If Nsps4tCurrentSummaryRecord.NoCompliancePenodEndedlndicator is equal to I,
If the count of CurrentCompliancePeriodRecords is greater than 0,
Return result A.
If the count of CurrentCompliancePeriodRecords is greater than 3,
Return result B.
Else if the count of CurrentCompliancePeriodRecords is equal to 0,
Return result C.
Else
Set Nsps4tCurrentCompliancePeriodlRecord to the first record in CurrentCompliancePeriodRecords.
Set Nsps4tCurrentCompliancePeriod2Record to the second record in CurrentCompliancePeriodRecords, if it exists
Set Nsps4tCurrentCompliancePeriod3Record to the third record in CurrentCompliancePeriodRecords, if it exists.
Else
Results:
Result
A
You have reported NoCompliancePeriodEndedlndicator of 1, but have also reported
compliance period data. This is incorrect.
Response
Severity
Critical Error Level 1
B
C
You have reported compliance period data for more than 3 periods. This is incorrect.
You have reported NoCompliancePeriodEndedlndicator of 0 but have not reported
compliance period data.
Critical Error Level 1
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report NSPS4T Summary Data Evaluation
Environmental Protection Agency
Page 908 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
NSPS4T-3
Check Name:
Related Former Checks:
NSPS4T Annual (4th Quarter): Validate Record Count
Applicability:
Description:
Ensures that the correct number of NSPS4T Annual rows exists.
Specifications:
Set Nsps4tCurrentAnnualRecord to null.
If Nsps4tCurrentSummaryRecord is not null,
Locate CurrentAnnualRecords in Nsps4tAnnualRecords where Nsps4tSummaryKey is equal to
Nsps-ltCurrentSummaryRecord.NspsMSummnvyKcy.
If CurrentReportingPeriodQuarter is not equal to 4,
If the count of CurrentAnnualRecords is greater than 0,
Return result A.
If the count of CurrentAnnualRecords is greater than 1,
Return result B.
Else if the count of CurrentAnnualRecords is equal to 0,
Return result C.
Else
Set Nsps4tCurrentAnnualRecord to the single record in CurrentAnnualRecords.
Else
Results:
Result
A
Response
You have reported NSPS4T Fourth Quarter data. This data should only be reported in
fourth quarter files.
You have reported more than one NSPS4T Fourth Quarter record. You should only
report one record per location.
You have not reported NSPS4T Fourth Quarter data. A fourth quarter file should
contain this data.
Severity
Critical Error Level 1
B
Critical Error Level 1
C
Critical Error Level 1
Usage:
1 Process/Category: Emissions Data Evaluation Report NSPS4T Summary Data Evaluation
Environmental Protection Agency
Page 909 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
NSPS4T-4
Check Name:
Related Former Checks:
NSPS4T Summary C02 Emissions Standard vs. Electrical Load Code
Applicability:
Description:
Ensures that the NSPS4T Summary's C02 Emissions Standard and Electrical Load are consistent with each
other.
Specifications:
If Nsps4tCurrentSummaryRecord is not null,
If /V.s/>.s-/?C.'M/7*6'rt?.VMi«i«c//*j/?t'cwY/.Co2EmissioiiStaiidardElcctricalLoadCodc is not null. AND does not equal
Nsps4tCurrentSummaryRecord.ElectricalLoadCode,
Return result A.
Results:
Result Response Severity
A You reported an Electrical Load that is not consistent with the reported C02 Emission Informational Message
Standard.
Usage:
1 Process/Category: Emissions Data Evaluation Report NSPS4T Summary Data Evaluation
Environmental Protection Agency
Page 910 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: NSPS4T-5
Check Name: NSPS4T Summary C02 Emissions Standard vs. Compliance Period C02 Emission Rate UOM
Related Former Checks:
Applicability:
Description: Ensures that the NSPS4T Summary's C02 Emissions Standard and each reported Compliance Period C02
Emission Rate UOM are consistent with each other.
Specifications:
Set Nsps4tInvalidCo2EmissionRateUomList to
If Nsps4tCurrentSummaryRecord is not null,
If /V.s/>.s-/?C.'M/7*6'rt?.VMi«i«c//*j/?t'cwY/.Co2EmissioiiStaiidardRatcUomCodc is not null,
If Nsps4tCurrentCompliancePeriodlRecord is not null,
If Nsps4tCurrentCompliancePeriod 1 Record. C02 E m i ssion RatcUOIVICode is not null, AND is not equal to
/V.s/>.s-/?C.'M/7*6'rt?.VMi«i«c//*j/?t'cwY/.Co2EmissioiiStaiidardRatcUomCodc.
Append Nsps4tCurrentCompliancePeriodl Record. C02EmissionRateUOMLabel to
Nsps4tInvalidCo2EmissionRateUomList.
If Nsps4tCurrentCompliancePeriod2Record is not null,
If Nsps4tCurrentCompliancePeriod2 Record. C02 E m i ss i o n Ra tc UO IVI Code is not null, AND is not equal to
/V.s/>.s-/?C.'M/7*6'rt?.VMi«i«c//*j/?t'cwY/.Co2EmissioiiStaiidardRatcUomCodc.
Append Nsps4tCurrentCompliancePeriod2 Record. C02EmissionRateUOMLabel to
Nsps4tInvalidCo2EmissionRateUomList.
If Nsps4tCurrentCompliancePeriod3Record is not null,
If Nsps4tCurrentCompliancePeriod3 Record. C02 E m i ss i o n Ra tc UO IVI Code is not null, AND is not equal to
/V.s/>.s-/?C.'M/7*6'rt?.VMi«i«c//*j/?t'cwY/.Co2EmissioiiStaiidardRatcUomCodc.
Append Nsps4tCurrentCompliancePeriod3 Record. C02EmissionRateUOMLabel to
Nsps4tInvalidCo2EmissionRateUomList.
If Nsps4tInvalidCo2EmissionRateUomList does not equal
Return result A.
Else if Nsps4tCurrentSummaryRecord.Co2EmissionStandardCode is equal to "MODUS",
If Nsps4tCurrentCompliancePeriodlRecord is not null,
If Nsps4tCurrentCompliancePeriod2Record is not null, AND
Nsps-ltCurrentCompliancePeriod 2 Record.COlEmissionR'McUOMCodc is not equal to
Nsps-ltCurrentCompliancePeriod 1 Record.COlEmissionR'McUOMCodc.
OR
Nsps4tCurrentCompliancePeriod3Record is not null, AND
Nsps4tCurrentCompliancePeriod3 Record. C02 E m i ss i o n Ra tc UO IVI Code is not equal to
Nsps-ltCurrentCompliancePeriod 1 Record.COlEmissionR'McUOMCodc.
Return result B.
Environmental Protection Agency
Page 911 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response Severity
A You have used different units of measure in your reporting of C02 emission rate codes. Informational Message
You should use the same C02EmissionRateUOMCode in all instances.
B The reported NSPS4T C02 emission rate UOM values in your reported compliance Informational Message
period records do not match.
Usage:
1 Process/Category: Emissions Data Evaluation Report NSPS4T Summary Data Evaluation
Environmental Protection Agency
Page 912 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
RATA Status
Environmental Protection Agency
Page 913 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: RATSTAT-1
Check Name: Check Low Sulfur and FLOW Exemptions
Related Former Checks:
Applicability: CEM Check
Description: This check determines if an S02 system is exempt for RATA Status purposes or determines the maximum
number of levels applicable to a FLOW system for determination of RATA Status.
Specifications:
Set CurrentRATAStatus = null.
Set OverrideRATABAF = null.
Set MaxLevelCount = null.
Set FlowRATAExemption = false.
if (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 =
CurrentMonitorLocationld
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 (/. ocati on A ttributeRecords. By pa s s I n d == 1)
Set PeakingBypass = true.
else
Set PeakingBypass = true.
For each record in UnitStackConfigurationRecordsByHourLocation for the hour and stack location
Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld = the
unit location in the UnitStackConfigurationRecordsByHourLocation record and QualificationTypeCode
is equal to "PK" or "SK".
if (MonitorQualiJicationRecordsByHour is NOT found)
Environmental Protection Agency
Page 914 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set PeakingBypass = false.
Exit for.
else if (CurrentUnitisPeaking)
Set PeakingBypass = true,
if (PeakingBypass)
Set MaxLevelCount = 1.
else
Locate a record in MonitorQualificationRecordsByHour for the hour where the MonitoringLocationld =
CurrentMonitorLocationld and QualificationTypeCode is equal to "PRATA1"
if (MonitorQualiJicationRecordsByHour is found)
Set MaxLevelCount = 1.
else
Locate a record in MonitorQualificationRecordsByHour for the hour where MonitoringLocationld =
CurrentMonitorLocationld and the QualificationTypeCode is equal to "PRATA2"
if (MonitorQualificationRecordsByHour is found)
Set MaxLevelCount = 2.
else
Set MaxLevelCount = 3.
Append QaStatusSystemld to FLO WSystemIDArray for the location.
Locate a record in TestExtensionExemptionRecords for the location where the SystemID is equal to the QaStatusSystemld, the
ComponentID is equal to the the QaStatusComponentld the reporting period is the Current Reporting Period, AND the
ExtensionExemptionCode is equal to "FLOWEXP"
if (TestExtensionExemptionRecords is found)
Set FlowRATAExemption = true.
Results:
Result Response Severity
Environmental Protection Agency
Page 915 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02/02 RATA Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
H20 RATA Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
H20M RATA Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
Hg RATA Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report
NOX RATA Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
NOXC RATA Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
NOXR Unused P-PB NOX RATA Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 RATA Status Evaluation
9
Process/Category:
Emissions Data Evaluation Report
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 916 of 959
-------
ECMPS Emissions Check Specifications 3/4/2020 12:00:00AM
Check Code: RATSTAT-2
Check Name: Locate Most Recent Prior RATA Test
Related Former Checks:
Applicability: CEM Check
Description: Determines if there is an applicable prior RATA test.
Specifications:
Set PriorRATARecord = 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 RA TA TestRecordsByLocationForQAStatus for the location where the SystemID is in the
ApplicableSystemlDList and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to the CurrentDateHour
if (RATATestRecordsByLocationForQAStatus is found)
Set PriorRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
if (CurrentRATAStatus is null)
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus 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 Prior RA TA Record. E ndDatc/Hour and the TestResultCode is equal to "INVALID".
if (RATATestRecordsByLocationForQAStatus is found)
Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
else
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus for the location where the SystemID is in the
ApplicableSystemlDList and the TestResultCode is equal to "INVALID" and the EndDate/Hour is prior to the CurrentDateHour
if {RATATestRecordsByLocationForQAStatus is found)
Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
Results:
Result Response Severity
Environmental Protection Agency
Page 917 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02/02 RATA Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
H20 RATA Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
H20M RATA Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
Hg RATA Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report
NOX RATA Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
NOXC RATA Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
NOXR Unused P-PB NOX RATA Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 RATA Status Evaluation
9
Process/Category:
Emissions Data Evaluation Report
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 918 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
RATSTAT-3
Check Name:
Related Former Checks:
Locate Most Recent Prior Event
Applicability:
Description:
CEM Check
Determines if there is an applicable prior event.
Specifications:
Set PriorRATAEventRecord = 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;
a) PriorRATARecord is null OR
b) QACertEventDate/Hour is after the PriorRATARecord EmSDatefRom OR
c) QACertEventDate/Hour is equal to the PriorRATARecord.EndDi\\dY\oux AND (TestCompletionDate is null or the
TestCompletionDate/Hour is after the PriorRA TARecord. E ndDatc/Hour)
AND either:
a) Annual Reporting Requirement is equal to true OR
b) QACertEventDate/Hour is on or after April 1 of the year of CurrentDateHour
AND either:
a) QaStatusSystemTypeCode NOT is set (HCL, HF, HG, ST) OR
b) QACertEventCode is in set (101, 110, 125, 130)
if (QACertiflcationEventRecords is found)
Set PriorRATAEventRecord = the found record in QACertiflcationEventRecords.
if (PriorRATAEventRecord is null)
if (PriorRATARecord is null)
else if (InvalidRATARecord is not null AND PriorRATAEventRecord.QACertEventDate/Hour is after
InvalidRATARecord.EndDate/Hour)
Locate the earliest record in RA TA TestRecordsHy Location ForQAStatus for the location where the SystemID is equal to
the QaStatusSystemld and the EndDate/Hour is after the PriorRATAEventRecord.QACertEventDate/Hour and the
EndDate/Hour is prior to CurrentDateHour and the TestResult is equal to "INVALID"
if (RATATestRecordsByLocationForQAStatus is found)
AND either:
Set CurrentRATAStatus = "OOC-No Prior Test or Event'
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0
Environmental Protection Agency
Page 919 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set InvalidRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
else
Set InvalidRATARecord = null.
Results:
Result
Response
Severity
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02/02 RATA Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
H20 RATA Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
H20M RATA Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
Hg RATA Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report
NOX RATA Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
NOXC RATA Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
NOXR Unused P-PB NOX RATA Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 RATA Status Evaluation
9
Process/Category:
Emissions Data Evaluation Report
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 920 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: RATSTAT-4
Check Name: Check RATA Result
Related Former Checks:
Applicability: CEM Check
Description: Checks the result of the prior Rata test.
Specifications:
if (CurrentRATAStatus is null and PriorRATARecord is not null and PriorRATAEventRecord is null)
Set EvaluateMultiLevelRATA = true.
if (Prior RA TA Record. Q A Needs E va 1 ua t i o n F1 ag = "Y")
Set CurrentRATAStatus = "Prior Test Not Yet Evaluated".
else if (Prior RA TA Record. Te s t Re s u 11C ode = null or Prior RA TA Record. Te s t Re s u 11C ode = "FAILED" or
Prior RA TA Record. Te s t Re s u 11C ode = "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 Prior RA TA Record. E ndDatc/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 PriorRATAEventRecord = found record in QACertiflcationEventRecords.
elseif (PriorRATARecord.TQStResultCode = null)
Set CurrentRATAStatus = "OOC-Prior Test Has Critical Errors".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response
Usage:
1 Process/Category: Emissions Data Evaluation Report
2 Process/Category: Emissions Data Evaluation Report
3 Process/Category: Emissions Data Evaluation Report
4 Process/Category: Emissions Data Evaluation Report
5 Process/Category: Emissions Data Evaluation Report
6 Process/Category: Emissions Data Evaluation Report
7 Process/Category: Emissions Data Evaluation Report
8 Process/Category: Emissions Data Evaluation Report
9 Process/Category: Emissions Data Evaluation Report
Severity
C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
NOXR Unused P-PB NOX RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 922 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code:
RATSTAT-5
Check Name:
Related Former Checks:
Determine Event Conditional Status
Applicability:
Description:
CEM Check
If a QA Cert Event was found that affects this MHV record, evaluate the conditional status.
Specifications:
Set SubsequentRATARecord = null.
Set RATAMissingOpDatalnfo = null.
Set RATA Event Operating Level Count = null.
if (CurrentRATAStatus is null and PriorRATAEventRecord is not null)
if (Pmw7L47>4.E'veM£/te£w4.E'veM£/te£w4.E'veM£/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Re quire dLevelCount = MaxLevelCount
else (if PriorRATAEventRecord.RATA3Required is equal to "Y")
Re quire dLev elCount = 3
else (if PriorRA TAEventRecord.RATA2Rcquired is equal to "Y")
Re quire dLev elCount = 2
else
Re quire dLev elCount = 1
If (number of levels i n RA TA TestRecordsByL ocation ForOAStatus. O p Lc vc 1 Code Li st is less than
Re quire dLev elCount)
Set CurrentRATAStatus = "OOC-Incomplete Recertification".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = SubsequentRATARecord.OvcrAUBkisAdjusUncnlFaclor.
else
Set RATA Event Operating Level Count to the Re quire dLev elCount.
If (InvalidRATARecord is null)
Locate the earliest record in RA TA TestRecordsByLocationForOAStatus w here the SystemID is equal to
the PriorRA TAEventRecord. System ID, the TestResult is equal to "INVALID" and the EndDate/Hour is
on or after the Pmw7L47>4.E'veM£/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
"HF")
if ((CurrentMhvParameter <> "FLOW" and PriorRATAEventRecord.EvcntCodc = 125) or
0CurrentMhvParameter == "FLOW" and PriorRATAEventRecord.EvcntCodc = 305))
if (the associated BeginDate of the system in the PriorRATAEventRecord is null)
Set CurrentRATAStatus = "Invalid Monitor System"
else
If (the associated SystemTypeCode of the system in the PriorRATAEventRecord ==
"S02")
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in
ProgramRequiresSo2SystemCertiJicationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorRATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
ProgramRequiresSo2SystemCertiJicationList and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorRATAEventRecord.
else if (the associated SystemTypeCode of the system in the PriorRA TAEventRecord ==
"NOX")
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in
ProgramRequiresNoxSystemCertificationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorRATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
ProgramRequiresNoxSystemCertificationList and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorRATAEventRecord.
else if (the associated SystemTypeCode of the system in the PriorRA TAEventRecord ==
"NOXC")
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set
ProgramRequiresNoxcSystemCertificationList and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorRATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
set ProgramRequiresNoxcSystemCertificationList and the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the PriorRATAEventRecord.
Environmental Protection Agency
Page 925 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else if (the associated SystemTypeCode of the system in the PriorRA TAEventRecord in
set ("HCL, HG, ST"))
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the ProgramCode is in set {MATS} and the
UnitMonitorCertBeginDate is ON OR BEFORE the associated BeginDate of the
system in the PriorRATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the ProgramCode is in
set {MATS} and the EmissionsRecordingBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorRA TAEventRecord.
else
Locate the record in LocationProgramRecordsByHourLocation with the latest
UnitMonitorCertBeginDate where the UnitMonitorCertBeginDate is ON OR
BEFORE the associated BeginDate of the system in the
PriorRA TAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Locate the record in LocationProgramRecordsByHourLocation with
the latest EmissionsRecordingBeginDate where the
EmissionsRecordingBeginDate is ON OR BEFORE the associated
BeginDate of the system in the Prior RATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is not found)
Set CurrentRATAStatus = 'Missing Program".
else if (LocationProgramRecordsByHourLocationUnitMomtorCertDeadline is not null)
if (CurrentDate is prior to the
LocationProgramRecordsByHourLocation.UmtMomtorCertDeadlme)
Set CurrentRATAStatus = "IC-Conditional".
else
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else
if (CurrentDate is prior to the
LocationProgramRecordsByHourLocation.UmtMomtorCertBeginDate +180
days)
Set CurrentRATAStatus = "IC-Conditional".
else
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Environmental Protection Agency
Page 926 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set OverrideRATABAF = 1.0.
If (the number of calendar days ON OR AFTER the PriorRA TA EventRecord. Q ACcrt Evcnt Datc
and ON OR BEFORE the CurrentDateHour > 180)
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else if (the quarter of the PriorRA TA EventRecord. Q A Cc rt E vc n t Da t c is equal to the quarter of
the CurrentDateHour)
If (the number of calendar days ON OR AFTER the
PriorRA TA EventRecord. Q A C c rt E vc n t D a t c and ON OR BEFORE the
CurrentDateHour > 90)
If (Rpt Period Op Hours Accumulator Array for the location == -1)
Set CurrentRATAStatus = "Invalid Op Data".
else if (the number of calendar days ON OR AFTER the
PriorRA TA EventRecord. Q A C c rt E vc n t D a t c 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 OverrideRATABAF = 1.0.
else
Set CurrentRATAStatus = "IC-Conditional".
else
Set CurrentRATAStatus = "IC-Conditional".
else if (PriorRA TA EventRecord. M i nOpDay sPri orQua rt cr is null)
Set PriorRATAEventRecordMmO^DaysVnoxQ\m{ex = 0
Set PriorRATAEventRecordMaxO^DaysVnoxQwirtex = 0
For each quarter beginning with the quarter of the
PriorRA TA EventRecord. Q A C c rt E vc n t D a t c 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.
Environmental Protection Agency
Page 927 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iy Location.RcpovUngFrcqucncyCodc is
equal to "Q"),
Set PriorRA 7M £V /fec-w*/. M i n O p D a y s P r i o rQ u a rt c r
= -1
Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked
and [QTR] is the number of the quarter being checked.)
exit for.
If the quarter being checked is the quarter of the
PriorRA TA E vent Record. Q A C c rt E vc n t D a tc
If (()peratingSuppI)ataRecordsbyL ocation. O p Va 1 lie
MINUS the number of calendar days in the quarter
being checked that are PRIOR to the
PriorRA TA E vent Record. Q A C c rt E vc n t D a tc > 0)
Set
PriorRA TA E vent Record. IVI in O p D ay s P ri o rQ ua
rter =
()peratingSuppI)ataRecordsbyL ocation. O p Va 1
ue MINUS the number of calendar days in the
quarter being checked that are PRIOR to the
PriorRA TA E vent Record. Q A C c rt E vc n t D a tc
If ((tperatingSuppDataRecordsbyLocation.Op Va 1 lie is
less than the number of calendar days in the quarter
being checked that are ON OR AFTER the
PriorRA TA E ventRecord.Q A Cc rt E vc n t Da tc)
Set
PriorRA TA E vent Record. IVI a \ O p D ay s P ri o rQ ua
rter =
(tperatingSuppDataRecordsbyL ocation. O p Va 1
ue.
else
Set
PriorRA TA E vent Record. IVI a \ O p D ay s P ri o rQ ua
rter = the number of calendar days in the
quarter being checked that are ON OR AFTER
the
PriorRA TA E ventRecord.Q A Cc rt E vc n t Da tc.
else
Set PriorRA 7M £V . M i n O p D a y s P r i o rQ u a rt c r
= PriorRA TA E vent Record. IVI i n O p D ay s P ri o rQ ua rtc r +
()peratingSuppl)ataRecordsbyL ocation. O p Va 1 lie.
Set PriorRA TA E vent Record. IVI a \ O p D a \ s PriorQuarter
= PriorRATAEventRecordMaxO^DaysVnoxQwirtex +
()peratingSuppl)ataRecordsbyL ocation. O p Va 1 lie.
Environmental Protection Agency
Page 928 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (PriorRA TA Event Record. MinOpDaysPriorQuartcr == -1
set CurrentRATAStatus to "Missing Op Data"
else if {PriorRATAEventRecordMmO^DaysVnoxQ\m{ex + Rpt Period Op Days
Accumulator Array for the Location > 90)
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else if (PriorRATAEventRecord.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".
If (the quarter of the PriorRA TA E vent Record. C o n d i t i o n a 1B eg i n D a t c 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 PriorRATAEventRecord.CondL\tiona\BQgvaDatd)Aom and ON
OR BEFORE CurrentDateHour,
If the number > 720,
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else
Set CurrentRATAStatus = "IC-Conditional".
if (PriorRA TA Event Record. MinOpHoursPriorQuartcr is null)
Set PriorRATAEventRecord.IVTinOpHoursPriorQuartcr = 0
Set PriorRATAEventRecordMaxO\MowsPxioxQ\mtex = 0
for each quarter beginning with the quarter of the
PriorRA TA E vent Record. C o n d i t i o n a 1B eg i n D a t c 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
Environmental Protection Agency
Page 929 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
reporting period is equal to the quarter being checked.
else
Locate the record in OperatingSuppDataRecordsbyLocation
where the OpTypeCode is equal to "OPHOURS", FuelCode is
null, and the reporting period is equal to the quarter being
checked.
if (OperatingSuppDataRecordsbyLocation is not found)
Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the quarter being checked.
if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iy Location.RcpovUngFrcqucncyCodc is
equal to "Q"),
Set PriorRA TA E vent Record. M i n O p H on r s P r i o rQ ua rtc r
= -1
Set RA TA Missing()p Data Info = "[YEAR] Q[QTR]"
(where [YEAR] is the year of the quarter being checked
and [QTR] is the number of the quarter being checked.)
exit for.
If the quarter being checked is the quarter of the
Prior RA TAEventRecord. ConditionalBeginDate
If (()peratingSuppI)ataRecordsbyL ocation. O p Va 1 lie
MINUS the number of calendar hours in the quarter
being checked that are PRIOR to the
Prior RA TAEventRecord. ConditionalBeginDate/Hour >
0)
Set
PriorRA TAEventRecord. IVT i nOpHoursPriorQu
arter =
()peratingSuppl)ataRecordsbyL ocation. O p Va 1
ue MINUS the number of calendar hours in the
quarter being checked that are PRIOR to the
PriorRA TAEventRecord. ConditionalBeginDat
e/Hour
If (()peratingSuppI)ataRecordsbyLocation.Op Va 1 lie is
less than the number of calendar hours in the quarter
begin checked that are ON OR AFTER the
PriorRA TAEventRecord. ConditionalBeginDate/Hour)
Set
Pri orRA 7M £V /fec-w*/. M a x O p H o u r s P r i o rQ u
arter =
()peratingSuppl)ataRecordsbyL ocation. O p Va 1
ue.
else
Environmental Protection Agency
Page 930 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set
Pri or RA 7>4 £" v 67? . M a \ O p H o ii r s P r i o rQ ii
arter = the number of calendar hours in the
quarter being checked that are ON OR AFTER
the
PriorRA TAEventRecord. ConditionalBeginDat
e/Hour.
else
Set Prior RA TA E vent Record. M i n O p H on r s P r i o rQ ua rtc r
= PriorRA TAEventRecord. IVT i nOpHoursPriorQuartcr +
()peratingSuppI)ataRecordsbyL ocation. O p Va 1 lie.
Set PriorRA TAEventRecord.MaxOpHours
PriorQuarter =
PriorRA 7>4 £" v . M a \ O p H o u r s P r i o r Q u a rt c r +
()peratingSuppI)ataRecordsbyL ocation. O p Va 1 lie.
if (PriorRA TAEventRecord. IVT i nOpHoursPriorQuartcr == -1)
set CurrentRATAStatus to "Missing Op Data"
else if (Rpt Period Op Days Accumulator Array for the location == -1)
if (PriorRA TAEventRecord. IVT i nOpHoursPriorQuartcr > 720)
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else
Set CurrentRATAStatus = "Invalid Op Data".
else
if (PriorRA TAEventRecord. IVT i nOpHoursPriorQuartcr + Rpt Period Op Hours
Accumulator Array for the Location > 720)
Set CurrentRATAStatus = "OOC-Conditional Period Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = 1.0.
else if (/3/*iw£'v'677?/?6'cwY/.IVIa\OpHoursPriorQuartcr + Rpt Period Op Hours
Accumulator Array for the Location > 720)
Set CurrentRATAStatus = "Undetermined-Conditional Data".
else
Set CurrentRATAStatus = "IC-Conditional".
Results:
Result Response Severity
Environmental Protection Agency
Page 931 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Usage:
1
Process/Category:
Emissions Data Evaluation Report
C02/02 RATA Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
H20 RATA Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
H20M RATA Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
Hg RATA Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report
NOX RATA Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
NOXC RATA Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report —
NOXR Unused P-PB NOX RATA Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 RATA Status Evaluation
9
Process/Category:
Emissions Data Evaluation Report
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 932 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: RATSTAT-6
Check Name: Evaluate Prior Multi-Level RATA
Related Former Checks:
Applicability: CEM Check
Description: Determines (if applicable) if a prior multi level RATA exists and is acceptable.
Specifications:
Set PriorRatalsAlternateSingleLevelRATA = false.
Set ThreeLoadRATAExpirationDate to null.
If (CurrentMhvParameter == "FLOW" AND PriorRATARecord is not null AND CurrentRATAStatus is null, starts with "IC", or starts
with "Undetermined")
Set PriorRatalsAlternateSingleLevelRATA = true.
Set PriorMultiLevelRATARecord = null.
Set InvalidMultiLevelRATARecord = null.
Set Prior MaxLevetRATARecord = null.
if (the number of levels in Prior RA TA Record.O p Lc vc 1 Code Li st is greater than or equal to the MaxLevelCount)
Set PriorRatalsAlternateSingleLevelRATA = false,
exit check.
else if (Prior RA TA Record.O p Lc vc 1 Code L i st contains 2 levels)
Set PriorRatalsAlternateSingleLevelRATA = false,
if (MaxLevelCount <> 3)
exit check.
else if (AnnualReportingRequiremnt == true)
if (Prior RA TA Record. O p Lc vc 1 Code L i st contains 1 level and Prior RA TA Record. Tc s t C1 a i m Code == "SLC")
Set PriorRatalsAlternateSingleLevelRATA = false.
if (PriorRatalsAlternateSingleLevelRATA == true AND RATAEventOperatingLevelCount is null or less than 2)
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus for the location where the SystemID is equal
to the PriorRA TA Record System ID and the TestResultCode is not equal to "INVALID" and the EndDate/Hour is prior to
the PriorRA TARecord. E ndDatc/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 PriorMultiLevelRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus for the location where the SystemID
is equal to the PriorRA TARecord. System ID and the EndDate/Hour is prior to the
PriorRA TARecord. E ndDatc/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)
Environmental Protection Agency
Page 933 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set InvalidMultiLevelRATARecord = the found record in RATATestRecordsByLocationForQAStatus.
Locate the most recent record in RATATestRecordsByLocationForQAStatus for the location where the SystemID
is equal to the PriorRA TARecord. System ID and the EndDate/Hour is prior to the
Prior RA TARecord E ndDatc/Hour and the TestResultCode is equal to "INVALID", and the number of operating
levels the OpLevelCodeList is greater than or equal to 2 or the TestClaimCode == "SLC").
if (RATATestRecordsByLocationForQAStatus is found)
Set 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
PriorMultiLevelRA TA Record. System ID and RATA2Required is equal to "Y" and the QACertEventDate is either:
a) prior to the CurrentDateHour OR
b) equal to both the CurrentDateHour and the ConditionalBeginDate/Hour;
AND either:
a) QACertEventDate/Hour is after the PriorMultiLevelRA TA Record. E ndDatc/Hour OR
b) QACertEventDate/Hour is equal to the PriorMultiLevelRATARecord.EndDMc/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the
PriorMultiLevelRA TA Record. E ndDatc/Hour)
AND either
a) Annual Reporting Requirement is equal to true OR
b) QACertEventDate/Hour is on or after April 1 of the year of CurrentDateHour
if (QACertificationEventRecords is found)
Set 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" or PriorMultiLevelRATARecord .TestResultCode = "ABORTED")
Set CurrentRataStatus = "OOC-Incomplete QARATA".
Set OverrideRataBaf = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Set CurrentRataStatus = "OOC-Incomplete QARATA".
Set OverrideRataBaf = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
AND either:
a) QACertEventDate/Hour is after the PriorMaxLevelRA TA Record. E ndDatc/Hour OR
b) QACertEventDate/Hour is equal to the PriorMaxLevelRATA Record.EndDatc/Hour AND
(TestCompletionDate is null or the TestCompletionDate/Hour is after the
PriorMaxLevelRA TA Record. E ndDatc/Hour)
if (QACertificationEventRecords is found)
Set SubsequentRATARecord = PriorMaxLevelRATARecord.
Set CurrentRataStatus = "OOC-Incomplete Recertification".
Set OverrideRataBaf = 1.0.
else if (Prior MaxL evelRA TA Record. Q A Needs E\a 1 ua t i o n F1 ag = "Y")
Set CurrentRATAStatus = "Prior Maximum Level RATA Not Yet Evaluated".
else if (Prior MaxL e ve/RA TA Record. Tc s t Re s u 11C ode = null)
Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Has Critical Errors".
Set OverrideRataBaf = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if {Annual Reporting Requirement == false)
Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".
Set OverrideRataBaf = Pmw7L47)l/te£w 720)
Set CurrentRATAStatus = "OOC-Prior Maximum Level RATA Expired".
Set OverrideRataBaf = Pmw7L47)l/te£w 720)
Set CurrentRATAStatus = "OOC-Prior
Maximum Level RATA Expired".
Set OverrideRataBaf =
PriorRA TA Record. O ve ra 11B i a s A dj u s t m c n t Fact
or.
exit for.
else
Locate the record in ReportingFrequencyByLocation
where CalendarYear/Quarter are equal to the quarter
being checked.
if found, and (the quarter being checked is 2 or 3, or
ReportingFrequencyByLocation.ReportingFrequencyC
ode is equal to "Q"),
Set CurrentRATAStatus = 'Missing Op Data".
Environmental Protection Agency
Page 937 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result Response
Usage:
1 Process/Category: Emissions Data Evaluation Report
2 Process/Category: Emissions Data Evaluation Report
3 Process/Category: Emissions Data Evaluation Report
4 Process/Category: Emissions Data Evaluation Report
5 Process/Category: Emissions Data Evaluation Report
6 Process/Category: Emissions Data Evaluation Report
7 Process/Category: Emissions Data Evaluation Report
8 Process/Category: Emissions Data Evaluation Report
9 Process/Category: Emissions Data Evaluation Report
Set RATAMissingOpDatalnfo = "[YEAR]
Q[QTR]" (where [YEAR] is the year of the
quarter being checked and [QTR] is the
number of the quarter being checked.)
exit for.
Severity
C02/02 RATA Status Evaluation
H20 RATA Status Evaluation
H20M RATA Status Evaluation
Hg RATA Status Evaluation
NOX RATA Status Evaluation
NOXC RATA Status Evaluation
NOXR Unused P-PB NOX RATA Status Evaluation
S02 RATA Status Evaluation
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 938 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: RATSTAT-7
Check Name: Determine Expiration Dates for Most Recent Prior RATA Test
Related Former Checks:
Applicability: CEM Check
Description: Determines the expiration dates for the Applicable Prior RATA test. This includes the Test Expiration Date
both with and without any extensions
Specifications:
if (CurrentRATAStatus is null and PriorRATARecord is not null and PriorRATAEventRecord is null)
Set PriorTestExpirationDate = null
Set PriorTestExpirationDate WithExtension = null
Set MissingOpData = false
Set NumberOfExtensionQuarters = 0
Set PriorTestExpirationDate = PriorRA TARecord. Test E\pi rat ionDatc.
Set PriorTestExpirationDate WithExtension = PriorRA TA Record. Tc s t E \ p i ra t i o n D a t c Wi t h E \ tc n s i o n.
If (PriorRA TA Record. I g no rcG racc Fo r E \ t c n s i o n s is equal to 1)
Set PriorTestlgnoreGraceForExtensions = true
Else
Set PriorTestlgnoreGraceForExtensions = false
if (PriorTestExpirationDate is null)
if {Annual Reporting Requirement == false)
if (PriorRA TA Record. E ndDa tc is between 10/01/2007 and 12/31/2007)
Set PriorTestExpirationDate = 09/30/2008
else
Set PriorTestExpirationDate = September 30th of the year of the PriorRA TARecord. E ndDa tc.
else if (QaStatusSystemDesignationCode == "B")
Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the QaStatusSystemld and
the ExtensionExemptionCode is equal to "NRB720" and a ReportingPeriod equal to the CurrentReportingPeriod.
if (TestExtensionExemptionRecords is found)
Set PriorTestExpirationDate = the end of the quarter eight quarters after the
PriorRA TARecord. E ndDa tc.
if (PriorTestExpirationDate is null)
if (PriorRatalsAlternateSingleLevelRATA == true)
Set PriorTestExpirationDate = the end of the quarter one year after the
PriorMultiLevelRA TARecord. E ndDatc.
if (PriorMultiLevelRATARecord. GracePeriodlnd == 1)
Set PriorTestExpirationDate = the end of the quarter prior to the PriorTestExpirationDate.
else
if (PriorRATARecord.R-c\{'c\¥xc(.\uc\\c\CA in set {4QTRS,8QTRS})
Environmental Protection Agency
Page 939 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Locate the most recent QACertificationEventRecords for the PriorRA TAReeord. System ID
where RATARequired is equal to "Y" and the BeginDate/Hour is prior to the
PriorRA TAReeord. Begi liDate/Hour.
if (QACertificationEventRecords is found and RATACertEvent == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
PriorRA TAReeord. E ndDatc/Hour)
if (PriorRA TAReeord. SystcmTypcCodc is in set (HCL, HF, HG, ST))
Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and
the EmissionsRecordingBeginDate is ON OR BEFORE the BeginDate of the
associated system in the PriorRATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecordingBeginDate is later than
OA CertificationEventRecords. CompletionTestDate)
Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecordingBeginDate.
Else
Set PriorTestExpirationDate = the end of the quarter one year after the
OA CertificationEventRecords. CompletionTestDate.
if (PriorRA 7>1/?6'cwy/. GracePeriodlnd == 1)
Set PriorTestlgnoreGraceForExtensions = true.
Else
Set PriorTestExpirationDate = the end of the quarter one year after the
OA CertificationEventRecords. CompletionTestDate.
if (PriorRA 7>1/?6'cwy/. GracePeriodlnd == 1)
Set PriorTestExpirationDate = the end of the quarter prior to the
PriorTestExpirationDate.
else
if (PriorRA TAReeord. SystcmTypcCodc is in set (HCL, HF, HG, ST))
Locate the record in LocationProgramRecordsByHourLocation with the latest
EmissionsRecordingBeginDate where the ProgramCode is equal to MATS and
the EmissionsRecordingBeginDate is ON OR BEFORE the BeginDate of the
associated system in the Prior RATAEventRecord.
If (the record in LocationProgramRecordsByHourLocation is found) and
(EmissionsRecordingBeginDate is later than PriorRA TAReeord. E ndDa tc)
Set PriorTestExpirationDate = the end of the quarter one year after the
EmissionsRecordingBeginDate.
Else
Set PriorTestExpirationDate = the end of the quarter one year after the
PriorRA TAReeord. E ndDa tc.
Environmental Protection Agency
Page 940 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Else
Set PriorTestExpirationDate = the end of the quarter one year after the
Prior RA TAReeord. E ndDa tc.
if (Prior RA 7>1/?6'cwy/. GracePeriodlnd == 1)
Set PriorTestExpirationDate = the end of the quarter prior to the
PriorTestExpirationDate.
else
Locate the most recent QACertiflcationEventRecords for the PriorRA TAReeord. System ID
where RATARequired is equal to "Y" and the BeginDate/Hour is prior to the
PriorRA TAReeord. Begi nDatc/Hour.
if {QACertiflcationEventRecords is found AND RATACertEvent == "Y" and the
ConditionalDataBeginDate is null and the CompletionTestDate/Hour is after the
PriorRA TAReeord. E ndDatc/Hour)
Set PriorTestExpirationDate = the end of the quarter two quarters after the
OA CertificationEventRecords. CompletionTestDate.
else
Set PriorTestExpirationDate = the end of the quarter two quarters after the
PriorRA TAReeord. E ndDa tc.
Set PriorRA TA Reeord. Tc s t E \ p i ra t i o n Da tc = PriorTestExpirationDate.
If (PriorTestlgnoreGraceForExtensions is true)
Set PriorRA TA Reeord. I g no rcG racc Fo r E \ t c n s ions = 1
Else
Set PriorRA TA Reeord. I g n o rc G ra cc Fo r E \ t c n s i o n s = 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 = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
if (PriorRA 7>1/?6'cwy/. GraccPeriodlnd == 1) and (PriorTestlgnoreGraceForExtensions is false)
StartQuarter = the quarter of the PriorRA TAReeord. E ndDa tc
else
StartQuarter = the quarter after the PriorRA TAReeord. E ndDa tc
set EndQuarter = the quarter two years after the quarter of the PriorRA TAReeord. E ndDa tc.
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
()peratingSuppDataRecordsIiyL ocation. O p Va 1 lie < 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
ReportingFrequeney/iyLoeation.RcpovUngFrcqucncyCodc is equal to "Q"),
Set Missing Op Data to true
Set RA TA Missingt)p Data Info = "[YEAR] Q[QTR]" (where [YEAR] is
Environmental Protection Agency
Page 942 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
the year of the quarter being checked and [QTR] is the number of the
quarter being checked.)
else if (QaStatusSystemDesignationCode == "PB")
Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
QaStatusSystemld, the ExtensionExemptionCode is equal to "NONQAPB" or
"GRACEPB", and the reporting period is equal to the year/quarter being checked.
if (TestExtensionExemptionRecords is found)
Set NumberOfExtensionQuarters = NumberOfExtensionQuarters + 1.
Set StartNonQaPrimaryBypassQuarter = year/quarter being checked plus one
quarter.
else if (OperatingSuppDataRecordsByLocation is not found)
Locate the record in ReportingFrequencyByLocation where
CalendarYear/Quarter are equal to the year/quarter being checked .
if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iy Location.RcpovUngFrcqucncyCodc is equal to "Q"),
Set Missing Op Data to true
Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is
the year of the quarter being checked and [QTR] is the number of the
quarter being checked.)
else if (OperatingSuppDataRecordsByLocation is not found)
Locate the record in ReportingFrequencyByLocation where CalendarYear/Quarter are
equal to the year/quarter being checked .
if found, and (the quarter being checked is 2 or 3, or
ReportingFrequency/iy Location.RcpovUngFrcqucncyCodc is equal to "Q"),
Set Missing Op Data to true
Set RATAMissingOpDatalnfo = "[YEAR] Q[QTR]" (where [YEAR] is the year
of the quarter being checked and [QTR] is the number of the quarter being
checked.)
if (QaStatusSystemDesignationCode == "PB")
// Allow additional extensions for non QA Primary Bypass exemptions.
For each quarter beginning with StartNonQaPrimaryBypassQuarter and continuing through the quarter
prior to the quarter of the CurrentDateHour
Locate a record in TestExtensionExemptionRecords where the SystemID is equal to the
QaStatusSystemld, the ExtensionExemptionCode is equal to "NONQAPB" or "GRACEPB", 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 943 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Add NumberOfExtensionQuarters to PriorTestExpirationDateWithExtension.
If PriorTestExpirationDateWithExtension is greater than MaximumExtensionDate
Set PriorTestExpirationDate WithExtension = MaximumExtensionDate
Set PriorRA TARecord.Tcst E\pi rat ion Datc Wi th E\tcnsion = PriorTestExpirationDate WithExtension.
else
Set PriorRA TA Record. Tc s t E \ p i ra t i o n D a t c Wi t h E \ tc n s i o n = PriorTestExpirationDate
If (CurrentDateHour is ON OR BEFORE the PriorTestExpirationDate WithExtension)
Set CurrentRATAStatus = "IC-Extension".
else if (.Missing Op Data is true)
Set CurrentRATAStatus = 'Missing Op Data".
Set PriorRA TA Record. Tcs t E \ p i ra t i o n Da t c Wi t h E\ tcnsion = null
else if (RptPeriodOpTimeAccumulatorArray == -1)
Set CurrentRATAStatus = "Invalid Op Data".
else
Set GraceOpHours = RptPeriodOpHoursAccumulatorArray for the location.
if (GraceOpHours > 720)
Set CurrentRATAStatus = "OOC-Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
if (Grace OpHours > 720)
Set CurrentRATAStatus = "OOC-Expired".
if (CurrentMhvParameter == "FLOW")
Set OverrideRATABAF =
Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: RATSTAT-8
Check Name: Determine Final RATA Status
Related Former Checks:
Applicability: CEM Check
Description: Evaluates the determined RATA Status and changes it if needed based on an ignored test or the status of the
alternate system.
Specifications:
Set AlternateRATARecord = null.
if (CurrentRATAStatus begins with "OOC")
Set In validRA TA Test Number = null.
if (InvalidMultiLevelRATARecord is not null)
Set Invalid RATA Test Number = InvalidMultiLevelRATARecord.TestNumber
Set CurrentRATAStatus = CurrentRATAStatus &
if (CurrentMhvParameter == "FLOW")
Set RATA StatusBAF = InvalidMultiLevelRATARecord.OvemllBiasAdjustmentFactor.
else if (InvalidRATARecord is not null)
Set In validRA TA TestNumber = In validRA TA Record. Test N u mbc r
Set CurrentRATAStatus = CurrentRATAStatus &
if (CurrentMhvParameter == "FLOW")
Set RATA Status BAF = /wva/i7/7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
If (PriorRATAEventRecord is not null)
If (PriorRA TA E vent Record. C o n d i t i o n a 1B eg i n D a t c is not null)
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus for the location
where the SystemID is in A IternateSystemlDList and the EndDate/Hour is prior to the
CurrentDateHour and the EndDate/Hour is after the
PriorRA TAEventRecord. 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 AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.
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 RA TA TestRecordsBy Location ForOAStatus for the
location where the SystemID is in A IternateSystemlDList and the EndDate/Hour is prior
to the CurrentDateHour and the EndDate/Hour is after the
PriorRATAEventRecord.CondiitiomXBQgvaD&tQftiom and the QANeedsEvaluationFlag
is equal to "Y".
if (RATATestRecordsByLocationForQAStatus is found)
Set AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.
Set CurrentRATAStatus = "Prior Alternate System RATA Not Yet Evaluated".
else if (PriorRATARecord is not null)
Locate the most recent record in RA TA TestRecordsBy Location ForOAStatus for the location where the
SystemID is in A IternateSystemlDList and the EndDate/Hour is prior to the CurrentDateHour and the
EndDate/Hour is after the PriorRA 7>1 wy/. E ndDa te/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.
Environmental Protection Agency
Page 947 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
if (A Item ateRA TA Record. Tc s t Re s u 11C ode = null)
Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Has Critical Errors",
else if (A Item ateRA TA Record. Tc s t Re s u 11C ode = "FAILED")
Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Failed",
else if (A Item ateRA TA Record. Tc s t Re s u 11C ode = "ABORTED")
Set CurrentRATAStatus = "OOC-Prior Alternate System RATA Aborted".
else
Locate the most recent record in RA TA TestRecordsBy Location ForQAStatus for the location
where the SystemID is in A IternateSystemlDList and the EndDate/Hour is prior to the
CurrentDateHour and the EndDate/Hour is after the PriorRA TARecord. E ndDa tc/Hour and the
QANeedsEvaluationFlag is equal to "Y".
if (RATATestRecordsByLocationForQAStatus is found)
Set AlternateRATARecord = the found record in
RA TA TestRecordsByLocationForQAStatus.
Set CurrentRATAStatus = "Prior Alternate System RATA Not Yet Evaluated".
If (Current RATA Status begins with "IC" or "Undetermined")
If (PriorRATARecord is null)
Set RATA StatusBAF= 1
else if {CurrentRATAStatus begins with "IC-Cond", "Undetermined-Cond" or "PendingOOC-Cond" AND
( PriorRA TA E vent Record. Q A C c rt E vc n t C ode is in set {40, 50, 51, 100, 101, 120, 125, 151, 250, 255,
300, 305}) OR PriorRA7>1 wy/.TcstRcsu 11Codc does NOT begin with "PASS"))
Set RA TA Status BA F = 1
else if (QaStatusSystemld is NOT equal to PriorRA TARecord. System ID)
Locate the most recent record in RA TA TestRecordsBy Location ForQAStatus for the location where the SystemID
is equal to the QaStatusSystemld, the TestResultCode is NOT equal to "INVALID" and the EndDate/Hour is prior
to the CurrentDateHour
If found,
Set RATA StatusBAF to the OverallBiasAdjustmentFactor in the RATA record found above.
else
Set CurrentRATAStatus to "OOC-No Prior Test or Event".
Locate the most recent record in RA TA TestRecordsBy Location ForQAStatus for the location where the
SystemID is equal to the QaStatusSystemld, the TestResultCode is equal to "INVALID" and the
EndDate/Hour is prior to the CurrentDateHour.
If found,
Set In validRA TA TestNumber to the TestNumber in the RATA record found above.
Set CurrentRATAStatus = CurrentRATAStatus &
Environmental Protection Agency
Page 948 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
else
Set RATA StatusBAF = Pmw7L47)l/te£w
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Results:
Result
Invalid Monitor
System
Invalid Op Data
Missing Op Data
Missing Program
OOC-Conditional
Period Expired
OOC-Conditional
Period Expired*
OOC-Event
OOC-Event*
OOC-Expired
OOC-Expired*
OOC-Incomplete
QARATA
OOC-Incomplete
QARATA*
OOC-Incomplete
Recertification
OOC-Incomplete
Recertification*
OOC-No Prior
Maximum Level
RATA
OOC-No Prior
Maximum Level
RATA*
OOC-No Prior
Test or Event
OOC-No Prior
Test or Event*
OOC-Prior
Alternate System
RATA Aborted
OOC-Prior
Alternate System
RATA Failed
Response
The [testtype] status for [key] could not be determined, because the Monitor System
record for MonitoringSystemID [system] has a critical error.
The [testtype] status for [key] could not be determined, because the OperatingTime in
at least one Hourly Operating Data records was missing or invalid.
The [testtype] status for [key] could not be determined, because the Op Supp Data
record for OPHOURS, OSHOURS, or OPDAYS is missing for
[MISSINGOPDATAINFO] (and possibly other previous reporting periods). If you
have submitted emissions data for prior quarters, you should be able to retrieve these
records by logging on to the EPA host.
The [testtype] status for [key] could not be determined, because a Unit Program record
associated with the initial certification event for QACertEventCode [code]
QACertEventDate [eventdate] either does not exist or has a
UnitMonitorCertificationBeginDate inconsistent with the BeginDate of the associated
Monitor System record.
The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired.
The conditional data period for QACertEventCode [code] QACertEventDate
[eventdate] for SystemID [EVENTKEY] has expired.
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 [SUB SYS] with
TestNumber [subtestnum] was performed at fewer than the required operating levels.
The subsequent recertification RATA for FLOW SystemID [SUB SYS] 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.
A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] was
aborted, so [key], which contains a component that is also in the former system, is
out-of-control.
A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] failed,
so [key], which contains a component that is also in the former system, is
out-of-control.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Environmental Protection Agency
Page 950 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
OOC-Prior
Alternate System
RATA Has
Critical Errors
OOC-Prior
Maximum Level
RATA Aborted
OOC-Prior
Maximum Level
RATA Aborted*
OOC-Prior
Maximum Level
RATA Expired
OOC-Prior
Maximum Level
RATA Expired*
OOC-Prior
Maximum Level
RATA Failed
OOC-Prior
Maximum Level
RATA Failed*
OOC-Prior
Maximum Level
RATA Has
Critical Errors
OOC-Prior
Maximum Level
RATA Has
Critical Errors*
OOC-Prior Test
Aborted
OOC-Prior Test
Aborted*
OOC-Prior Test
Failed
OOC-Prior Test
Failed*
OOC-Prior Test
Has Critical
Errors
OOC-Prior Test
Has Critical
Errors*
OOC-Recertificat
ion Test Aborted
OOC-Recertificat
ion Test Aborted*
OOC-Recertificat
ion Test Failed
OOC-Recertificat
ion Test Failed*
OOC-Recertificat
ion Test Has
Critical Errors
OOC-Recertificat
ion Test Has
Critical Errors*
A prior RATA with TestNumber [alttestnum] for MonitoringSystemID [altsys] has
critical errors, so [key], which contains a component that is also in the former system,
is out-of-control.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] was
aborted.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] was
aborted. An invalid RATA with TestNumber [invtestnum] was ignored.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has
expired.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has
expired. An invalid RATA with TestNumber [invtestnum] was ignored.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed.
Critical Error Level
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] failed. An Critical Error Level
invalid RATA with TestNumber [invtestnum] was ignored.
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has critical Critical Error Level
errors.
The prior [max]-level flow RATA for [key] with TestNumber [maxtestnum] has critical Critical Error Level
errors. An invalid RATA with TestNumber [invtestnum] was ignored.
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was aborted. Critical Error Level
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] was aborted. Critical Error Level
An invalid prior [testtype] with TestNumber [invtestnum] was ignored.
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] failed. Critical Error Level
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] failed. An Critical Error Level
invalid prior [testtype] with TestNumber [invtestnum] was ignored.
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has critical Critical Error Level
errors.
The prior RATA for SystemID [RATASYS] with TestNumber [testnum] has critical Critical Error Level
errors. An invalid prior [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] was aborted.
The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] was aborted. An invalid [testtype] with TestNumber [invtestnum] was
ignored.
The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] failed.
The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] failed. An invalid [testtype] with TestNumber [invtestnum] was ignored.
The subsequent recertification RATA for SystemID [subsys] with TestNumber
[subtestnum] has critical errors.
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
Critical Error Level
The subsequent recertification RATA for SystemID [subsys] with TestNumber Critical Error Level
[subtestnum] has critical errors. An invalid [testtype] with TestNumber [invtestnum]
was ignored.
Environmental Protection Agency
Page 951 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Prior Alternate
System RATA
Not Yet
Evaluated
Prior Maximum
Level RATA Not
Yet Evaluated
Prior Multi-Level
RATA Not Yet
Evaluated
Prior Test Not Yet
Evaluated
Recertification
Test Not Yet
Evaluated
Undetermined-C
onditional Data
The RATA status for [key] could not be determined, because a prior RATA with
TestNumber [alttestnum] for MonitoringSystemID [altsys], which contains a
component that is also in the former system, has not yet been evaluated.
The RATA status for [key] could not be determined, because the prior [max]-level flow
RATA with TestNumber [maxtestnum] has not yet been evaluated.
The RATA status could not be determined, because the prior multi-level flow RATA for
SystemID [RATASYS] with TestNumber [multitestnum] has not yet been evaluated.
The RATA status could not be determined, because the applicable prior RATA for
SystemID [RATASYS] with TestNumber [testnum] has not yet been evaluated.
The RATA status could not be determined, because the subsequent recertification RATA
for SystemID [subsys] with TestNumber [subtestnum] has not yet been evaluated.
The software could not determine if the current hour was within the conditional data
period for QACertEventCode [code] QACertEventDate [eventdate] for SystemID
[eventkey].
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Informational Message
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ C02/02 RATA Status Evaluation
2
Process/Category:
Emissions Data Evaluation Report
H20 RATA Status Evaluation
3
Process/Category:
Emissions Data Evaluation Report
H20M RATA Status Evaluation
4
Process/Category:
Emissions Data Evaluation Report
Hg RATA Status Evaluation
5
Process/Category:
Emissions Data Evaluation Report
NOX RATA Status Evaluation
6
Process/Category:
Emissions Data Evaluation Report
NOXC RATA Status Evaluation
7
Process/Category:
Emissions Data Evaluation Report
NOXR Unused P-PB NOX RATA Status Evaluation
8
Process/Category:
Emissions Data Evaluation Report
S02 RATA Status Evaluation
9
Process/Category:
Emissions Data Evaluation Report
Stack Flow RATA Status Evaluation
Environmental Protection Agency
Page 952 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Category:
Weekly System Integrity Status
Environmental Protection Agency
Page 953 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: WSISTAT-1
Check Name: Initialize Status Checking
Related Former Checks:
Applicability:
Description: Initialized parameters need for status checking.
Specifications:
Set WsiStatus to null.
Set WsiPluginEventRecord to null.
Results:
Result Response
Usage:
1 Process/Category: Emissions Data Evaluation Report ~
Severity
Hg System Integrity Status Evaluation
Environmental Protection Agency
Page 954 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: WSISTAT-2
Check Name: Locate Prior Test
Related Former Checks:
Applicability:
Description: This check locates the test prior to the current hour. If a test was not found it determines whether the status is
OOC because at least 7 total operating days have occurred.
Specifications:
For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.
If (WsiTestDictionary entry exists)
Set Wsi Prior Test Record to Wsi TestDictionary RcccntTcst Record.
Else
Set Wsi Prior Test Record to null.
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hg System Integrity Status Evaluation
Environmental Protection Agency
Page 955 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: WSISTAT-3
Check Name: Check For Intervening Event
Related Former Checks:
Applicability:
Description: Locates an event with codes 110 and 130 and a matching component id, and a test date and hour preceeding
the current hour but after the current test.
Specifications:
Set WsilnterveningEventRecord to null.
If (WsiStatus is equal to null)
Locate the most recent record in QACertificationEventRecords where:
a) ComponentID is equal to QaStatusComponentld.
b) QaCertEventDateHour is prior to CurrentDateHour.
c) QaCertEventDateHour is after Wsi Prior Test Record. Tc s t D a t c H o u r.
d) QaCertEventCode is equal to "110" or "130"
If found
Set WsilnterveningEventRecord to the located record.
Set WsiPluginEventRecord to the located record.
Set WsiStatus to "OOC-Event".
Else
If (WsiPriorTestRecord.TestResultCode is equal to null)
Set WsiStatus to "OOC-Test Has Critical Errors".
Else if (WsiPrior TestRecord .Tc$[Rcsu\{Code is equal to "FAILED")
Set WsiStatus to "OOC-Test Failed".
Else
For the WsiTestDictionary entry where the key is equal to QaStatusComponentld.
If (Wsi /.) i cfw «/j. O p e r a t i n g D a t e L i s t is not null) AND (the count of days in
Wsi /.) i cfw «/j. O p e r a t i n g D a t e L i s t i s greater than 7)
Set WsiStatus to "OOC-Expired".
Else
Set WsiStatus to "IC".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hg System Integrity Status Evaluation
Environmental Protection Agency
Page 956 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: WSISTAT-4
Check Name: Return the Final Status
Related Former Checks:
Applicability:
Description: Returns the value in WSI Result Status as the check result.
Specifications:
If (WsiStatus does not begin with "IC")
return result WsiStatus.
Results:
Result
OOC-Event
OOC-Expired
OOC-No Prior
Test
OOC-Test Failed
OOC-Test Has
Critical Errors
Response
You reported a QA Certification Event record for QACertEventCode [code]
QACertEventDate [event] for [compkey], and have not yet performed the required
recertification tests.
The prior weekly system integrity test for [compkey] on [date] has expired.
You did not report a prior weekly system integrity test for [compkey] during the
reporting period. Any weekly system integrity that may have been completed in a prior
reporting period has expired.
The prior weekly system integrity test for [compkey] completed on [date] failed.
The prior weekly system integrity test for [compkey] completed on [date] has critical
errors.
Severity
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Critical Error Level 1
Usage:
1
Process/Category: Emissions Data Evaluation Report ¦
¦ Hg System Integrity Status Evaluation
Environmental Protection Agency
Page 957 of 959
-------
ECMPS Emissions Check Specifications
3/4/2020 12:00:00AM
Check Code: WSISTAT-5
Check Name: Check for Intervening Like-Kind Event
Related Former Checks:
Applicability: General Check
Description: When a previous test does not exist, this check locates an event with codes 140 and 141 and a matching
component id, and an event date and hour preceeding the current hour. If found and at least seven operating
days occurred between the event and the current hour, an OOC-NoPriorTest occurs. If the event is not found,
and at least seven operating days have occurred since the beginning of the quarter, an OOC-NoPriorTest also
occurs.
Specifications:
Set WsilnterveningLinkKindEventRecord to null.
Locate the most recent record in QACertiflcationEventRecords where:
a) ComponentID is equal to QaStatusComponentld.
b) QaCertEventCode is equal to "140" or "141"
c) QaCertEventDateHour is prior to CurrentDateHour.
d) If Wsi Prior Test Record is NOT equal to null, then QaCertEventDateHour is after Wsi Prior Test Record. Tc s t D a t c H o u r.
If found
Set WsilnterveningLinkKindEventRecord to the located record in QACertiflcationEventRecords.
Set EarliestOperatingDate equal to the day after WsilnterveningLinkKindEventRecord.QaCeriEveniDate.
If (the count of days on or after EarliestOperatingDate in OperatingDateArray for current location is greater than 7)
If Wsi Prior Test Record is equal to null
Set WsiStatus to "OOC-No Prior Test".
Else
Set WsiPluginEventRecord to WsilnterveningLinkKindEventRecord.
Set WsiStatus to "OOC-Event".
Else
Set WsiStatus to "IC-Undetermined".
Else
If Wsi Prior Test Record is equal to null
If QaStatusMatsErbDate is not null, AND QaStatusMatsErbDate is later than QaStatusComponentBeginDate,
Set EarliestOperatingDate equal to the day after QaStatusMatsErbDate .
Else
Set EarliestOperatingDate equal to the day after QaStatusComponentBeginDate.
If (the count of days on or after EarliestOperatingDate in OperatingDateArray for current location is greater than 7)
Set WsiStatus to "OOC-No Prior Test".
Else
Set WsiStatus to "IC-Undetermined".
Results:
Result Response Severity
Usage:
1 Process/Category: Emissions Data Evaluation Report Hg System Integrity Status Evaluation
Environmental Protection Agency
Page 958 of 959
------- |