From 6b83962ae18b905be133cc5127eab11695d3b795 Mon Sep 17 00:00:00 2001 From: Administrator Date: Tue, 4 Nov 2025 11:15:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LolaiService/.config/dotnet-tools.json | 5 + .../Controllers/TunnelApiController.cs | 71 +++++ LolaiService/Devices/Tunnel/IRfidTunnel.cs | 63 ++++ LolaiService/Devices/Tunnel/RfidTunnel.cs | 285 ++++++++++++++++++ LolaiService/Global/GlobalData.cs | 16 + LolaiService/Global/GlobalDeviceInfo.cs | 124 ++++++++ LolaiService/Global/GlobalVar.cs | 16 + LolaiService/LolaiService.csproj | 35 +++ LolaiService/LolaiService.http | 6 + LolaiService/Program.cs | 39 +++ LolaiService/Properties/launchSettings.json | 41 +++ LolaiService/WeatherForecast.cs | 13 + LolaiService/appsettings.Development.json | 8 + LolaiService/appsettings.json | 9 + LolaiService/tunnelPlc.dll | Bin 0 -> 44544 bytes LolaiSysService.sln | 25 ++ 16 files changed, 756 insertions(+) create mode 100644 LolaiService/.config/dotnet-tools.json create mode 100644 LolaiService/Controllers/TunnelApiController.cs create mode 100644 LolaiService/Devices/Tunnel/IRfidTunnel.cs create mode 100644 LolaiService/Devices/Tunnel/RfidTunnel.cs create mode 100644 LolaiService/Global/GlobalData.cs create mode 100644 LolaiService/Global/GlobalDeviceInfo.cs create mode 100644 LolaiService/Global/GlobalVar.cs create mode 100644 LolaiService/LolaiService.csproj create mode 100644 LolaiService/LolaiService.http create mode 100644 LolaiService/Program.cs create mode 100644 LolaiService/Properties/launchSettings.json create mode 100644 LolaiService/WeatherForecast.cs create mode 100644 LolaiService/appsettings.Development.json create mode 100644 LolaiService/appsettings.json create mode 100644 LolaiService/tunnelPlc.dll create mode 100644 LolaiSysService.sln diff --git a/LolaiService/.config/dotnet-tools.json b/LolaiService/.config/dotnet-tools.json new file mode 100644 index 0000000..b0e38ab --- /dev/null +++ b/LolaiService/.config/dotnet-tools.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "isRoot": true, + "tools": {} +} \ No newline at end of file diff --git a/LolaiService/Controllers/TunnelApiController.cs b/LolaiService/Controllers/TunnelApiController.cs new file mode 100644 index 0000000..b453861 --- /dev/null +++ b/LolaiService/Controllers/TunnelApiController.cs @@ -0,0 +1,71 @@ +using LolaiService.Devices.Tunnel; +using LolaiService.Global; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace LolaiService.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class TunnelApiController : ControllerBase + { + /// + /// 隧道机关门 + /// + /// + [HttpPost("TunnelClose")] + public string TunnelCloseApi() + { + string result = GlobalDeviceInfo.CloseDoorTunnel(); + if (result.Equals("已关门")) + { + return "关门成功"; + } + else + { + return "关门失败"; + } + } + + + /// + /// 隧道机开门 + /// + /// + [HttpPost("TunnelOpen")] + public string TunnelOpenDoorApi() + { + string result = GlobalDeviceInfo.OpenDoorTunnel(); + if (result.Equals("已开门")) + { + return "开门成功"; + } + else + { + return "开门失败"; + } + } + + + [HttpGet("today")] + public IActionResult GetTodayWeather() + { + var data = new { Temp = 22, Condition = "Sunny" }; + return Ok(data); + } + + // GET api/weather/week + [HttpGet("week")] + public IActionResult GetWeekForecast() + { + var data = new[] + { + new { Day = "Mon", Temp = 21, Condition = "Cloudy" }, + new { Day = "Tue", Temp = 23, Condition = "Sunny" }, + new { Day = "Wed", Temp = 19, Condition = "Rain" }, + }; + return Ok(data); + } + + } +} diff --git a/LolaiService/Devices/Tunnel/IRfidTunnel.cs b/LolaiService/Devices/Tunnel/IRfidTunnel.cs new file mode 100644 index 0000000..452ab37 --- /dev/null +++ b/LolaiService/Devices/Tunnel/IRfidTunnel.cs @@ -0,0 +1,63 @@ +using Rovinj.Device; +using Rovinj.Reader.Silion; +using Rovinj.Tunnel; + +namespace LolaiService.Devices.Tunnel +{ + /// + /// 隧道机接口 + /// + public interface IRfidTunnel + { + /// + /// 连接通道机 + /// + bool ConnectTunnel(SilionReaderConfig readerConfig, ConnectionConfig plcConnectionConfig, TunnelConfig tunnelConfig); + + /// + /// 关闭通道机 + /// + /// + void CloseTunnel(); + + /// + /// 标签报告事件 + /// + /// + /// + void Tunnel_TagsReported(ITunnel tunnel, TunnelTagsReportedEventArgs e); + /// + /// 通道机读写器状态变化事件 + /// + /// + /// + void Tunnel_ReaderStateChanged(ITunnel tunnel, TunnelReaderStateChangedEventArgs e); + /// + /// 通道机PLC状态变化事件 + /// + /// + /// + void Tunnel_PlcStateChanged(ITunnel tunnel, TunnelPlcStateChangedEventArgs e); + + /// + /// 通道机错误事件 + /// + /// + /// + void Tunnel_ErrorReceived(ITunnel tunnel, TunnelErrorReceivedEventArgs e); + + /// + /// 隧道关门 + /// + /// + string CloseDoor(); + + /// + /// 隧道开门 + /// + /// + /// + string OpenDoor(); + + } +} diff --git a/LolaiService/Devices/Tunnel/RfidTunnel.cs b/LolaiService/Devices/Tunnel/RfidTunnel.cs new file mode 100644 index 0000000..a98dcd7 --- /dev/null +++ b/LolaiService/Devices/Tunnel/RfidTunnel.cs @@ -0,0 +1,285 @@ +using LolaiService.Global; +using Rovinj.Device; +using Rovinj.Log; +using Rovinj.Reader; +using Rovinj.Reader.Silion; +using Rovinj.Tunnel; +using Rovinj.Tunnel.Plc; + +namespace LolaiService.Devices.Tunnel +{ + /// + /// 隧道机实现类 + /// + public class RfidTunnel : IRfidTunnel + { + /// + /// 是否开始校验数量 + /// + private volatile bool isStartCheckTags; + /// + /// 扫描ID的标签 + /// + private string tagsScanId; + /// + /// 标签ID列表,可以是EPC或TID + /// + private List tagIdList = new List(); + /// + /// 当前PLC的状态 + /// + private PlcStatus currentPlcStatus; + /// + /// 隧道是否已连接 + /// + //private bool isTunnelConnected; + /// + ///通道机接口 + /// + //private ITunnel tunnel; + /// + /// 线程退出标识 + /// + private CancellationTokenSource cancellationTokenSource; + /// + /// 检查标签线程 + /// + private Thread checkTagsThread; + /// + /// Silion读写器,支持R2000/E310/E710芯片,支持1、2、3、4、8、16口天线 + /// + private SilionReader silionReader; + + + /// + /// 通道机读写器状态变化事件 + /// + /// + /// + public void Tunnel_ReaderStateChanged(ITunnel tunnel, TunnelReaderStateChangedEventArgs e) + { + LogHelper.Error("e.RunningState:" + e.RunningState); + if (e.RunningState == 0) + { + //停止业务 + LogHelper.Info("停止业务"); + } + else if (e.RunningState == 1) + { + //启动业务 + tagsScanId = e.ScanId; + LogHelper.Info("启动业务"); + } + else + { + LogHelper.Info("其他状态"); + //其他状态 + } + } + + /// + /// 标签报告事件 + /// + /// + /// + public void Tunnel_TagsReported(ITunnel tunnel, TunnelTagsReportedEventArgs e) + { + LogHelper.Error("e.Tags.Count:" + e.Tags.Count); + for (int i = 0; i < e.Tags.Count; i++) + { + Tag tag = e.Tags[i]; + //过滤掉不符合扫描ID的标签 + if (tag.ScanId != tagsScanId) + continue; + + //如果配置为"TID"且TID不为空,则使用TID;否则使用EPC。检查标签ID是否已存在于 tagIdList 中,避免重复添加。 + if (tunnel.TunnelConfig.TagIdFieldName == "TID" && !string.IsNullOrEmpty(tag.TID)) + { + if (tagIdList.Contains(tag.TID)) + continue; + + tagIdList.Add(tag.TID); + LogHelper.Info("tag.TID:" + tag.TID); + } + else + { + if (tagIdList.Contains(tag.EPC)) + continue; + + tagIdList.Add(tag.EPC); + LogHelper.Info("tag.TID:" + tag.TID); + } + } + } + + + /// + /// 通道机PLC状态变化事件 + /// + /// + /// + public void Tunnel_PlcStateChanged(ITunnel tunnel, TunnelPlcStateChangedEventArgs e) + { + currentPlcStatus = e.PlcStatus;//记录当前PLC状态 + LogHelper.Info("通道机PLC状态变化事件:" + e.PlcStatus); + } + + /// + /// 通道机错误接收事件 + /// + /// + /// + /// + public void Tunnel_ErrorReceived(ITunnel tunnel, TunnelErrorReceivedEventArgs e) + { + // 在控制台输出错误信息,包括错误消息和异常详情 + Console.WriteLine($"错误信息:{e.ErrorMessage},异常:{e.Exception}"); + LogHelper.Error("通道机错误接收事件:" + $"错误信息:{e.ErrorMessage},异常:{e.Exception}"); + } + + /// + /// 关闭通道机连接 + /// + /// + /// + public void CloseTunnel() + { + if (GlobalData.tunnel == null) + return; + + if (GlobalData.tunnel.Reader.IsStarted) + { + GlobalData.tunnel.StopReader(); + } + + StopTunnel(); + GlobalData.tunnel.Close(); + GlobalData.tunnel = null; + GlobalData.isTunnelConnected = false; + } + + /// + /// 停止隧道 + /// + private void StopTunnel() + { + if (GlobalData.tunnel.IsStarted) + GlobalData.tunnel.Stop(); + + isStartCheckTags = false; + + if (cancellationTokenSource != null) + cancellationTokenSource.Cancel(); + + if (checkTagsThread != null) + checkTagsThread.Join(); + + } + + /// + /// 连接隧道 + /// + /// 配置RFID读写器参数 + /// 配置PLC连接方式 + /// 配置读写器连接方式 + public bool ConnectTunnel(SilionReaderConfig readerConfig, ConnectionConfig plcConnectionConfig, TunnelConfig tunnelConfig) + { + if (!GlobalData.isTunnelConnected) + { + //创建并打开隧道 + GlobalData.tunnel = TunnelFactory.CreateTunnel(TunnelType.SC201, tunnelConfig);//根据实际的设备选择对应的类型,这里假设是SC201 + GlobalData.tunnel.TagsReported += Tunnel_TagsReported; //读到标签时触发; + GlobalData.tunnel.ReaderStateChanged += Tunnel_ReaderStateChanged; //读写器状态变化 + GlobalData.tunnel.PlcStateChanged += Tunnel_PlcStateChanged; //PLC 状态变化 + GlobalData.tunnel.ErrorReceived += Tunnel_ErrorReceived; //收到错误时触发 + if (GlobalData.tunnel.Open()) + { + LogHelper.Info("连接成功"); + + GlobalData.isTunnelConnected = true; + + //获取读写器能力(支持的发射功率列表) + silionReader = GlobalData.tunnel.Reader as SilionReader; + if (silionReader.ReaderCapability != null) + { + //发射率列表 + List doubles = new List(); + for (int i = 0; i < silionReader.ReaderCapability.TxPowers.Count; i++) + { + doubles.Add(silionReader.ReaderCapability.TxPowers[i]); + LogHelper.Info("发射率列表:" + silionReader.ReaderCapability.TxPowers[i]); + } + } + + if (GlobalData.tunnel.Initialize())//复位 + { + LogHelper.Info("复位成功"); + //语音提示 + //SoundPlayer player = new SoundPlayer(); + //player.Play(); + } + return true; + } + else + { + LogHelper.Error("连接失败"); + GlobalData.tunnel.Close(); + GlobalData.isTunnelConnected = false; + return false; + } + } + else + { + CloseTunnel(); + return false; + } + } + + /// + /// 隧道关门 + /// + /// + public string CloseDoor() + { + if (GlobalData.tunnel == null) + { + return "隧道机未连接"; + } + if (GlobalData.tunnel.CloseDoor()) + { + return "已关门"; + } + else + { + return "关门失败"; + } + //MessageBox.Show(string.Format(crm.GetString("ExecuteCommandFailed"), btn_CloseDoor.Text)); + + } + /// + /// 隧道开门 + /// + /// + public string OpenDoor() + { + + if (GlobalData.tunnel == null) + { + return "隧道机未连接"; + } + if (GlobalData.tunnel.OpenDoor()) + { + return "已开门"; + } + else + { + return "开门失败"; + } + } + } + + + + + +} diff --git a/LolaiService/Global/GlobalData.cs b/LolaiService/Global/GlobalData.cs new file mode 100644 index 0000000..24d1f59 --- /dev/null +++ b/LolaiService/Global/GlobalData.cs @@ -0,0 +1,16 @@ +using Rovinj.Tunnel; + +namespace LolaiService.Global +{ + public static class GlobalData + { + /// + /// 隧道机是否已连接 + /// + public static bool isTunnelConnected = false; + /// + /// 隧道机接口 + /// + public static ITunnel tunnel; + } +} diff --git a/LolaiService/Global/GlobalDeviceInfo.cs b/LolaiService/Global/GlobalDeviceInfo.cs new file mode 100644 index 0000000..5e66643 --- /dev/null +++ b/LolaiService/Global/GlobalDeviceInfo.cs @@ -0,0 +1,124 @@ +using LolaiService.Devices.Tunnel; +using Rovinj.Device; +using Rovinj.Reader.Silion; +using Rovinj.Tunnel; +using Rovinj.Tunnel.Plc; + +namespace LolaiService.Global +{ + /// + /// 隧道机设备 + /// + public class GlobalDeviceInfo + { + /// + /// 连接设备 + /// + public static bool ConnectDevice() + { + //创建日志目录 + if (!Directory.Exists("log")) + Directory.CreateDirectory("log"); + + //初始化日志组件(仅供测试使用) + Rovinj.Log.LogHelper.InitLogger(new Rovinj.Log.TextLog($"log\\{DateTime.Now:yyyy-MM-dd}.log")); + + //隧道机业务层 + RfidTunnel rfidTunnel = new RfidTunnel(); + + ////配置RFID读写器参数 + #region 配置RFID读写器参数 + SilionReaderConfig readerConfig = new SilionReaderConfig() + { + Qvalue = 5, + Session = 1, + ReadTID = false, + Target = 0, + RfMode = 1, + IsFastRead = true, + QuickModeType = 3, + Antennas = new List(), + }; + double power = 30; //功率 + int antCount = 4; //4个天线 + + //根据用户输入的天线数量(默认 4 个),给每个天线端口配置功率和启用状态。 + for (int i = 0; i < antCount; i++) + { + readerConfig.Antennas.Add(new SilionAntennaConfig() + { + IsEnabled = true, + PortNumber = (ushort)(i + 1), + TxPowerInDbm = power + }); + } + #endregion + + + #region 配置PLC连接方式 + + ConnectionConfig plcConnectionConfig = new ConnectionConfig(); + plcConnectionConfig.ConnectionMode = ConnectionMode.Network; //网口连接模式 + plcConnectionConfig.NetworkAddress = "192.168.1.250"; //PLC IP地址 + plcConnectionConfig.NetworkPort = 502; //PLC 端口号 + #endregion + + + #region 配置读写器连接方式 + + ConnectionConfig readerConnectionConfig = new ConnectionConfig(); + readerConnectionConfig.Args = new object[] { antCount }; //天线数量,默认是4个天线,支持1,2,4,8,16 + readerConnectionConfig.ConnectionMode = ConnectionMode.Network; //网口连接模式 + readerConnectionConfig.NetworkAddress = "192.168.1.100"; + #endregion + + //封装成隧道配置 根据用户选择,判断是三菱还是西门子 PLC。 + TunnelConfig tunnelConfig = new TunnelConfig() + { + PlcType = PlcType.Mitsubishi_FX5U, //PLC类型 + PlcConnectionConfig = plcConnectionConfig, //PLC连接配置 + ReaderConnectionConfig = readerConnectionConfig, //读写器连接配置 + ReaderConfig = readerConfig, //读写器配置 + ReaderType = Rovinj.Tunnel.Reader.ReaderType.Silion //读写器类型 + }; + + ////西门子PLC暂时不支持使用串口的通讯方式 + //if ((tunnelConfig.PlcType == PlcType.Mitsubishi_FX5U || tunnelConfig.PlcType == PlcType.Siemens) + // && tunnelConfig.PlcConnectionConfig.ConnectionMode != ConnectionMode.Network) + //{ + // return false; + //} + + //是否连接成功 + bool result = rfidTunnel.ConnectTunnel(readerConfig, plcConnectionConfig, tunnelConfig); + + return result; + } + + /// + /// 隧道关门 + /// + /// + public static string CloseDoorTunnel() + { + RfidTunnel rfidTunnel = new RfidTunnel(); + + return rfidTunnel.CloseDoor(); + } + + /// + /// 隧道开门 + /// + /// + public static string OpenDoorTunnel() + { + RfidTunnel rfidTunnel = new RfidTunnel(); + + return rfidTunnel.OpenDoor(); + } + + + + + } +} diff --git a/LolaiService/Global/GlobalVar.cs b/LolaiService/Global/GlobalVar.cs new file mode 100644 index 0000000..cad90bf --- /dev/null +++ b/LolaiService/Global/GlobalVar.cs @@ -0,0 +1,16 @@ +namespace LolaiService.Global +{ + + public class GlobalVar + { + /// + /// 初始化设备 + /// + public static void InitData() + { + GlobalDeviceInfo.ConnectDevice(); + } + + + } +} diff --git a/LolaiService/LolaiService.csproj b/LolaiService/LolaiService.csproj new file mode 100644 index 0000000..e7f7ab3 --- /dev/null +++ b/LolaiService/LolaiService.csproj @@ -0,0 +1,35 @@ + + + + net8.0 + enable + enable + x86 + + + + + + + + + + ..\..\demo1.9\Rovinj.Device.dll + + + ..\..\demo1.9\Rovinj.Log.dll + + + ..\..\demo1.9\Rovinj.Reader.dll + + + ..\..\demo1.9\Rovinj.Reader.Silion.dll + + + ..\..\demo1.9\Rovinj.Tunnel.dll + + + + + + diff --git a/LolaiService/LolaiService.http b/LolaiService/LolaiService.http new file mode 100644 index 0000000..d9ffb53 --- /dev/null +++ b/LolaiService/LolaiService.http @@ -0,0 +1,6 @@ +@LolaiService_HostAddress = http://localhost:5049 + +GET {{LolaiService_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/LolaiService/Program.cs b/LolaiService/Program.cs new file mode 100644 index 0000000..49b6b06 --- /dev/null +++ b/LolaiService/Program.cs @@ -0,0 +1,39 @@ + +namespace LolaiService +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + + builder.Services.AddControllers(); + // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + if (app.Environment.IsDevelopment()) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } + + app.UseHttpsRedirection(); + + app.UseAuthorization(); + + + app.MapControllers(); + + + Global.GlobalDeviceInfo.ConnectDevice(); + + app.Run(); + } + } +} diff --git a/LolaiService/Properties/launchSettings.json b/LolaiService/Properties/launchSettings.json new file mode 100644 index 0000000..0bc5103 --- /dev/null +++ b/LolaiService/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:50686", + "sslPort": 44389 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5049", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:8999;http://localhost:5049", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/LolaiService/WeatherForecast.cs b/LolaiService/WeatherForecast.cs new file mode 100644 index 0000000..418b0a5 --- /dev/null +++ b/LolaiService/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace LolaiService +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} diff --git a/LolaiService/appsettings.Development.json b/LolaiService/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/LolaiService/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/LolaiService/appsettings.json b/LolaiService/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/LolaiService/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/LolaiService/tunnelPlc.dll b/LolaiService/tunnelPlc.dll new file mode 100644 index 0000000000000000000000000000000000000000..d38d4a4eb692d5572cd05dcadd76c95230a54bdc GIT binary patch literal 44544 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 Ul2OOf#nQtv1z2_f6%29!002DoRsaA1 literal 0 HcmV?d00001 diff --git a/LolaiSysService.sln b/LolaiSysService.sln new file mode 100644 index 0000000..6bebf19 --- /dev/null +++ b/LolaiSysService.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36623.8 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LolaiService", "LolaiService\LolaiService.csproj", "{9EF3747E-AF77-46F0-9F5B-624765C748E1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9EF3747E-AF77-46F0-9F5B-624765C748E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9EF3747E-AF77-46F0-9F5B-624765C748E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EF3747E-AF77-46F0-9F5B-624765C748E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9EF3747E-AF77-46F0-9F5B-624765C748E1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4273D124-83C5-4283-AD67-CDC24E9BE380} + EndGlobalSection +EndGlobal