Started Modbus Master for Levitronix Pumps and Flow sensors

This commit is contained in:
2026-03-09 18:45:56 +01:00
parent e994e9970c
commit 218d815380
11 changed files with 550 additions and 215 deletions

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Levi_ChDStatus" Id="{d1bf4f7b-9f39-4e8d-86cd-899174d80a62}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_Levi_ChDStatus :
STRUCT
// Detected bubble in sensor. Stays active while bubble detect hold time
bBubbleDetected : BIT;
// Sensor signal is abnormal. (Empty sensor, unplugged sensor, too many bubbles)
bMeasError : BIT;
// Reverse flow
bReverseFlow : BIT;
// Combination of Full scale and Volume Pulse setting is invalid
bVolCntPulseSetError : BIT;
// Zero Adjustment is in progress
bZeroAdjActive : BIT;
// 0: Last Zero Adjustment was successful
// 1: Last Zero Adjustment was not successful because sensor was empty or there were too many bubbles in sensor.
bZeroAdjErr : BIT;
// Parameter set mode active. Settings can be written to Hold register
bSetModeActive : BIT;
// EEPROM writing active
bEEPROMWriting : BIT;
// Measured flow is higher than Alarm High level
bFlowAlarmHigh : BIT;
// Measured flow is lower than Alarm Low level
bFlowAlarmLow : BIT;
// Volume Counter is greater than Volume Counter Alarm H limit (Volume Counter Alarm enabled)
bVolCntAlarmH : BIT;
// Volume Counter is greater than Volume Counter Alarm HH limit (Volume Counter Alarm enabled)
bVolCntAlarmHH : BIT;
// Analog or digital test output is active.
bOutputTest : BIT;
// EEPROM error active
bEEPROMErr : BIT;
// Short circuit detected
bShortCircuit : BIT;
// Device is in firmware download mode
bFirmwareUpdateAct : BIT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Levi_ChData" Id="{7bd2984e-f05d-431f-83f1-90d65fb7d1bc}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_Levi_ChData :
STRUCT
stStatus : ST_Levi_ChDStatus;
siCurrFlow : SINT;
dwPulseCounter : DWORD;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Levi_Flowsensor" Id="{650b4e84-15bc-4cc6-bda5-d5ab333779ee}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Levi_LFC6IO
VAR_INPUT
// Base station address
byBaseAddr : BYTE;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_IN_OUT
// Modbus master comm fb
fbMBMaster : ModbusRtuMasterV2_KL6x22B;
END_VAR
VAR_OUTPUT
// Current flowrate in ml/min
rCurrFlowrate : ARRAY[0..5] OF REAL;
xBusy : BOOL;
xDone : BOOL;
xError : BOOL;
END_VAR
VAR
// Full scale value of all channels in ml/min
_dwFullScale : DWORD;
// Channel data
_astChannelData : ARRAY[0..5] OF ST_Levi_ChData;
// Temporary data storage for writing settings
_awTempData : ARRAY[0..1] OF WORD;
// State machine state
_iState : INT;
// Internal commands
_eCmd : (NONE, SET_FULL_SCALE, );
END_VAR
VAR CONSTANT
REG_SET_MODE : WORD := 0;
REG_FULL_SCALE : WORD := 2;
REG_CH_DATA : WORD := 0;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[CASE _iState OF
// Wait for Modbus master to be ready
0:
IF (NOT fbMBMaster.BUSY)THEN
// Get full scale value for later flow calculation
fbMBMaster.UnitID := byBaseAddr;
fbMBMaster.MBAddr := REG_FULL_SCALE;
fbMBMaster.Quantity := 2;
fbMBMaster.cbLength := SIZEOF(_dwFullScale);
fbMBMaster.pMemoryAddr := ADR(_dwFullScale);
_iState := 10;
END_IF
// Wait for reading done
10:
fbMBMaster.ReadRegs();
IF (NOT fbMBMaster.BUSY) THEN
_iState := 20;
END_IF
IF fbMBMaster.Error THEN
_iState := 900;
END_IF
// Poll channel data
20:
IF THEN
fbMBMaster.UnitID := byBaseAddr;
fbMBMaster.MBAddr := REG_CH_DATA;
fbMBMaster.Quantity := 24;
fbMBMaster.cbLength := SIZEOF(_astChannelData);
fbMBMaster.pMemoryAddr := ADR(_astChannelData);
// Call once to set MB Master to busy
fbMBMaster.ReadInputRegs();
_iState := 21;
ELSIF (_eCmd <> NONE) AND (NOT fbMBMaster.BUSY) THEN
_iState := 30;
END_IF
// Wait for response
21:
fbMBMaster.ReadInputRegs();
IF (NOT fbMBMaster.BUSY) THEN
// Calculate output flowrates
M_CalcOutputData();
_iState := 20;
END_IF
IF fbMBMaster.Error THEN
_iState := 900;
END_IF
// Command handling -> Set mode
30:
// Set bit 1 to 1 for Set Mode
_awTempData[0] := 2#10;
fbMBMaster.UnitID := byBaseAddr;
fbMBMaster.MBAddr := REG_SET_MODE;
fbMBMaster.Quantity := 1;
fbMBMaster.cbLength := 2;
fbMBMaster.pMemoryAddr := ADR(_awTempData[0]);
// Error state
900:
IF xConfirmAlarms THEN
xError := FALSE;
_iState := 0;
END_IF
END_CASE]]></ST>
</Implementation>
<Method Name="M_CalcOutputData" Id="{5b932e1a-1437-4032-adb5-2eae4b98574c}">
<Declaration><![CDATA[METHOD PRIVATE M_CalcOutputData
VAR
i : int;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[FOR i := 0 TO 5 DO
// Current flowrate from channel data is in % of full scale (-30.000 ~ 30.000 => (-300 ~ +300) %
// _Full scale is in l/min but scaling is as followed: 10 ~ 500000 => (0.010 ~ 500) l/min => (10 ~ 500.000) ml/min
// Result is in ml/min
rCurrFlowrate[i] := (SINT_TO_REAL(_astChannelData[i].siCurrFlow) * DWORD_TO_REAL(_dwFullScale)) / 10_000;
END_FOR
]]></ST>
</Implementation>
</Method>
<Method Name="M_ReadSensorData" Id="{2cd73435-5e66-4519-8bdc-106eb3093539}">
<Declaration><![CDATA[METHOD M_ReadSensorData : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF xBusy THEN
M_ReadSensorData := FALSE;
RETURN;
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="M_SetFullScale" Id="{ee32b999-71fe-4e16-ab8c-09e92e1f41ef}">
<Declaration><![CDATA[METHOD M_SetFullScale : BOOL
VAR_INPUT
// Full scale in ml/min
siFullScale : SINT;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -34,6 +34,9 @@ VAR
// (9) Filmetch // (9) Filmetch
_fbTankFilmetch : FB_Tank; _fbTankFilmetch : FB_Tank;
// Flowsensors
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="E_Modbus_Cmd" Id="{750955bf-9dc1-4cb7-bee0-c1c010c28bac}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'strict'}
{attribute 'to_string'}
TYPE E_Modbus_Cmd :
(
NONE := 0,
READ_HOLDING,
READ_INPUTS,
WRITE_HOLDING
);
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_ModbusMaster" Id="{90292ada-f5b3-4b38-a85e-d6dc52e68612}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_ModbusMaster
VAR_INPUT
timGapTime : TIME := T#20MS;
END_VAR
VAR_OUTPUT
xBusy : BOOL;
END_VAR
VAR
// Modbus master comm fb
_fbMaster : ModbusRtuMasterV2_KL6x22B;
// Request queue
_astReqQueue : ARRAY[0..(GVL_ModbusMaster.QUEUE_SIZE - 1)] OF ST_Modbus_Req;
_iHead : INT := 0;
_iTail : INT := 0;
// Current request from queue
_stCurrReq : ST_Modbus_Req;
// Gap timer so that we dont send requests back to back
_tonGapTimer : TON;
// State machine state
_iState : INT := 0;
// Rerun flag for faster state machine
_xSMCycleDone : BOOL := TRUE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Main state machine
REPEAT
// Safety reset
_xSMCycleDone := TRUE;
CASE _iState OF
// Wait for gap timer to be expired
0:
_tonGapTimer(IN := TRUE);
IF _tonGapTimer.Q THEN
_tonGapTimer(IN := FALSE);
_xSMCycleDone := FALSE;
_iState := 1;
END_IF
// Get next request if there is one in the queue
1:
// Get next request from queue if there is one
IF M_Dequeue() THEN
// Set fb data
_fbMaster.UnitID := _stCurrReq.bySlaveAddr;
_fbMaster.MBAddr := _stCurrReq.wStartAddr;
_fbMaster.Quantity := _stCurrReq.wQuantity;
_fbMaster.cbLength := _stCurrReq.wDataSize;
_fbMaster.pMemoryAddr := _stCurrReq.pvData;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
_iState := 10;
END_IF
// Execute dequeued command
10:
// Call modbus master corresponding function
CASE _stCurrReq.eCmd OF
E_Modbus_Cmd.READ_HOLDING:
_fbMaster.ReadRegs();
E_Modbus_Cmd.READ_INPUTS:
_fbMaster.ReadInputRegs();
E_Modbus_Cmd.WRITE_HOLDING:
_fbMaster.WriteRegs();
// Reject unknown commands
ELSE
_stCurrReq.pxError^ := TRUE;
_iState := 0;
END_CASE
// Wait for fb to be done
IF (NOT _fbMaster.BUSY) THEN
_stCurrReq.pxDone^ := TRUE;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
_iState := 0;
END_IF
IF _fbMaster.Error THEN
_stCurrReq.pxError^ := TRUE;
// Rerun statemachine this cycle
_xSMCycleDone := FALSE;
_iState := 0;
END_IF
END_CASE
// Check if we want to rerun the state machine
UNTIL _xSMCycleDone
END_REPEAT
]]></ST>
</Implementation>
<Method Name="M_Dequeue" Id="{083aa9a5-ac23-4366-b080-ab00cfa6b4ce}">
<Declaration><![CDATA[METHOD PRIVATE M_Dequeue : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// No entries in queue
IF _iHead = _iTail THEN
M_Dequeue := FALSE;
ELSE
// Get next entry
_stCurrReq := _astReqQueue;
_iHead := (_iHead + 1) MOD GVL_ModbusMaster.QUEUE_SIZE;
M_Dequeue := TRUE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Enqueue" Id="{37963eb3-9b4c-4945-ba35-cfefd78cb427}">
<Declaration><![CDATA[METHOD M_Enqueue : BOOL
VAR_INPUT
stReq : ST_Modbus_Req;
END_VAR
VAR
_iNextTail : INT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Calculate next entry
_iNextTail := (_iTail + 1) MOD GVL_ModbusMaster.QUEUE_SIZE;
// If next tail euqals head, the buffer is full
// so disgard this request
IF _iNextTail = _iHead THEN
M_Enqueue := FALSE;
ELSE
_astReqQueue[_iNextTail] := stReq;
_iTail := _iNextTail;
M_Enqueue := TRUE;
END_IF]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<GVL Name="GVL_ModbusMaster" Id="{ea0aca47-a85c-4c28-9c28-281101181bed}">
<Declaration><![CDATA[{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
QUEUE_SIZE : INT := 10;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Modbus_Req" Id="{6734b81c-4e20-45e9-85c3-05db86b740c0}">
<Declaration><![CDATA[TYPE ST_Modbus_Req :
STRUCT
bySlaveAddr : BYTE;
eCmd : E_Modbus_Cmd;
wStartAddr : WORD;
wQuantity : WORD;
pvData : PVOID;
wDataSize : WORD;
pxDone : POINTER TO BOOL;
pxError : POINTER TO BOOL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -185,6 +185,15 @@
<Compile Include="01_Stationen\MediaStation\DUTs\ST_HMI_Tank.TcDUT"> <Compile Include="01_Stationen\MediaStation\DUTs\ST_HMI_Tank.TcDUT">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_Levi_ChData.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\DUTs\ST_Levi_ChDStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\FB_Levi_Flowsensor.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\MediaStation\POUs\FB_MediaCabinet.TcPOU"> <Compile Include="01_Stationen\MediaStation\POUs\FB_MediaCabinet.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@@ -235,6 +244,19 @@
<SubType>Code</SubType> <SubType>Code</SubType>
<LinkAlways>true</LinkAlways> <LinkAlways>true</LinkAlways>
</Compile> </Compile>
<Compile Include="LibraryCandidates\ModbusMaster\E_Modbus_Cmd.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\ModbusMaster\FB_ModbusMaster.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\ModbusMaster\GVL_ModbusMaster.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="LibraryCandidates\ModbusMaster\ST_Modbus_Req.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLCmd.TcDUT"> <Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLCmd.TcDUT">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@@ -383,6 +405,7 @@
<Folder Include="00_Main" /> <Folder Include="00_Main" />
<Folder Include="LibraryCandidates" /> <Folder Include="LibraryCandidates" />
<Folder Include="GVLs" /> <Folder Include="GVLs" />
<Folder Include="LibraryCandidates\ModbusMaster" />
<Folder Include="LibraryCandidates\PackML\DUTs" /> <Folder Include="LibraryCandidates\PackML\DUTs" />
<Folder Include="LibraryCandidates\PackML\DUTs\PackTags" /> <Folder Include="LibraryCandidates\PackML\DUTs\PackTags" />
<Folder Include="LibraryCandidates\PackML\POUs" /> <Folder Include="LibraryCandidates\PackML\POUs" />
@@ -443,6 +466,10 @@
<SystemLibrary>true</SystemLibrary> <SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid> <ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference> </PlaceholderReference>
<PlaceholderReference Include="Tc2_ModbusRTU">
<DefaultResolution>Tc2_ModbusRTU, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_ModbusRTU</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Standard"> <PlaceholderReference Include="Tc2_Standard">
<DefaultResolution>Tc2_Standard, * (Beckhoff Automation GmbH)</DefaultResolution> <DefaultResolution>Tc2_Standard, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Standard</Namespace> <Namespace>Tc2_Standard</Namespace>
@@ -639,7 +666,7 @@
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type> <Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type> <Type n="String">System.String</Type>
</TypeList> </TypeList>
</XmlArchive> </XmlArchive>
</PlcProjectOptions> </PlcProjectOptions>
</ProjectExtensions> </ProjectExtensions>
</Project> </Project>

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,22 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.5.2 Chrome/142.0.7444.265 Electron/39.6.1 Safari/537.36" version="29.5.2" pages="5"> <mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.1 Chrome/142.0.7444.265 Electron/39.8.0 Safari/537.36" version="29.6.1" pages="5">
<diagram name="Complete_SM" id="ftpb_kXLDtCrtDVQ6dMH"> <diagram name="Complete_SM" id="ftpb_kXLDtCrtDVQ6dMH">
<mxGraphModel dx="1203" dy="1022" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <mxGraphModel dx="2946" dy="1201" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root> <root>
<mxCell id="0" /> <mxCell id="0" />
<mxCell id="1" parent="0" /> <mxCell id="HZ1lZV176OuICY9gLn3O-1" parent="0" style="locked=1;" value="Unbenannte Ebene" />
<mxCell id="QfHmVZ-q5NNlDkDn7R8m-1" parent="HZ1lZV176OuICY9gLn3O-1" style="shape=corner;whiteSpace=wrap;html=1;dx=490;dy=440;rounded=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="535" width="840" x="20" y="60" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--59" parent="HZ1lZV176OuICY9gLn3O-1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" value="" vertex="1">
<mxGeometry height="400" width="800" x="40" y="80" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--48" parent="HZ1lZV176OuICY9gLn3O-1" style="rounded=1;whiteSpace=wrap;html=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="280" width="160" x="340" y="120" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--44" parent="HZ1lZV176OuICY9gLn3O-1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" value="" vertex="1">
<mxGeometry height="160" width="120" x="360" y="220" as="geometry" />
</mxCell>
<mxCell id="1" parent="0" value="States" />
<mxCell id="ETDFhSajcz1UCc398qXm-1" edge="1" parent="1" source="QfHmVZ-q5NNlDkDn7R8m-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.96;exitY=0.823;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--51"> <mxCell id="ETDFhSajcz1UCc398qXm-1" edge="1" parent="1" source="QfHmVZ-q5NNlDkDn7R8m-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.96;exitY=0.823;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--51">
<mxGeometry relative="1" as="geometry"> <mxGeometry relative="1" as="geometry">
<Array as="points"> <Array as="points">
@@ -16,12 +29,6 @@
<mxPoint x="11" as="offset" /> <mxPoint x="11" as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="QfHmVZ-q5NNlDkDn7R8m-1" parent="1" style="shape=corner;whiteSpace=wrap;html=1;dx=490;dy=440;rounded=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="535" width="840" x="20" y="60" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--59" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="" vertex="1">
<mxGeometry height="400" width="800" x="40" y="80" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--41" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--40"> <mxCell id="MSPdzodM52y7OSiT-G8--41" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--40">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
@@ -102,9 +109,6 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--48" parent="1" style="rounded=1;whiteSpace=wrap;html=1;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;fillColor=#f9f7ed;strokeColor=#36393d;" value="" vertex="1">
<mxGeometry height="280" width="160" x="340" y="120" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--47" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.008;exitY=0.098;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitPerimeter=0;" target="MSPdzodM52y7OSiT-G8--32"> <mxCell id="MSPdzodM52y7OSiT-G8--47" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.008;exitY=0.098;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitPerimeter=0;" target="MSPdzodM52y7OSiT-G8--32">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
@@ -113,9 +117,6 @@
<mxPoint as="offset" /> <mxPoint as="offset" />
</mxGeometry> </mxGeometry>
</mxCell> </mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--44" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eeeeee;strokeColor=#36393d;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="" vertex="1">
<mxGeometry height="160" width="120" x="360" y="220" as="geometry" />
</mxCell>
<mxCell id="MSPdzodM52y7OSiT-G8--11" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--9"> <mxCell id="MSPdzodM52y7OSiT-G8--11" edge="1" parent="1" source="MSPdzodM52y7OSiT-G8--2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="MSPdzodM52y7OSiT-G8--9">
<mxGeometry relative="1" as="geometry" /> <mxGeometry relative="1" as="geometry" />
</mxCell> </mxCell>
@@ -259,16 +260,17 @@
<mxCell id="MSPdzodM52y7OSiT-G8--40" parent="1" style="ellipse;fillColor=strokeColor;html=1;" value="" vertex="1"> <mxCell id="MSPdzodM52y7OSiT-G8--40" parent="1" style="ellipse;fillColor=strokeColor;html=1;" value="" vertex="1">
<mxGeometry height="20" width="20" x="110" y="430" as="geometry" /> <mxGeometry height="20" width="20" x="110" y="430" as="geometry" />
</mxCell> </mxCell>
<mxCell id="A_ADbUNkVSTOonzZ98Np-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffcccc;strokeColor=#36393d;" value="Deaktivated" vertex="1"> <mxCell id="HZ1lZV176OuICY9gLn3O-2" parent="0" style="locked=1;" value="Legende" />
<mxCell id="A_ADbUNkVSTOonzZ98Np-1" parent="HZ1lZV176OuICY9gLn3O-2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffcccc;strokeColor=#36393d;" value="Deaktivated" vertex="1">
<mxGeometry height="60" width="120" x="960" y="220" as="geometry" /> <mxGeometry height="60" width="120" x="960" y="220" as="geometry" />
</mxCell> </mxCell>
<mxCell id="A_ADbUNkVSTOonzZ98Np-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#cce5ff;strokeColor=#36393d;" value="Waiting state" vertex="1"> <mxCell id="A_ADbUNkVSTOonzZ98Np-2" parent="HZ1lZV176OuICY9gLn3O-2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#cce5ff;strokeColor=#36393d;" value="Waiting state" vertex="1">
<mxGeometry height="60" width="120" x="960" y="60" as="geometry" /> <mxGeometry height="60" width="120" x="960" y="60" as="geometry" />
</mxCell> </mxCell>
<mxCell id="A_ADbUNkVSTOonzZ98Np-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;" value="Acting state" vertex="1"> <mxCell id="A_ADbUNkVSTOonzZ98Np-3" parent="HZ1lZV176OuICY9gLn3O-2" style="rounded=1;whiteSpace=wrap;html=1;" value="Acting state" vertex="1">
<mxGeometry height="60" width="120" x="960" y="140" as="geometry" /> <mxGeometry height="60" width="120" x="960" y="140" as="geometry" />
</mxCell> </mxCell>
<mxCell id="A_ADbUNkVSTOonzZ98Np-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;strokeWidth=3;" value="Required state" vertex="1"> <mxCell id="A_ADbUNkVSTOonzZ98Np-4" parent="HZ1lZV176OuICY9gLn3O-2" style="rounded=1;whiteSpace=wrap;html=1;strokeWidth=3;" value="Required state" vertex="1">
<mxGeometry height="60" width="120" x="960" y="297.5" as="geometry" /> <mxGeometry height="60" width="120" x="960" y="297.5" as="geometry" />
</mxCell> </mxCell>
</root> </root>