diff --git a/Plugins/Drivers/PLC.SiemensS7/DeviceSiemensS7.cs b/Plugins/Drivers/PLC.SiemensS7/DeviceSiemensS7.cs index d71e3cb..52b06c0 100644 --- a/Plugins/Drivers/PLC.SiemensS7/DeviceSiemensS7.cs +++ b/Plugins/Drivers/PLC.SiemensS7/DeviceSiemensS7.cs @@ -3,6 +3,7 @@ using System.Text; using S7.Net.Types; using PluginInterface; using Microsoft.Extensions.Logging; +using System.IO; namespace PLC.SiemensS7 { @@ -47,6 +48,7 @@ namespace PLC.SiemensS7 _device = device; _logger = logger; + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); _logger.LogInformation($"Device:[{_device}],Create()"); } @@ -132,27 +134,21 @@ namespace PLC.SiemensS7 [Method("读西门子PLC标准地址", description: "读西门子PLC标准地址")] public DriverReturnValueModel Read(DriverAddressIoArgModel ioArg) { + var encodeArr = System.Text.Encoding.GetEncodings(); var ret = new DriverReturnValueModel { StatusType = VaribaleStatusTypeEnum.Good }; if (_plc is { IsConnected: true }) { try { - if (ioArg.ValueType == DataTypeEnum.AsciiString) + if (ioArg.ValueType == DataTypeEnum.AsciiString || ioArg.ValueType == DataTypeEnum.Utf8String || ioArg.ValueType == DataTypeEnum.Gb2312String) { var str = string.Empty; var dataItem = S7.Net.Types.DataItem.FromAddress(ioArg.Address); var head = _plc.ReadBytes(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr, 2); var strBytes = _plc.ReadBytes(dataItem.DataType, dataItem.DB, dataItem.StartByteAdr + 2, head[1]); - var strRaw = Encoding.ASCII.GetString(strBytes).TrimEnd(new char[] { '\0' }); - if (strRaw.Any()) - { - foreach (var chart in strRaw) - { - if (chart >= 0x20 && chart <= 0x7E) - str += chart; - } - } + var strRaw = GetString(ioArg.ValueType, strBytes); + ret.Value = strRaw; } @@ -373,15 +369,48 @@ namespace PLC.SiemensS7 toWriteString = toWriteString.Take(length).ToString(); } + + switch (ioArg.ValueType) + { + case DataTypeEnum.Utf8String: + return Encoding.UTF8.GetBytes(toWriteString); + case DataTypeEnum.Gb2312String: + Encoding toEcoding = Encoding.GetEncoding("gb2312"); + byte[] fromBytes = Encoding.UTF8.GetBytes(toWriteString); + return Encoding.Convert(Encoding.UTF8, toEcoding, fromBytes); + case DataTypeEnum.AsciiString: + default: + return Encoding.ASCII.GetBytes(toWriteString); + } } catch (Exception e) { throw new Exception("字符串解析异常"); } - - return Encoding.ASCII.GetBytes(toWriteString); } + + private string GetString(DataTypeEnum dataType, byte[] strBytes) + { + string? str = string.Empty; + switch (dataType) + { + case DataTypeEnum.Utf8String: + str = Encoding.UTF8.GetString(strBytes); + break; + case DataTypeEnum.Gb2312String: + Encoding fromEncoding = Encoding.GetEncoding("gb2312"); + byte[] toBytes = Encoding.Convert(fromEncoding, Encoding.UTF8, strBytes); + str = Encoding.UTF8.GetString(toBytes); + break; + case DataTypeEnum.AsciiString: + default: + var strRaw = Encoding.ASCII.GetString(strBytes.Where(x => x is >= 0x20 and <= 0x7E).ToArray()); + break; + } + + return str.TrimEnd(new char[] { '\0' }); + } #endregion } diff --git a/Plugins/Drivers/PLC.SiemensS7/PLC.SiemensS7.csproj b/Plugins/Drivers/PLC.SiemensS7/PLC.SiemensS7.csproj index 2617eb5..05269de 100644 --- a/Plugins/Drivers/PLC.SiemensS7/PLC.SiemensS7.csproj +++ b/Plugins/Drivers/PLC.SiemensS7/PLC.SiemensS7.csproj @@ -6,6 +6,10 @@ enable enable + + + + diff --git a/Plugins/PluginInterface/DataTypeEnum.cs b/Plugins/PluginInterface/DataTypeEnum.cs index 3b49b08..309ff24 100644 --- a/Plugins/PluginInterface/DataTypeEnum.cs +++ b/Plugins/PluginInterface/DataTypeEnum.cs @@ -59,5 +59,7 @@ namespace PluginInterface Custome4, [Display(Name = "自定义5")] Custome5, + [Display(Name = "Gb2312")] + Gb2312String, } } diff --git a/drivers/net6.0/CNC.Fanuc.H.dll b/drivers/net6.0/CNC.Fanuc.H.dll index f929d09..a9b7eb4 100644 Binary files a/drivers/net6.0/CNC.Fanuc.H.dll and b/drivers/net6.0/CNC.Fanuc.H.dll differ diff --git a/drivers/net6.0/CNC.Fanuc.H.pdb b/drivers/net6.0/CNC.Fanuc.H.pdb index f5674f7..afc5999 100644 Binary files a/drivers/net6.0/CNC.Fanuc.H.pdb and b/drivers/net6.0/CNC.Fanuc.H.pdb differ diff --git a/drivers/net6.0/PLC.SiemensS7.deps.json b/drivers/net6.0/PLC.SiemensS7.deps.json index eb0ee0b..72daeb4 100644 --- a/drivers/net6.0/PLC.SiemensS7.deps.json +++ b/drivers/net6.0/PLC.SiemensS7.deps.json @@ -8,7 +8,8 @@ ".NETCoreApp,Version=v6.0": { "PLC.SiemensS7/1.0.0": { "dependencies": { - "PluginInterface": "1.0.0" + "PluginInterface": "1.0.0", + "System.Text.Encoding.CodePages": "6.0.0" }, "runtime": { "PLC.SiemensS7.dll": {} @@ -30,6 +31,12 @@ } } }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": {}, + "System.Text.Encoding.CodePages/6.0.0": { + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, "PluginInterface/1.0.0": { "dependencies": { "Microsoft.Extensions.Logging.Abstractions": "6.0.2", @@ -61,6 +68,20 @@ "path": "newtonsoft.json/13.0.1", "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" }, + "System.Runtime.CompilerServices.Unsafe/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", + "path": "system.runtime.compilerservices.unsafe/6.0.0", + "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" + }, + "System.Text.Encoding.CodePages/6.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "path": "system.text.encoding.codepages/6.0.0", + "hashPath": "system.text.encoding.codepages.6.0.0.nupkg.sha512" + }, "PluginInterface/1.0.0": { "type": "project", "serviceable": false, diff --git a/drivers/net6.0/PLC.SiemensS7.dll b/drivers/net6.0/PLC.SiemensS7.dll index d82db8e..28ad4f9 100644 Binary files a/drivers/net6.0/PLC.SiemensS7.dll and b/drivers/net6.0/PLC.SiemensS7.dll differ diff --git a/drivers/net6.0/PLC.SiemensS7.pdb b/drivers/net6.0/PLC.SiemensS7.pdb index 480d9aa..bd283c0 100644 Binary files a/drivers/net6.0/PLC.SiemensS7.pdb and b/drivers/net6.0/PLC.SiemensS7.pdb differ