From 28086f6c23ee4c8b0bc7d28f765e97c4716b4b98 Mon Sep 17 00:00:00 2001 From: rszn <645583145@qq.com> Date: Fri, 7 Jun 2024 11:50:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99tcp=20server=E7=9A=84session?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/lib/HybirdFrameworkCore.dll | Bin 30720 -> 31744 bytes Common/lib/HybirdFrameworkDriver.dll | Bin 33792 -> 33280 bytes Service/Charger/Client/ChargerClient.cs | 29 -- Service/Charger/Client/ChargerServer.cs | 14 - Service/Charger/Client/ClientMgr.cs | 29 -- Service/Charger/Codec/Decoder.cs | 14 - Service/Charger/Codec/Encoder.cs | 14 - Service/Charger/Common/ChargerConst.cs | 6 - Service/Charger/Handler/AuthResHandler.cs | 28 -- Service/Charger/Handler/IBaseHandler.cs | 7 - Service/Charger/Handler/LoginHandler.cs | 41 -- Service/Charger/Msg/APCI.cs | 45 -- Service/Charger/Msg/ASDU.cs | 74 --- Service/Charger/Msg/Charger/Req/Login.cs | 93 ---- Service/Charger/Msg/Charger/Resp/AuthRes.cs | 34 -- Service/Charger/Msg/Host/Req/Auth.cs | 57 --- .../Charger/Msg/Host/Resp/LogSignMessage.cs | 88 ---- Service/Execute/Api/PlcApi.cs | 18 +- Service/Init/Entity/ConnectState.cs | 12 - Service/Init/Entity/PlcInfo.cs | 459 ------------------ WebStarter/bin/Debug/net6.0/appsettings.json | 65 --- .../Debug/net6.0/staticwebassets.build.json | 16 +- WinFormStarter/FrmPlc.cs | 15 - WinFormStarter/Program.cs | 3 +- 24 files changed, 16 insertions(+), 1145 deletions(-) delete mode 100644 Service/Charger/Client/ChargerClient.cs delete mode 100644 Service/Charger/Client/ChargerServer.cs delete mode 100644 Service/Charger/Client/ClientMgr.cs delete mode 100644 Service/Charger/Codec/Decoder.cs delete mode 100644 Service/Charger/Codec/Encoder.cs delete mode 100644 Service/Charger/Common/ChargerConst.cs delete mode 100644 Service/Charger/Handler/AuthResHandler.cs delete mode 100644 Service/Charger/Handler/IBaseHandler.cs delete mode 100644 Service/Charger/Handler/LoginHandler.cs delete mode 100644 Service/Charger/Msg/APCI.cs delete mode 100644 Service/Charger/Msg/ASDU.cs delete mode 100644 Service/Charger/Msg/Charger/Req/Login.cs delete mode 100644 Service/Charger/Msg/Charger/Resp/AuthRes.cs delete mode 100644 Service/Charger/Msg/Host/Req/Auth.cs delete mode 100644 Service/Charger/Msg/Host/Resp/LogSignMessage.cs delete mode 100644 Service/Init/Entity/ConnectState.cs delete mode 100644 Service/Init/Entity/PlcInfo.cs diff --git a/Common/lib/HybirdFrameworkCore.dll b/Common/lib/HybirdFrameworkCore.dll index b3f2f85017c5eb3fac2d71f445df356296c53fc8..36f9605dd1104180e512df42006e5acee1bf5429 100644 GIT binary patch literal 31744 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 UKJWZJP#+%h{GZSN|19vo0p1DZ)Bpeg literal 30720 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 diff --git a/Common/lib/HybirdFrameworkDriver.dll b/Common/lib/HybirdFrameworkDriver.dll index 66c5b7a18f46b05467aab468baffdd3a635072c8..9b51aae58a917c1cc178c97ad074b2c99a7d62a9 100644 GIT binary patch literal 33280 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 -/// 示例程序 -/// -[Scope("InstancePerDependency")] -public class ChargerClient : TcpClient -{ - public void SessionAttr(int sn, int fEqmTypeNo, string eqmCode, string destAddr) - { - var ioSession = SessionMgr.GetSession(Channel.Id.ToString()); - if (ioSession == null) - { - ioSession = new IoSession(Channel); - SessionMgr.RegisterSession(Channel, ioSession); - } - - SessionMgr.SetAttr(ioSession, "charger_sn", sn); - SessionMgr.SetAttr(ioSession, "eqm_type_no", fEqmTypeNo); - SessionMgr.SetAttr(ioSession, "eqm_code", eqmCode); - SessionMgr.SetAttr(ioSession, "dest_addr", destAddr); - } -} \ No newline at end of file diff --git a/Service/Charger/Client/ChargerServer.cs b/Service/Charger/Client/ChargerServer.cs deleted file mode 100644 index 3753b19..0000000 --- a/Service/Charger/Client/ChargerServer.cs +++ /dev/null @@ -1,14 +0,0 @@ -using HybirdFrameworkCore.Autofac.Attribute; -using HybirdFrameworkDriver.TcpServer; -using Service.Charger.Codec; -using Service.Charger.Handler; - -namespace Service.Charger.Client; - -/// -/// 示例程序 -/// -[Scope("InstancePerDependency")] -public class ChargerServer : TcpServer -{ -} \ No newline at end of file diff --git a/Service/Charger/Client/ClientMgr.cs b/Service/Charger/Client/ClientMgr.cs deleted file mode 100644 index 9cbc586..0000000 --- a/Service/Charger/Client/ClientMgr.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Text; -using Autofac; -using HybirdFrameworkCore.Autofac; -using HybirdFrameworkCore.Autofac.Attribute; -using Service.Charger.Msg.Host.Req; - -namespace Service.Charger.Client; - -/// -/// 示例程序 -/// -[Scope("SingleInstance")] -public class ClientMgr -{ - public void InitClient() - { - var auth = new Auth(1, Encoding.UTF8.GetBytes("ddddddddd"), 1); - auth.DestAddr = new byte[] { 0x01, 0x02, 0x03 }; - - var chargerClient2 = AppInfo.Container.Resolve(); - chargerClient2.InitBootstrap("127.0.0.1", 9998); - chargerClient2.BaseConnect(); - chargerClient2.SessionAttr(12, 12, "12", "2"); - chargerClient2.Channel.WriteAndFlushAsync(auth); - - var chargerServer = AppInfo.Container.Resolve(); - chargerServer.Start(9000); - } -} \ No newline at end of file diff --git a/Service/Charger/Codec/Decoder.cs b/Service/Charger/Codec/Decoder.cs deleted file mode 100644 index 9f583d5..0000000 --- a/Service/Charger/Codec/Decoder.cs +++ /dev/null @@ -1,14 +0,0 @@ -using DotNetty.Buffers; -using DotNetty.Codecs; -using DotNetty.Transport.Channels; -using Service.Charger.Msg.Charger.Req; - -namespace Service.Charger.Codec; - -public class Decoder : ByteToMessageDecoder -{ - protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List output) - { - output.Add(new Login()); - } -} \ No newline at end of file diff --git a/Service/Charger/Codec/Encoder.cs b/Service/Charger/Codec/Encoder.cs deleted file mode 100644 index 9b420ac..0000000 --- a/Service/Charger/Codec/Encoder.cs +++ /dev/null @@ -1,14 +0,0 @@ -using DotNetty.Buffers; -using DotNetty.Codecs; -using DotNetty.Transport.Channels; -using HybirdFrameworkDriver.Common; - -namespace Service.Charger.Codec; - -public class Encoder : MessageToByteEncoder -{ - protected override void Encode(IChannelHandlerContext context, IToBytes obj, IByteBuffer output) - { - output.WriteBytes(obj.ToBytes()); - } -} \ No newline at end of file diff --git a/Service/Charger/Common/ChargerConst.cs b/Service/Charger/Common/ChargerConst.cs deleted file mode 100644 index 9955f6d..0000000 --- a/Service/Charger/Common/ChargerConst.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Service.Charger.Common; - -public class ChargerConst -{ - public static readonly byte[] ApciStartChar = { 0x68 /* ,0xEE*/ }; -} \ No newline at end of file diff --git a/Service/Charger/Handler/AuthResHandler.cs b/Service/Charger/Handler/AuthResHandler.cs deleted file mode 100644 index 32b029b..0000000 --- a/Service/Charger/Handler/AuthResHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -using DotNetty.Transport.Channels; -using HybirdFrameworkCore.Autofac.Attribute; -using HybirdFrameworkDriver.Session; -using log4net; -using Service.Charger.Msg.Charger.Resp; - -namespace Service.Charger.Handler; - -/// -/// 接收到鉴权帧 -/// -/// 1,保存日志到log -/// 2,从SessionMgr中取目的地址,解析后写入ChargerManager -/// 3,保存鉴权状态和充电状态 -/// -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class AuthResHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(AuthResHandler)); - - protected override void ChannelRead0(IChannelHandlerContext ctx, AuthRes msg) - { - var sn = (int)SessionMgr.GetAttrByKey(ctx.Channel.Id.ToString(), "charger_sn"); - Log.Info($"receive {msg} from {sn}"); - } -} \ No newline at end of file diff --git a/Service/Charger/Handler/IBaseHandler.cs b/Service/Charger/Handler/IBaseHandler.cs deleted file mode 100644 index aa755cc..0000000 --- a/Service/Charger/Handler/IBaseHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -using DotNetty.Transport.Channels; - -namespace Service.Charger.Handler; - -public interface IBaseHandler : IChannelHandler -{ -} \ No newline at end of file diff --git a/Service/Charger/Handler/LoginHandler.cs b/Service/Charger/Handler/LoginHandler.cs deleted file mode 100644 index 135ecf7..0000000 --- a/Service/Charger/Handler/LoginHandler.cs +++ /dev/null @@ -1,41 +0,0 @@ -using DotNetty.Transport.Channels; -using HybirdFrameworkCore.Autofac.Attribute; -using HybirdFrameworkDriver.Session; -using log4net; -using Service.Charger.Msg.Charger.Req; -using Service.Charger.Msg.Host.Resp; - -namespace Service.Charger.Handler; - -/// -/// 3.3.3 充放电机登陆签到 -/// 监控平台应答充电设备登录签到报文 -/// -/// 1,保存日志到log -/// 2,回复签到应答 -/// 3,保存签到应答日志 -/// -/// -[Order(8)] -[Scope("InstancePerDependency")] -public class LoginHandler : SimpleChannelInboundHandler, IBaseHandler -{ - private static readonly ILog Log = LogManager.GetLogger(typeof(LoginHandler)); - - protected override void ChannelRead0(IChannelHandlerContext ctx, Login msg) - { - msg.ConnProtocolVersion = msg.ConnProtocolVersion0 + "." + msg.ConnProtocolVersion1 + "." + - msg.ConnProtocolVersion2; - msg.ControllerHardwareVersion = msg.ControllerHardwareVersion0 + "." + msg.ControllerHardwareVersion1 + - "." + msg.ControllerHardwareVersion2; - msg.ControllerSoftwareVersion = msg.ControllerSoftwareVersion0 + "." + msg.ControllerSoftwareVersion1 + - "." + msg.ControllerSoftwareVersion2; - var sn = (int)SessionMgr.GetAttrByKey(ctx.Channel.Id.ToString(), "charger_sn"); - Log.Info($"receive {msg} from {sn}"); - - - var logSignMessage = new LogSignMessage(0); - logSignMessage.DestAddr = new byte[] { 0x01, 0x02, 0x03 }; - ctx.Channel.WriteAndFlushAsync(logSignMessage); - } -} \ No newline at end of file diff --git a/Service/Charger/Msg/APCI.cs b/Service/Charger/Msg/APCI.cs deleted file mode 100644 index ed309f9..0000000 --- a/Service/Charger/Msg/APCI.cs +++ /dev/null @@ -1,45 +0,0 @@ -using HybirdFrameworkDriver.Common; -using Service.Charger.Common; - -namespace Service.Charger.Msg; - -public abstract class APCI : IToBytes -{ - /// - /// 报文长度 - /// - public ushort PackLen { get; set; } - - /// - /// 控制域 - /// - public uint CtlArea { get; set; } - - /// - /// 目标地址 - /// - public byte[] DestAddr { get; set; } - - /// - /// 源地址 - /// - public uint SrcAddr { get; set; } - - - public byte[] ToBytes() - { - var bodyBytes = GetBytes(); - var list = new List(); - list.AddRange(ChargerConst.ApciStartChar); - list.AddRange(BitConverter.GetBytes(bodyBytes.Length + 12)); - list.AddRange(BitConverter.GetBytes(CtlArea)); - list.AddRange(DestAddr); - list.AddRange(BitConverter.GetBytes(SrcAddr)); - - list.AddRange(bodyBytes); - - return list.ToArray(); - } - - public abstract byte[] GetBytes(); -} \ No newline at end of file diff --git a/Service/Charger/Msg/ASDU.cs b/Service/Charger/Msg/ASDU.cs deleted file mode 100644 index 08e3ab3..0000000 --- a/Service/Charger/Msg/ASDU.cs +++ /dev/null @@ -1,74 +0,0 @@ -using DotNetty.Buffers; -using HybirdFrameworkCore.Utils; -using Service.Charger.Common; - -namespace Service.Charger.Msg; - -public class ASDU : APCI -{ - /// - /// 帧类型号 - /// - public byte FrameTypeNo { get; set; } - - /// - /// 信息体个数 - /// - public byte MsgBodyCount { get; set; } - - /// - /// 传送原因-3.1.3.2 - /// - public ushort TransReason { get; set; } - - /// - /// 公共地址 - /// - public ushort PublicAddr { get; set; } - - /// - /// 信息体地址-3个字节 - /// - public byte[]? MsgBodyAddr { get; set; } - - - public override byte[] GetBytes() - { - var list = new List(); - list.Add(FrameTypeNo); - list.Add(MsgBodyCount); - list.AddRange(BitConverter.GetBytes(TransReason)); - list.AddRange(BitConverter.GetBytes(PublicAddr)); - list.AddRange(MsgBodyAddr); - - list.AddRange(ModelConvert.Encode(this)); - return list.ToArray(); - } - - - public static void ParseHeader(IByteBuffer byteBuffer, ASDU asdu) - { - var start = ChargerConst.ApciStartChar.Length - 1; - - asdu.PackLen = byteBuffer.GetUnsignedShortLE(start + 1); - asdu.CtlArea = byteBuffer.GetUnsignedInt(start + 3); - asdu.DestAddr = new[] - { - byteBuffer.GetByte(start + 7), - byteBuffer.GetByte(start + 8), - byteBuffer.GetByte(start + 9), - byteBuffer.GetByte(start + 10) - }; - asdu.SrcAddr = byteBuffer.GetUnsignedInt(start + 11); - asdu.FrameTypeNo = byteBuffer.GetByte(start + 15); - asdu.MsgBodyCount = byteBuffer.GetByte(start + 16); - asdu.TransReason = byteBuffer.GetUnsignedShortLE(start + 17); - asdu.PublicAddr = byteBuffer.GetUnsignedShortLE(start + 19); - asdu.MsgBodyAddr = new[] - { - byteBuffer.GetByte(start + 21), - byteBuffer.GetByte(start + 22), - byteBuffer.GetByte(start + 23) - }; - } -} \ No newline at end of file diff --git a/Service/Charger/Msg/Charger/Req/Login.cs b/Service/Charger/Msg/Charger/Req/Login.cs deleted file mode 100644 index d56075b..0000000 --- a/Service/Charger/Msg/Charger/Req/Login.cs +++ /dev/null @@ -1,93 +0,0 @@ -using HybirdFrameworkCore.Autofac.Attribute; - -namespace Service.Charger.Msg.Charger.Req; - -/// -/// 3.3.3 充放电机登陆签到 -/// -public class Login : ASDU -{ - /// - /// 记录类型 - /// - [Property(0, 8)] - public byte RecordType { get; set; } - - /// - /// 监控网关编号 - /// - [Property(8, 16)] - public ushort GatewayNo { get; set; } - - /// - /// 设备属性 - /// - [Property(24, 8)] - public byte EquipType { get; set; } - - /// - /// 通讯协议版本 - /// - [Property(32, 8)] - public byte ConnProtocolVersion0 { get; set; } - - [Property(40, 8)] public byte ConnProtocolVersion1 { get; set; } - [Property(48, 8)] public byte ConnProtocolVersion2 { get; set; } - public string ConnProtocolVersion { get; set; } - - /// - /// 充电控制器硬件版本号 - /// - [Property(56, 8)] - public byte ControllerHardwareVersion0 { get; set; } - - [Property(64, 8)] public byte ControllerHardwareVersion1 { get; set; } - [Property(72, 8)] public byte ControllerHardwareVersion2 { get; set; } - public string ControllerHardwareVersion { get; set; } - - /// - /// 充电控制器软件版本 - /// - [Property(80, 8)] - public byte ControllerSoftwareVersion0 { get; set; } - - [Property(88, 8)] public byte ControllerSoftwareVersion1 { get; set; } - [Property(96, 8)] public byte ControllerSoftwareVersion2 { get; set; } - public string ControllerSoftwareVersion { get; set; } - - /// - /// 充电枪口数目 - /// - [Property(104, 8)] - public byte GunNum { get; set; } - - /// - /// 充电模块数目 - /// - [Property(112, 8)] - public byte GunModuleNum { get; set; } - - /// - /// 额定功率 - /// - [Property(128, 16)] - public ushort RatedPower { get; set; } - - /// - /// 当前功率 - /// - [Property(136, 8)] - public byte CurrentPower { get; set; } - - /// - /// 当前速率 - /// - [Property(144, 8)] - public byte CurrentSpeed { get; set; } - - /// - /// 分流器量程 - /// - [Property(152, 16)] - public ushort DiverterRange { get; set; } -} \ No newline at end of file diff --git a/Service/Charger/Msg/Charger/Resp/AuthRes.cs b/Service/Charger/Msg/Charger/Resp/AuthRes.cs deleted file mode 100644 index 357e162..0000000 --- a/Service/Charger/Msg/Charger/Resp/AuthRes.cs +++ /dev/null @@ -1,34 +0,0 @@ -using HybirdFrameworkCore.Autofac.Attribute; - -namespace Service.Charger.Msg.Charger.Resp; - -/// -/// 3.3.2 充放电机应答鉴权认证 -/// -public class AuthRes : ASDU - -{ - /// - /// 记录类型 - /// - [Property(0, 8)] - public byte RecordType { get; set; } - - /// - /// 连接序号 - /// - [Property(8, 16)] - public ushort ConnSeq { get; set; } - - /// - /// 鉴权结果 - /// - [Property(24, 8)] - public byte AuthResult { get; set; } - - /// - /// 失败原因 - /// - [Property(32, 8)] - public byte FailReason { get; set; } -} \ No newline at end of file diff --git a/Service/Charger/Msg/Host/Req/Auth.cs b/Service/Charger/Msg/Host/Req/Auth.cs deleted file mode 100644 index 492dc4d..0000000 --- a/Service/Charger/Msg/Host/Req/Auth.cs +++ /dev/null @@ -1,57 +0,0 @@ -using HybirdFrameworkCore.Autofac.Attribute; - -namespace Service.Charger.Msg.Host.Req; - -/// -/// 3.3.1 监控平台鉴权认证 -/// -public class Auth : ASDU -{ - public Auth(ushort connseq, byte[] authcodes, byte authcodekey) - { - PackLen = 0; - CtlArea = 0; - SrcAddr = 0; - - FrameTypeNo = 45; - MsgBodyCount = 1; - TransReason = 3; - PublicAddr = 0; - MsgBodyAddr = new byte[] { 0, 0, 0 }; - - RecordType = 24; - ClientType = 1; - ConnSeq = connseq; - AuthCodes = authcodes; - AuthCodeKey = authcodekey; - } - - /// - /// 记录类型 - /// - public byte RecordType { get; set; } - - /// - /// 客户端类型.1站控 2本地控制器 3测试客户端 4TCU模式 0未知设备 - /// - [Property(0, 8)] - public byte ClientType { get; set; } - - /// - /// 连接序号 - /// - [Property(8, 16)] - public ushort ConnSeq { get; set; } - - /// - /// 鉴权码字节数组 - /// - [Property(24, 64)] - public byte[] AuthCodes { get; set; } - - /// - /// 鉴码KEY - /// - [Property(88, 8)] - public byte AuthCodeKey { get; set; } -} \ No newline at end of file diff --git a/Service/Charger/Msg/Host/Resp/LogSignMessage.cs b/Service/Charger/Msg/Host/Resp/LogSignMessage.cs deleted file mode 100644 index 60882c5..0000000 --- a/Service/Charger/Msg/Host/Resp/LogSignMessage.cs +++ /dev/null @@ -1,88 +0,0 @@ -using HybirdFrameworkCore.Autofac.Attribute; - -namespace Service.Charger.Msg.Host.Resp; - -/// -/// 3.3.4 监控平台应答充电设备登录签到报文 -/// -public class LogSignMessage : ASDU -{ - public LogSignMessage(byte result) - { - Result = result; - - CtlArea = 0; - SrcAddr = 0; - FrameTypeNo = 45; - MsgBodyCount = 1; - TransReason = 4; - PublicAddr = 0; - MsgBodyAddr = new byte[] { 0, 0, 0 }; - RecordType = 12; - - var dtime = DateTime.Now; - TimeYear = Convert.ToUInt16(dtime.Year.ToString()); - TimeMonth = Convert.ToByte(dtime.Month); - TimeDay = Convert.ToByte(dtime.Day); - TimeHour = Convert.ToByte(dtime.Hour); - TimeMinute = Convert.ToByte(dtime.Minute); - TimeSecond = Convert.ToByte(dtime.Second); - } - - [Property(0, 8)] public byte RecordType { get; set; } - - /// - /// 结果 - /// 0:成功/确认 - /// 1:失败-平台处理该消息失败 - /// 2:消息有误-消息校验错误/消息长度有误 - /// 4:该设备编码在系统没有找到 - /// 5:该设备编码在系统中异常,可能存在冲突 - /// 6:充电控制器数目不对 - /// 255:其它错误 - /// - [Property(8, 8)] - public byte Result { get; set; } - - /// - /// 年 - /// - [Property(16, 16)] - public ushort TimeYear { get; set; } - - /// - /// 月 - /// - [Property(32, 8)] - public byte TimeMonth { get; set; } - - /// - /// 日 - /// - [Property(40, 8)] - public byte TimeDay { get; set; } - - /// - /// 时 - /// - [Property(48, 8)] - public byte TimeHour { get; set; } - - /// - /// 分 - /// - [Property(56, 8)] - public byte TimeMinute { get; set; } - - /// - /// 秒 - /// - [Property(64, 8)] - public byte TimeSecond { get; set; } - - /// - /// 保留:1位, 默认0xFF - /// - [Property(72, 8)] - public byte Time { get; set; } -} \ No newline at end of file diff --git a/Service/Execute/Api/PlcApi.cs b/Service/Execute/Api/PlcApi.cs index 7817526..e886fa8 100644 --- a/Service/Execute/Api/PlcApi.cs +++ b/Service/Execute/Api/PlcApi.cs @@ -1,9 +1,4 @@ -using HybirdFrameworkDriver.ModbusTcpMaster; using log4net; -using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; -using Service.Cloud.Msg.Cloud.Req; -using Service.Init.Entity; -using Service.Plc; using Service.Plc.Client; namespace Service.Execute.Api; @@ -13,14 +8,14 @@ public class PlcApi private const int TimeSpan = 60; private static readonly ILog Log = LogManager.GetLogger("PlcApi"); - + /// /// 数据有效时间。单位秒 /// static int DataTimeSeconds = 2; - + /// @@ -29,7 +24,7 @@ public class PlcApi /// public static bool IsRemote() { - + var isRemote = PlcMgr.IsRemote(); Log.Info($"PlcApi IsRemove resp={isRemote}"); return isRemote; @@ -110,10 +105,10 @@ public class PlcApi /// public static bool StartSwapping(string inBinNo, string outBinNo) { - + Log.Info($"PlcApi StartSwapping param= inBinNo={inBinNo}, outBinNo={outBinNo}"); var distributeTask = PlcMgr.DistributeTask(ushort.Parse(inBinNo), ushort.Parse(outBinNo), 1); - + Log.Info($"PlcApi StartSwapping resp={distributeTask}"); return distributeTask; } @@ -166,4 +161,5 @@ public class PlcApi Log.Info($"PlcApi ReadPlcTaskStatus resp= {readPlcTaskStatus}"); return readPlcTaskStatus; } -} \ No newline at end of file +} + diff --git a/Service/Init/Entity/ConnectState.cs b/Service/Init/Entity/ConnectState.cs deleted file mode 100644 index 8474612..0000000 --- a/Service/Init/Entity/ConnectState.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Service.Init.Entity -{ - /// - ///PLC连接状态枚举 - /// - public enum ConnectState - { - Disconnect = 0, - Connecting = 1, - Connected = 2 - } -} \ No newline at end of file diff --git a/Service/Init/Entity/PlcInfo.cs b/Service/Init/Entity/PlcInfo.cs deleted file mode 100644 index 32b8e20..0000000 --- a/Service/Init/Entity/PlcInfo.cs +++ /dev/null @@ -1,459 +0,0 @@ -using HybirdFrameworkDriver.ModbusTcpMaster; -using HybirdFrameworkDriver.Session; -using Service.Plc.Msg; - -namespace Service.Init.Entity -{ - public class PlcInfo - { - #region 字段 - - /// - /// 设备编号 - /// - private string _devNo = "001"; - - /// - /// 设备名称 - /// - private string _devname = "换电PLC"; - - /// - /// 服务端连接IP - /// - private string _ipaddr = "172.0.20.48"; - - /// - /// 服务端连接端口 - /// - private int _port = 502; - - /// - /// 站号 - /// - private byte _site = 0x01; - - /// - /// 连接超时时间。单位秒 - /// - private int _connecttimeout = 10; - - /// - /// 保持活跃时间。单位秒 - /// - private int _keepalive = 30; - - /// - /// 连接状态 - /// - private ConnectState _connect_state = ConnectState.Disconnect; - - #endregion 字段 - - public string ChannelId; - - public int EqmSn; - - public HostToPlc hostToPlc = new HostToPlc(); - public PlcToHost plcToHost = new PlcToHost(); - public PlcFault plcFault = new PlcFault(); - - #region - int DataTimeSeconds = 2; - DateTime DataValidityTime = DateTime.Now; - - /// - /// plc是否连接 - /// - public bool Connected { get; set; } - /// - /// plc是否处于远程模式 - /// - public bool RemoteNot - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds) - { - return RemoteNot; - } - else - { - return false; - } - } - set - { - RemoteNot = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读入口雷达是否感应触发 - /// - public bool EntranceRadar - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return EntranceRadar; - } - else - { - return false; - } - } - set - { - EntranceRadar = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取通道定位状态(拍照是否OK) - /// - public bool ChannelLocationState - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return ChannelLocationState; - } - else - { - return false; - } - } - set - { - ChannelLocationState = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取plc任务状态电池拆卸中 - /// - public bool BatteryDisassembly - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return BatteryDisassembly; - } - else - { - return false; - } - } - set - { - BatteryDisassembly = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取plc任务状态电池入库搬运中 - /// - public bool StorageBatteries - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return StorageBatteries; - } - else - { - return false; - } - } - set - { - StorageBatteries = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取plc任务状态电池出库搬运中 - /// - public bool BatteryDelivery - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return BatteryDelivery; - } - else - { - return false; - } - } - set - { - BatteryDelivery = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取plc任务状态电池安装中 - /// - public bool BatteryInstallation - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return BatteryInstallation; - } - else - { - return false; - } - } - set - { - BatteryInstallation = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读取plc任务状态电池安装完成 - /// - public bool BatteryInstallationComplete - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return BatteryInstallationComplete; - } - else - { - return false; - } - } - set - { - BatteryInstallationComplete = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 设置出口灯:绿灯(通知车辆可以驶离) - /// - public bool SetExitLightGreen - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return SetExitLightGreen; - } - else - { - return false; - } - } - set - { - SetExitLightGreen = value; - DataValidityTime = DateTime.Now; - } - } - /// - /// 读出口雷达是否感应触发 - /// - public bool ExitRadarSensingTrigger - { - get - { - if ((DateTime.Now - DataValidityTime).Seconds <= 2) - { - return ExitRadarSensingTrigger; - } - else - { - return false; - } - } - set - { - ExitRadarSensingTrigger = value; - DataValidityTime = DateTime.Now; - } - } - - /// - /// 写入口灯绿 - /// - /// - public bool SendLightGreen() - { - bool bResult = false; - if (Connected) - { - hostToPlc.LightIn.Value = 1000; - bResult = WriteUint16(hostToPlc.LightIn); - } - return bResult; - } - - /// - /// 下发选包数据给plc(入仓位 - /// - /// 1:缓存位舱位号 2-20 电池存储舱位 - /// - public bool SendSelectRuleIn(ushort loc) - { - bool bResult = false; - if (Connected) - { - hostToPlc.EntrySelection.Value = loc; - bResult = WriteUint16(hostToPlc.EntrySelection); - } - return bResult; - } - /// - /// 下发选包数据给plc(出仓位 - /// - /// 1:缓存位舱位号 2-20 电池存储舱位 - /// - public bool SendSelectRuleOut(ushort loc) - { - bool bResult = false; - if (Connected) - { - hostToPlc.ExitSelection.Value = loc; - bResult = WriteUint16(hostToPlc.ExitSelection); - } - return bResult; - } - - /// - /// 写入口灯:红灯 - /// - /// - public bool SendLightRed() - { - bool bResult = false; - if (Connected) - { - hostToPlc.LightIn.Value = 1020; - bResult = WriteUint16(hostToPlc.LightIn); - } - return bResult; - } - /// - /// 下发plc开启换电任务 - /// - /// - public bool SendTaskType() - { - bool bResult = false; - if (Connected) - { - hostToPlc.TaskType.Value = 1; - bResult = WriteUint16(hostToPlc.TaskType); - } - return bResult; - } - /// - /// 设置出口灯:绿灯 - /// - /// - public bool SendLightOutGreen() - { - bool bResult = false; - if (Connected) - { - hostToPlc.LightOut.Value = 1000; - bResult = WriteUint16(hostToPlc.LightOut); - } - return bResult; - } - /// - /// 设置出口灯:红灯 - /// - /// - public bool SendLightOutRed() - { - bool bResult = false; - if (Connected) - { - hostToPlc.LightOut.Value = 1020; - bResult = WriteUint16(hostToPlc.LightOut); - } - return bResult; - } - #endregion - - #region 有料检测 - /// - /// 有料检测 1-20仓 - /// - public byte MaterialDetec01 { get; set; } - public byte MaterialDetec02 { get; set; } - public byte MaterialDetec03 { get; set; } - public byte MaterialDetec04 { get; set; } - public byte MaterialDetec05 { get; set; } - public byte MaterialDetec06 { get; set; } - public byte MaterialDetec07 { get; set; } - public byte MaterialDetec08 { get; set; } - public byte MaterialDetec09 { get; set; } - public byte MaterialDetec10 { get; set; } - public byte MaterialDetec11 { get; set; } - public byte MaterialDetec12 { get; set; } - public byte MaterialDetec13 { get; set; } - public byte MaterialDetec14 { get; set; } - public byte MaterialDetec15 { get; set; } - public byte MaterialDetec16 { get; set; } - public byte MaterialDetec17 { get; set; } - public byte MaterialDetec18 { get; set; } - public byte MaterialDetec19 { get; set; } - public byte MaterialDetec20 { get; set; } - #endregion 有料检测 - - /// - /// 舱位状态 在位状态:0-不在位;1-在位;2-无效 - /// - /// - public List ReturnMaterialDetec() - { - List ret = new List - { - MaterialDetec01,MaterialDetec02 ,MaterialDetec03 ,MaterialDetec04 ,MaterialDetec05 , - MaterialDetec06 ,MaterialDetec07 ,MaterialDetec08 ,MaterialDetec09 ,MaterialDetec10 , - MaterialDetec11 ,MaterialDetec12 ,MaterialDetec13 ,MaterialDetec14 ,MaterialDetec15 , - MaterialDetec16 ,MaterialDetec17 ,MaterialDetec18 ,MaterialDetec19 ,MaterialDetec20 , - }; - return ret; - } - - - public PlcInfo(string channelId, int eqmSn) - { - ChannelId = channelId; - EqmSn = eqmSn; - } - - public bool WriteUint16(ModbusProperty value) - { - bool bResult = false; - ModbusSession session = SessionMgr.GetModbusSession(ChannelId); - bResult = session.Write(value); - return bResult; - } - - public bool Writeint16(ModbusProperty value) - { - bool bResult = false; - ModbusSession session = SessionMgr.GetModbusSession(ChannelId); - bResult = session.Write(value); - return bResult; - } - } -} \ No newline at end of file diff --git a/WebStarter/bin/Debug/net6.0/appsettings.json b/WebStarter/bin/Debug/net6.0/appsettings.json index f2a419d..0c208ae 100644 --- a/WebStarter/bin/Debug/net6.0/appsettings.json +++ b/WebStarter/bin/Debug/net6.0/appsettings.json @@ -1,73 +1,8 @@ { - "ConnectionStrings": { - "ConfigId": "master", - "DbType": "MySql", - "SqlConnection": //"server=192.168.2.2;Port=3306;Database=huanneng_dev;Uid=root;Pwd=Rszn123;Charset=utf8;", - "server=127.0.0.1;Port=3306;Database=huanneng_dev;Uid=root;Pwd=anyixing2023!@#;Charset=utf8;" - }, - "Update": { - "AutoUpdate": "false", - "Version": "1.1.0.1", - "Url": "http://121.4.95.243:8090/Updates/AutoUpdaterStarter.xml" - }, - "Redis": { - "Connection": "106.12.36.89:6379,password=123456", - "InstanceName": "local", - "DefaultDB": "8" - }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } - }, - "AllowedHosts": "*", - ",": null, - "Cryptogram": { - "StrongPassword": "false", // 是否开启密码强度验证 - "PasswordStrengthValidation": "(?=^.{6,16}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$", // 密码强度验证正则表达式,必须须包含大小写字母、数字和特殊字符的组合,长度在6-16之间 - "PasswordStrengthValidationMsg": "密码必须包含大小写字母、数字和特殊字符的组合,长度在6-16之间", // 密码强度验证消息提示 - "CryptoType": "SM2", // 密码加密算法:MD5、SM2、SM4 - "PublicKey": "0484C7466D950E120E5ECE5DD85D0C90EAA85081A3A2BD7C57AE6DC822EFCCBD66620C67B0103FC8DD280E36C3B282977B722AAEC3C56518EDCEBAFB72C5A05312", // 公钥 - "PrivateKey": "8EDB615B1D48B8BE188FC0F18EC08A41DF50EA731FA28BF409E6552809E3A111" // 私钥 - }, - //Login - "TokenOptions": { - "SecurityKey": "s4104j1401kopposdfjsfj091541111111111", - "Domain": "*", - "Audience": "jwtAudience", - "Issuer": "jwtIssuer" - }, - "Upload": { - "Path": "Upload/{yyyy}/{MM}/{dd}", // 文件上传目录 - "MaxSize": 20480, // 文件最大限制KB:1024*20 - "ContentType": [ "image/jpg", "image/png", "image/jpeg", "image/gif", "image/bmp", "text/plain", "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "video/mp4" ], - "EnableMd5": false // 启用文件MDF5验证-防止重复上传 - }, - //SysLogin - "JWTSettings": { - "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true - "IssuerSigningKey": "3c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a", // 密钥,string 类型,必须是复杂密钥,长度大于16 - "ValidateIssuer": true, // 是否验证签发方,bool 类型,默认true - "ValidIssuer": "Admin.NET", // 签发方,string 类型 - "ValidateAudience": true, // 是否验证签收方,bool 类型,默认true - "ValidAudience": "Admin.NET", // 签收方,string 类型 - "ValidateLifetime": true, // 是否验证过期时间,bool 类型,默认true,建议true - //"ExpiredTime": 20, // 过期时间,long 类型,单位分钟,默认20分钟,最大支持 13 年 - "ClockSkew": 5, // 过期时间容错值,long 类型,单位秒,默认5秒 - "Algorithm": "HS256", // 加密算法,string 类型,默认 HS256 - "RequireExpirationTime": true // 验证过期时间,设置 false 将永不过期 - }, - - - "SnowId": { - "WorkerId": 1, // 机器码 全局唯一 - "WorkerIdBitLength": 6, // 机器码位长 默认值6,取值范围 [1, 19] - "SeqBitLength": 6, // 序列数位长 默认值6,取值范围 [3, 21](建议不小于4,值越大性能越高、Id位数也更长) - "WorkerPrefix": "adminnet_" // 缓存前缀 - }, - - "HttpContextRequest": { - "Scheme": "http://192.168.2.17:5034" } } diff --git a/WebStarter/obj/Debug/net6.0/staticwebassets.build.json b/WebStarter/obj/Debug/net6.0/staticwebassets.build.json index 4271680..86164bd 100644 --- a/WebStarter/obj/Debug/net6.0/staticwebassets.build.json +++ b/WebStarter/obj/Debug/net6.0/staticwebassets.build.json @@ -1,6 +1,6 @@ { "Version": 1, - "Hash": "kIfehZk8TWWy62IgCKeVJMphEP8JJ0AGeTvs9NqLTfU=", + "Hash": "PUkZxlgk8KRfiyiYD55Dczq9Q9JYZyET99LUbVltauo=", "Source": "WebStarter", "BasePath": "_content/WebStarter", "Mode": "Default", @@ -10,17 +10,17 @@ { "Name": "WebStarter\\wwwroot", "Source": "WebStarter", - "ContentRoot": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\", + "ContentRoot": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\", "BasePath": "_content/WebStarter", "Pattern": "**" } ], "Assets": [ { - "Identity": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\20240523\\0.jpg", + "Identity": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\20240523\\0.jpg", "SourceId": "WebStarter", "SourceType": "Discovered", - "ContentRoot": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\", + "ContentRoot": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\", "BasePath": "_content/WebStarter", "RelativePath": "20240523/0.jpg", "AssetKind": "All", @@ -36,10 +36,10 @@ "OriginalItemSpec": "wwwroot\\20240523\\0.jpg" }, { - "Identity": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\20240524\\0.jpg", + "Identity": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\20240524\\0.jpg", "SourceId": "WebStarter", "SourceType": "Discovered", - "ContentRoot": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\", + "ContentRoot": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\", "BasePath": "_content/WebStarter", "RelativePath": "20240524/0.jpg", "AssetKind": "All", @@ -55,10 +55,10 @@ "OriginalItemSpec": "wwwroot\\20240524\\0.jpg" }, { - "Identity": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\20240524\\0.png", + "Identity": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\20240524\\0.png", "SourceId": "WebStarter", "SourceType": "Discovered", - "ContentRoot": "D:\\lxw\\work\\pro\\c#\\hn_back_main\\WebStarter\\wwwroot\\", + "ContentRoot": "D:\\RiderProjects\\hn_back_main\\WebStarter\\wwwroot\\", "BasePath": "_content/WebStarter", "RelativePath": "20240524/0.png", "AssetKind": "All", diff --git a/WinFormStarter/FrmPlc.cs b/WinFormStarter/FrmPlc.cs index 2e3514e..95c1d9b 100644 --- a/WinFormStarter/FrmPlc.cs +++ b/WinFormStarter/FrmPlc.cs @@ -1,19 +1,4 @@ using HslCommunication.ModBus; -using HslCommunication; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using HybirdFrameworkDriver.ModbusTcpMaster; -using HybirdFrameworkDriver.TcpServer; -using Newtonsoft.Json.Linq; -using Service.Init.Entity; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace WinFormStarter { diff --git a/WinFormStarter/Program.cs b/WinFormStarter/Program.cs index a16ff66..f0d3250 100644 --- a/WinFormStarter/Program.cs +++ b/WinFormStarter/Program.cs @@ -2,7 +2,6 @@ using Autofac; using HybirdFrameworkCore.Autofac; using HybirdFrameworkCore.Configuration; using log4net.Config; -using Service; using SqlSugar; using SqlSugar.IOC; @@ -59,4 +58,4 @@ internal static class Program var result = MessageBox.Show("系统发生错误,您需要退出系统吗?", "异常", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) Application.Exit(); } -} \ No newline at end of file +}