using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkDriver.ModbusTcpMaster; using HybirdFrameworkDriver.TcpServer; using HybirdFrameworkEntity.DbModel; using HybirdFrameworkRepository.System; using HybirdFrameworkServices.Init.Entity; using HybirdFrameworkServices.Plc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HybirdFrameworkServices { [Scope("SingleInstance")] public class EquipmentInit { BsNetEqmParamInfoRepository _bsNetEqmParamInfoRepository; public EquipmentInit(BsNetEqmParamInfoRepository bsNetEqmParamInfoRepository) { _bsNetEqmParamInfoRepository = bsNetEqmParamInfoRepository; } /// /// 连接所有数据 /// /// public void Connect() { BsNetEqmParamInfo bsNetEqmParamInfo = new BsNetEqmParamInfo() { EqmTypeNo = 3, EqmTypeName = "", EqmCode = "", EqmSn = 3, NetAddr = "127.0.0.1", NetPort = "502", DestAddr = "1", }; // //PLC删除 // IEnumerable> queryConnectParams =; // _bsNetEqmParamInfoRepository.QueryConnectParams(new List() { 1, 2, 101 }); // int count = 0; // IEnumerable> connectParams = //queryConnectParams as IGrouping[] ?? queryConnectParams.ToArray(); // foreach (IGrouping device in connectParams) // { // Console.WriteLine(device.Key); // count = device.Key switch // { // //1 => ConnectCharger(device), // //101 => ConnectCharger(device), // //2 => ConnectWaterCooler(device), // 3 => ConnectPlc(device), // _ => // // 处理所有其他情况,可能抛出异常、记录日志或返回默认值 // throw new InvalidOperationException("Unknown device key: " + device.Key), // }; // } ConnectPlc(bsNetEqmParamInfo); } /// /// 连接PLC /// /// /// public int ConnectPlc(/*IGrouping param*/ BsNetEqmParamInfo p) { /*int connectNum = 0; foreach (var p in param) { connectNum++;*/ Thread thread = new Thread(() => ConnectPlcAsync(p)); thread.Start(); /*}*/ return 0; } private void ConnectPlcAsync(BsNetEqmParamInfo p) { bool connected = false; ModbusTcpMaster master = null; //PLC连接 while (!connected) { master = new ModbusTcpMaster() { Ip = "127.0.0.1", Port = 102, }; master.ReadAction = BatchReadPlc;//启动线程一直读 master.Duration = 3000; master.Duration = 3000; connected = master.Connect(); if (connected) { break; } Thread.Sleep(5000); } ModbusSession modbusSession = new ModbusSession(master); SessionMgr.RegisterModbusSession(master.connectId, modbusSession); SessionMgr.SetAttrModbus(modbusSession, "eqm_sn", p.EqmSn); PlcInfo waterColdInfo = new PlcInfo(master.connectId, p.EqmSn); ChargerStaticInfo.PlcInfos.TryAdd(p.EqmSn, waterColdInfo); } /** * 一直读 */ private static void BatchReadPlc(ModbusTcpMaster master) { int sn = (int)SessionMgr.GetAttrModbus(master.connectId, "eqm_sn"); ChargerStaticInfo.PlcInfos.TryGetValue(sn, out PlcInfo plcInfo); if (plcInfo == null) { return; } byte[]? bytes01 = master.BatchRead(0, 22); if (bytes01 != null) { ModbusDecoder.DecodeByT(bytes01, plcInfo.PlcReadAndWritten2); } byte[]? bytes02 = master.BatchRead(256, 170); if (bytes02 != null) { ModbusDecoder.DecodeByT(bytes02, plcInfo.PlcReadonly); } byte[]? bytes03 = master.BatchRead(39424, 108); if (bytes03 != null) { ModbusDecoder.DecodeByT(bytes03, plcInfo.PlcTurnsRatio); } byte[]? bytes04 = master.BatchRead(40960, 3);//写编程使能。本机modbus地址。波特率 byte[]? bytes05 = master.BatchRead(2566, 1);//校验位 byte[]? bytes06 = master.BatchRead(42, 1);//秒脉冲/无功电能选择 byte[]? bytes07 = master.BatchRead(48, 1);//电流接线反向 byte[]? bytes08 = master.BatchRead(4576, 1);//电表清零 if (bytes04 != null) { ModbusDecoder.DecodeByT(bytes04, plcInfo.PlcReadAndWritten1); } plcInfo.PlcReadAndWritten1.CheckBit = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes05, 0); plcInfo.PlcReadAndWritten1.PulsePerSecond = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes06, 0); plcInfo.PlcReadAndWritten1.CurrentReversal = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes07, 0); plcInfo.PlcReadAndWritten1.MeterReset = master.ModbusTcpNet.ByteTransform.TransUInt16(bytes08, 0); } } }