EMS communication and Voltage optimizations

- Added data for EMS communication
- Added highest segment voltage for charging check
- Added lowest segment voltage for discharging check
This commit is contained in:
Matthias Heisig
2024-05-07 17:10:29 +02:00
parent 327f324be8
commit 0ffff9be2a
11 changed files with 660 additions and 383 deletions

View File

@@ -8,17 +8,17 @@ VAR_INPUT
rPower : REAL;
rReactivePower : REAL := 0.0;
xReset : BOOL;
rMaxBattPower : REAL := 24_000; // 24kW
rMaxBattPower : REAL := 40_000; // 24kW
END_VAR
VAR_OUTPUT
// Output for SCS DC-Relais
//xCloseDCRelais AT %Q*: BOOL;
VAR_OUTPUT
// Inverter active
xActive : BOOL;
// FB error
xError : BOOL;
// Heartbeat ok signal
xHeartbeatOk : BOOL := TRUE;
// Current inverter values
stCurrentValues : ST_SUNSPEC_CURRENT_VALUES;
@@ -103,9 +103,22 @@ VAR
// Inverter reset errors command
_uiResetInverter : UINT := 1;
// PLC -> Inverter heartbeat
_uiPLCToInverterCounter : UINT;
// Inverter -> PLC heartbeat
_uiInverterToPLCCounter : UINT;
_uiInverterToPLCCounterOld : UINT;
// Flag to check if inverter has incremented the heartbeat counter
_xInverterHBCounterIncremented : BOOL := TRUE;
// Inverter alarm
_fbErrorInverterAlarm : Fb_TcAlarm;
// Heartbeat timeout
_tonHeartbeatTimeout : TON;
_sName : STRING;
END_VAR
@@ -181,6 +194,12 @@ VAR CONSTANT
// Error bits register
// Size 2
EVT_1_REGISTER : WORD := 40110;
// PLC -> Inverter Heartbeat register
CONTROLLER_HB : WORD := 40229;
// Inverter -> PLC heartbeat register
PCS_HB : WORD := 40228;
END_VAR
]]></Declaration>
<Implementation>
@@ -200,7 +219,6 @@ CASE _iState OF
// If enable and INTLK Ok
IF xEnable THEN
_iState := 10;
//xCloseDCRelais := TRUE;
_tonPollingTimer(IN := FALSE, PT := _timPollingDelay);
ELSE
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
@@ -211,6 +229,7 @@ CASE _iState OF
_iState := 1;
END_IF
1: // Read inverter status
_fbReadRegister(
sIPAddr:= sInverterIPAddr,
@@ -237,6 +256,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
2: // IF inverter is not in STANDYB(8) STATE, send command to shutdown inverter
IF (_uiInverterState = 8) OR (_uiInverterState = 1) THEN
_iState := 3;
@@ -245,6 +265,7 @@ CASE _iState OF
_iState := 200;
END_IF
3: // Read current DC values
_iErrorInState := _iState;
_fbReadRegister(
@@ -277,6 +298,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
4: // Read current ac values
_iErrorInState := _iState;
_fbReadRegister(
@@ -299,7 +321,7 @@ CASE _iState OF
// If there was no error and the converter has no error continue
IF NOT _fbReadRegister.bError THEN
// Go back to polling state
_iState := 0;
_iState := 5;
stCurrentValues.rActACPower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[0]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[1])));
stCurrentValues.rActACFreq := LREAL_TO_REAL(WORD_TO_UINT(_awCurrentACValues[2]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[3])));
stCurrentValues.rActApparentPower := LREAL_TO_REAL(WORD_TO_INT(_awCurrentACValues[4]) * EXPT(10,WORD_TO_INT(_awCurrentACValues[5])));
@@ -313,6 +335,75 @@ CASE _iState OF
END_IF
5: // Send heartbeat signal
_uiPLCToInverterCounter := _uiPLCToInverterCounter + 1;
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= CONTROLLER_HB,
cbLength:= SIZEOF(_uiPLCToInverterCounter),
pSrcAddr:= ADR(_uiPLCToInverterCounter),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_iState := 6;
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
6: // Check heartbeat signal
_fbReadRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= PCS_HB,
cbLength:= SIZEOF(_uiInverterToPLCCounter),
pDestAddr:= ADR(_uiInverterToPLCCounter),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
IF NOT _fbReadRegister.bBusy THEN
IF (NOT _fbReadRegister.bError) THEN
// Check if counter has been incremented by the inverter
IF (_uiInverterToPLCCounter - _uiInverterToPLCCounterOld) > 0 THEN
_xInverterHBCounterIncremented := TRUE;
// Safe old value
_uiInverterToPLCCounterOld := _uiInverterToPLCCounter;
ELSE
_xInverterHBCounterIncremented := FALSE;
END_IF
_iState := 0;
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbReadRegister(bExecute := FALSE);
END_IF
10: // Wait for inverter to be online and in state STANDBY(8)
_fbReadRegister(
@@ -351,6 +442,7 @@ CASE _iState OF
_iState := 0;
END_IF
15: // Delay polling inverter ready
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
IF _tonPollingTimer.Q THEN
@@ -400,6 +492,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
25: // Read inverter Max power limit scaling
_iErrorInState := _iState;
_fbReadRegister(
@@ -435,6 +528,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
26: // Read inverter scaling factor for reactive power
_iErrorInState := _iState;
_fbReadRegister(
@@ -506,6 +600,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
40: // Set power limit
_iErrorInState := _iState;
_fbWriteRegister(
@@ -569,6 +664,7 @@ CASE _iState OF
_fbWriteRegister(bExecute := FALSE);
END_IF
42: // Enable reactive power percent limiting
_iErrorInState := _iState;
_fbWriteRegister(
@@ -599,32 +695,6 @@ CASE _iState OF
END_IF
// 45: // Read set power
// _fbReadRegister(
// sIPAddr:= sInverterIPAddr,
// nTCPPort:= 502,
// nUnitID:= 16#FF, // 16#FF for Modbus TCP
// nQuantity:= 1,
// nMBAddr:= W_MAX_LIM_PCT_REGISTER,
// cbLength:= SIZEOF(_iWMaxLimPctRead),
// pDestAddr:= ADR(_iWMaxLimPctRead),
// bExecute:= TRUE,
// tTimeout:= T#5S,
// bBusy=> ,
// bError=> ,
// nErrId=> ,
// cbRead=> );
// // Check if reading mudbus register is done
// IF NOT _fbReadRegister.bBusy THEN
// IF NOT _fbReadRegister.bError THEN
// _iWMaxLimPctReadScaled := LREAL_TO_INT(_rWMax * _iWMaxLimPctRead * EXPT(10,_iWMaxLimPctSF)*0.01);
// _iState := 50;
// END_IF
// _fbReadRegister(bExecute := FALSE);
// END_IF
50: // Enable Power limiting (THROTTLED)
_iErrorInState := _iState;
_fbWriteRegister(
@@ -655,6 +725,7 @@ CASE _iState OF
_fbWriteRegister(bExecute := FALSE);
END_IF
51: // Go to started
_iErrorInState := _iState;
_fbWriteRegister(
@@ -713,6 +784,7 @@ CASE _iState OF
_fbWriteRegister(bExecute := FALSE);
END_IF
65: // Wait for polling timer
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
IF _tonPollingTimer.Q THEN
@@ -733,6 +805,7 @@ CASE _iState OF
_iState := 200;
END_IF
70: // Enabled, check for error
_iErrorInState := _iState;
_fbReadRegister(
@@ -769,6 +842,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
80: // Read current DC values
_iErrorInState := _iState;
_fbReadRegister(
@@ -801,6 +875,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
85: // Read current ac values
_iErrorInState := _iState;
_fbReadRegister(
@@ -836,6 +911,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
90: // Read current inverter status
_fbReadRegister(
sIPAddr:= sInverterIPAddr,
@@ -855,7 +931,7 @@ CASE _iState OF
// Check if reading mudbus register is done
IF NOT _fbReadRegister.bBusy THEN
IF NOT _fbReadRegister.bError THEN
_iState := 65;
_iState := 91;
stCurrentValues.uiStatus := _uiInverterState;
ELSE
// Read error register
@@ -864,6 +940,77 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
91: // Send heartbeat signal
_uiPLCToInverterCounter := _uiPLCToInverterCounter + 1;
_iErrorInState := _iState;
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= CONTROLLER_HB,
cbLength:= SIZEOF(_uiPLCToInverterCounter),
pSrcAddr:= ADR(_uiPLCToInverterCounter),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> );
// If writing modbus register is done
IF NOT _fbWriteRegister.bBusy THEN
// And there is no error, then continue
IF NOT _fbWriteRegister.bError THEN
_iState := 92;
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbWriteRegister(bExecute := FALSE);
END_IF
92: // Check heartbeat signal
_fbReadRegister(
sIPAddr:= sInverterIPAddr,
nTCPPort:= 502,
nUnitID:= 16#FF, // 16#FF for Modbus TCP
nQuantity:= 1,
nMBAddr:= PCS_HB,
cbLength:= SIZEOF(_uiInverterToPLCCounter),
pDestAddr:= ADR(_uiInverterToPLCCounter),
bExecute:= TRUE,
tTimeout:= T#5S,
bBusy=> ,
bError=> ,
nErrId=> ,
cbRead=> );
IF NOT _fbReadRegister.bBusy THEN
IF (NOT _fbReadRegister.bError) THEN
// Check if counter has been incremented by the inverter
IF (_uiInverterToPLCCounter - _uiInverterToPLCCounterOld) > 0 THEN
_xInverterHBCounterIncremented := TRUE;
// Safe old value
_uiInverterToPLCCounterOld := _uiInverterToPLCCounter;
ELSE
_xInverterHBCounterIncremented := FALSE;
END_IF
_iState := 65;
ELSE
xError := TRUE;
// Goto error state
_iState := 1000;
END_IF
_fbReadRegister(bExecute := FALSE);
END_IF
200: // Shutdown sequence
_iErrorInState := _iState;
_fbWriteRegister(
@@ -892,6 +1039,7 @@ CASE _iState OF
_fbWriteRegister(bExecute := FALSE);
END_IF
210: // Wait for poll timer to
_tonPollingTimer(IN := TRUE, PT := _timPollingDelay);
IF _tonPollingTimer.Q THEN
@@ -899,6 +1047,7 @@ CASE _iState OF
_iState := 220;
END_IF
220: // Poll and wait for standby state
_iErrorInState := _iState;
_fbReadRegister(
@@ -927,6 +1076,7 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
990: // Read error register
_iErrorInState := _iState;
_fbReadRegister(
@@ -953,11 +1103,13 @@ CASE _iState OF
_fbReadRegister(bExecute := FALSE);
END_IF
1000: // Error state, wait for reset
IF xReset AND (NOT xEnable) THEN
_iState := 1010;
END_IF
1010: // Try to clear all latched events
_fbWriteRegister(
sIPAddr:= sInverterIPAddr,
@@ -980,6 +1132,27 @@ CASE _iState OF
END_IF
END_CASE
// ===============================
// Heartbeat check
// ===============================
_tonHeartbeatTimeout(IN := (NOT _xInverterHBCounterIncremented), PT := T#5S);
// Reset heartbeat ok signal
IF xReset AND (NOT _tonHeartbeatTimeout.Q) THEN
xHeartbeatOk := TRUE;
END_IF
// Check for heartbeat
IF _tonHeartbeatTimeout.Q THEN
xHeartbeatOk := FALSE;
END_IF
// ===============================
// Inverter alarm handling
// ===============================
IF xError AND (NOT _fbErrorInverterAlarm.bRaised) THEN
_fbErrorInverterAlarm.Raise(0);
END_IF
@@ -1012,14 +1185,16 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineIds Name="FB_PowerSupplySunspec">
<LineId Id="774" Count="10" />
<LineId Id="1550" Count="0" />
<LineId Id="785" Count="4" />
<LineId Id="785" Count="3" />
<LineId Id="2615" Count="0" />
<LineId Id="790" Count="0" />
<LineId Id="2614" Count="0" />
<LineId Id="2613" Count="0" />
<LineId Id="2616" Count="1" />
<LineId Id="2906" Count="0" />
<LineId Id="2618" Count="3" />
<LineId Id="2618" Count="2" />
<LineId Id="3661" Count="0" />
<LineId Id="2621" Count="0" />
<LineId Id="2623" Count="15" />
<LineId Id="2622" Count="0" />
<LineId Id="2639" Count="0" />
@@ -1029,15 +1204,33 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="2642" Count="0" />
<LineId Id="2721" Count="0" />
<LineId Id="2640" Count="0" />
<LineId Id="2645" Count="1" />
<LineId Id="2645" Count="0" />
<LineId Id="3660" Count="0" />
<LineId Id="2646" Count="0" />
<LineId Id="2648" Count="1" />
<LineId Id="2651" Count="0" />
<LineId Id="2722" Count="0" />
<LineId Id="2652" Count="0" />
<LineId Id="2650" Count="0" />
<LineId Id="2653" Count="0" />
<LineId Id="2656" Count="64" />
<LineId Id="2654" Count="1" />
<LineId Id="3659" Count="0" />
<LineId Id="2656" Count="31" />
<LineId Id="3658" Count="0" />
<LineId Id="2688" Count="32" />
<LineId Id="2654" Count="0" />
<LineId Id="3422" Count="2" />
<LineId Id="3438" Count="0" />
<LineId Id="3440" Count="19" />
<LineId Id="3464" Count="5" />
<LineId Id="3439" Count="0" />
<LineId Id="3425" Count="0" />
<LineId Id="3474" Count="0" />
<LineId Id="3426" Count="0" />
<LineId Id="3475" Count="12" />
<LineId Id="2655" Count="0" />
<LineId Id="3488" Count="0" />
<LineId Id="3607" Count="19" />
<LineId Id="3489" Count="0" />
<LineId Id="2647" Count="0" />
<LineId Id="791" Count="22" />
<LineId Id="1701" Count="5" />
@@ -1047,7 +1240,9 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="1715" Count="0" />
<LineId Id="1718" Count="0" />
<LineId Id="1716" Count="1" />
<LineId Id="1707" Count="1" />
<LineId Id="1707" Count="0" />
<LineId Id="3657" Count="0" />
<LineId Id="1708" Count="0" />
<LineId Id="1710" Count="2" />
<LineId Id="1709" Count="0" />
<LineId Id="1713" Count="0" />
@@ -1059,10 +1254,14 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="1433" Count="0" />
<LineId Id="816" Count="28" />
<LineId Id="1171" Count="0" />
<LineId Id="845" Count="33" />
<LineId Id="845" Count="5" />
<LineId Id="3656" Count="0" />
<LineId Id="851" Count="27" />
<LineId Id="1172" Count="0" />
<LineId Id="879" Count="4" />
<LineId Id="1981" Count="1" />
<LineId Id="1981" Count="0" />
<LineId Id="3655" Count="0" />
<LineId Id="1982" Count="0" />
<LineId Id="1991" Count="0" />
<LineId Id="1993" Count="12" />
<LineId Id="1992" Count="0" />
@@ -1072,7 +1271,9 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="1983" Count="0" />
<LineId Id="884" Count="28" />
<LineId Id="1173" Count="0" />
<LineId Id="913" Count="28" />
<LineId Id="913" Count="5" />
<LineId Id="3654" Count="0" />
<LineId Id="919" Count="22" />
<LineId Id="2024" Count="1" />
<LineId Id="942" Count="0" />
<LineId Id="1174" Count="0" />
@@ -1081,45 +1282,50 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="1934" Count="18" />
<LineId Id="1955" Count="5" />
<LineId Id="1933" Count="0" />
<LineId Id="2030" Count="1" />
<LineId Id="2030" Count="0" />
<LineId Id="3653" Count="0" />
<LineId Id="2031" Count="0" />
<LineId Id="2033" Count="25" />
<LineId Id="2032" Count="0" />
<LineId Id="1932" Count="0" />
<LineId Id="1520" Count="0" />
<LineId Id="1522" Count="17" />
<LineId Id="1541" Count="0" />
<LineId Id="1548" Count="0" />
<LineId Id="1542" Count="2" />
<LineId Id="1521" Count="0" />
<LineId Id="1493" Count="0" />
<LineId Id="3639" Count="0" />
<LineId Id="948" Count="23" />
<LineId Id="1175" Count="0" />
<LineId Id="972" Count="4" />
<LineId Id="2907" Count="1" />
<LineId Id="2907" Count="0" />
<LineId Id="3640" Count="0" />
<LineId Id="2908" Count="0" />
<LineId Id="2969" Count="18" />
<LineId Id="3031" Count="0" />
<LineId Id="2988" Count="5" />
<LineId Id="2909" Count="0" />
<LineId Id="2996" Count="0" />
<LineId Id="977" Count="37" />
<LineId Id="977" Count="28" />
<LineId Id="3641" Count="0" />
<LineId Id="1006" Count="8" />
<LineId Id="1560" Count="1" />
<LineId Id="1015" Count="3" />
<LineId Id="1127" Count="0" />
<LineId Id="1019" Count="25" />
<LineId Id="1019" Count="3" />
<LineId Id="3642" Count="0" />
<LineId Id="1023" Count="21" />
<LineId Id="1097" Count="1" />
<LineId Id="1100" Count="1" />
<LineId Id="1099" Count="0" />
<LineId Id="1045" Count="0" />
<LineId Id="1176" Count="0" />
<LineId Id="2723" Count="0" />
<LineId Id="1046" Count="6" />
<LineId Id="1046" Count="5" />
<LineId Id="3643" Count="0" />
<LineId Id="1052" Count="0" />
<LineId Id="1063" Count="20" />
<LineId Id="1090" Count="0" />
<LineId Id="1092" Count="0" />
<LineId Id="1775" Count="0" />
<LineId Id="1084" Count="4" />
<LineId Id="1062" Count="0" />
<LineId Id="1736" Count="1" />
<LineId Id="1736" Count="0" />
<LineId Id="3644" Count="0" />
<LineId Id="1737" Count="0" />
<LineId Id="1739" Count="19" />
<LineId Id="1781" Count="0" />
<LineId Id="1759" Count="2" />
@@ -1127,7 +1333,9 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="1776" Count="1" />
<LineId Id="1762" Count="4" />
<LineId Id="1738" Count="0" />
<LineId Id="3213" Count="1" />
<LineId Id="3213" Count="0" />
<LineId Id="3645" Count="0" />
<LineId Id="3214" Count="0" />
<LineId Id="3216" Count="15" />
<LineId Id="3215" Count="0" />
<LineId Id="3232" Count="0" />
@@ -1137,24 +1345,46 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="3235" Count="0" />
<LineId Id="3239" Count="0" />
<LineId Id="3233" Count="0" />
<LineId Id="1093" Count="1" />
<LineId Id="3529" Count="0" />
<LineId Id="3646" Count="0" />
<LineId Id="3531" Count="47" />
<LineId Id="3590" Count="0" />
<LineId Id="3593" Count="9" />
<LineId Id="3591" Count="0" />
<LineId Id="3603" Count="0" />
<LineId Id="3605" Count="1" />
<LineId Id="3604" Count="0" />
<LineId Id="3592" Count="0" />
<LineId Id="3588" Count="1" />
<LineId Id="3530" Count="0" />
<LineId Id="1093" Count="0" />
<LineId Id="3647" Count="0" />
<LineId Id="1094" Count="0" />
<LineId Id="1102" Count="24" />
<LineId Id="1054" Count="0" />
<LineId Id="1295" Count="4" />
<LineId Id="1295" Count="0" />
<LineId Id="3648" Count="0" />
<LineId Id="1296" Count="3" />
<LineId Id="1128" Count="0" />
<LineId Id="1300" Count="1" />
<LineId Id="3649" Count="0" />
<LineId Id="1129" Count="0" />
<LineId Id="1132" Count="20" />
<LineId Id="1163" Count="0" />
<LineId Id="1294" Count="0" />
<LineId Id="1161" Count="1" />
<LineId Id="1130" Count="1" />
<LineId Id="3650" Count="0" />
<LineId Id="1055" Count="0" />
<LineId Id="1177" Count="20" />
<LineId Id="1199" Count="1" />
<LineId Id="1169" Count="0" />
<LineId Id="1265" Count="2" />
<LineId Id="1269" Count="3" />
<LineId Id="1265" Count="0" />
<LineId Id="3651" Count="0" />
<LineId Id="1266" Count="1" />
<LineId Id="1269" Count="2" />
<LineId Id="3652" Count="0" />
<LineId Id="1272" Count="0" />
<LineId Id="1274" Count="11" />
<LineId Id="1273" Count="0" />
<LineId Id="1289" Count="1" />
@@ -1162,6 +1392,18 @@ _fbErrorInverterAlarm.ipArguments.Clear().AddString(_sName);]]></ST>
<LineId Id="2235" Count="0" />
<LineId Id="1291" Count="1" />
<LineId Id="12" Count="0" />
<LineId Id="3629" Count="1" />
<LineId Id="3628" Count="0" />
<LineId Id="3631" Count="1" />
<LineId Id="3524" Count="0" />
<LineId Id="3633" Count="0" />
<LineId Id="3525" Count="3" />
<LineId Id="3516" Count="0" />
<LineId Id="3627" Count="0" />
<LineId Id="3521" Count="2" />
<LineId Id="3635" Count="1" />
<LineId Id="3634" Count="0" />
<LineId Id="3637" Count="1" />
<LineId Id="2418" Count="0" />
<LineId Id="2417" Count="0" />
<LineId Id="2419" Count="1" />