using Common.Const; using Entity.DbModel.Station; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.Const; using HybirdFrameworkDriver.ModbusTcpMaster; using log4net; using Repository.Station; using Service.Plc.Msg; namespace Service.Plc.Client; /// /// /// [Scope] public class PlcClient : ModbusTcpMaster { private static readonly ILog Log = LogManager.GetLogger(typeof(PlcClient)); public BinInfoRepository BinInfoRepository { get; set; } public EquipAlarmDefineRepository EquipAlarmDefineRepository { get; set; } public EquipAlarmRecordRepository EquipAlarmRecordRepository { get; set; } public EquipAlarmProcessRecordRepository EquipAlarmProcessRecordRepository { get; set; } public PlcClient() { ReadAction = BatchRead; Ip = "172.0.20.66"; Port = 502; Duration = 1000; AutoReConnect = true; ByteSeq = EndingConst.ByteSeq.BA; WordSeq= EndingConst.WordSeq.CD; } private void BatchRead(ModbusTcpMaster master) { PlcMgr.SendHear(); var bytes01 = master.BatchReadHolderRegister(1, 115); if (bytes01 != null) { PlcMgr.DataValidityTime = DateTime.Now; ModbusDecoder.Decode(bytes01, PlcMgr.HostToPlcData, EndingConst.ByteSeq.AB, EndingConst.WordSeq.DC); } var bytes02 = master.BatchReadHolderRegister(201, 222); if (bytes02 != null) { PlcMgr.DataValidityTime = DateTime.Now; ModbusDecoder.Decode(bytes02, PlcMgr.PlcToHostData, EndingConst.ByteSeq.AB, EndingConst.WordSeq.DC); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec01.Value, "1"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec02.Value, "2"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec03.Value, "3"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec04.Value, "4"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec05.Value, "5"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec06.Value, "6"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec07.Value, "7"); UpdateBinInfo(PlcMgr.PlcToHostData.MaterialDetec08.Value, "8"); } var bytes03 = master.BatchReadHolderRegister(701, 10); if (bytes03 != null) { PlcMgr.LastPlcFaultData = PlcMgr.PlcFaultData; PlcMgr.DataValidityTime = DateTime.Now; ModbusDecoder.Decode(bytes03, PlcMgr.PlcFaultData, EndingConst.ByteSeq.AB, EndingConst.WordSeq.DC); SaveAlarmInfo(PlcMgr.LastPlcFaultData.ErrorCode01.Value, PlcMgr.PlcFaultData.ErrorCode01.Value); SaveAlarmInfo(PlcMgr.LastPlcFaultData.ErrorCode03.Value, PlcMgr.PlcFaultData.ErrorCode03.Value); SaveAlarmInfo(PlcMgr.LastPlcFaultData.ErrorCode05.Value, PlcMgr.PlcFaultData.ErrorCode05.Value); SaveAlarmInfo(PlcMgr.LastPlcFaultData.ErrorCode07.Value, PlcMgr.PlcFaultData.ErrorCode07.Value); SaveAlarmInfo(PlcMgr.LastPlcFaultData.ErrorCode09.Value, PlcMgr.PlcFaultData.ErrorCode09.Value); } } private void SaveAlarmInfo(int lastErrorCode, int errorCode) { if (lastErrorCode == errorCode) { return; } string plc = "plc"; if (errorCode != 0) { EquipAlarmDefine? alarmDefine = EquipAlarmDefineRepository.SelectByEquipCodeAndErrorCode((int)EquipmentType.Plc, plc, errorCode.ToString()); if (alarmDefine == null) { Log.Error($"error code {errorCode} has no define"); return; } EquipAlarmRecord record = new EquipAlarmRecord() { EquipTypeCode = alarmDefine.EquipTypeCode, EquipCode = alarmDefine.EquipCode, ErrorCode = alarmDefine.ErrorCode, ErrorLevel = alarmDefine.ErrorLevel, ErrorMsg = alarmDefine.ErrorMsg, ProcessMethod = alarmDefine.ProcessMethod }; EquipAlarmRecordRepository.Insert(record); } else { EquipAlarmRecord? alarmRecord = EquipAlarmRecordRepository.SelectByEquipCodeAndErrorCode((int)EquipmentType.Plc, plc, errorCode.ToString()); if (alarmRecord != null) { EquipAlarmProcessRecord processRecord = new EquipAlarmProcessRecord() { EquipTypeCode = alarmRecord.EquipTypeCode, EquipCode = alarmRecord.EquipCode, ErrorCode =alarmRecord.EquipCode, ErrorLevel = alarmRecord.ErrorLevel, ErrorMsg = alarmRecord.ErrorMsg, ProcessMethod = alarmRecord.ProcessMethod, ProcessTime = DateTime.Now }; EquipAlarmProcessRecordRepository.Insert(processRecord); EquipAlarmRecordRepository.DeleteById(alarmRecord.Id); } } } private void UpdateBinInfo(int exists, string binNo) { if (exists == 0) BinInfoRepository.Update( it => new BinInfo(){ Exists = 0, BatteryNo = "-1", Soc = (decimal)-1, Soe = (decimal)-1, Soh = (decimal)-1, }, it => it.No == binNo); else BinInfoRepository.Update(it => it.Exists == 1, it => it.No == binNo); } }