using System; using HH.WCS.Mobox3.Template.Entity.Dto; using HH.WCS.Mobox3.Template.Util.Helper; using S7.Net; namespace HH.WCS.Mobox3.Template.Util.EquipmentCommunication { /// /// 西门子S7线体服务帮助类 /// public class S7Helper { /// /// 连接plc /// /// public static void Link(Plc plc) { try { //if (!plc.IsConnected) //{ plc.Close(); plc.Open(); if (plc.IsConnected) LogHelper.Info($"已链接到plc{plc.IP}"); else LogHelper.Info($"plc{plc.IP}链接失败"); //} } catch (Exception ex) { LogHelper.Info($"plc{plc.IP}链接失败,err={ex.Message}"); } } /// /// 根据参数获取不同的plc连接 /// /// /// private static Plc GetPlc(string address) { // 获取指定plc Plc plc = null; plc = new Plc(CpuType.S71500, address, 0, 1); Link(plc); return plc; } /// /// 读取设备信息 - 输送线(数值类型) /// /// 偏移量起点 /// 设备信息 /// db块 /// 数据类型 /// public static int ReadPipelinePlcForInt(int startAddr, ConveyorlinesInfoDto conveyorlinesInfoDto, int dbNo, string dataType) { int data = 0; var plc = GetPlc(conveyorlinesInfoDto.address); if (plc != null) { try { if (plc.IsConnected) { if (dataType == "Int") // 读取plc信息 data = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr, VarType.Int, 1)); else if (dataType == "DInt") // 读取plc信息 data = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr, VarType.DInt, 1)); } else { data = -1; LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); } } catch (Exception e) { data = -1; LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); } } else { data = -1; LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); } return data; } /// /// 读取设备信息 - 输送线(字符串类型) /// /// 偏移量起点 /// 设备信息 /// db块 /// public static string ReadPipelinePlcForString(int startAddr, ConveyorlinesInfoDto conveyorlinesInfoDto, int dbNo) { string data = ""; var plc = GetPlc(conveyorlinesInfoDto.address); if (plc != null) { try { if (plc.IsConnected) { data = Convert.ToString(plc.Read(DataType.DataBlock, dbNo, startAddr, VarType.String, 24)); } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); } } catch (Exception e) { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); } } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); } return data; } /// /// 往设备写任务 - 输送线 /// /// /// /// /// /// public static bool SendTaskPipelinePlc(ConveyorlinesInfoDto conveyorlinesInfoDto, LineTaskDto lineTask, int startAddr, int dbNo) { var result = false; var plc = GetPlc(conveyorlinesInfoDto.address); if (plc != null) { try { if (plc.IsConnected) { // 写任务 // 任务号 plc.Write(DataType.DataBlock, dbNo, startAddr, Convert.ToInt32(lineTask.Task_No)); // 条形码 plc.Write(DataType.DataBlock, dbNo, startAddr + 4, lineTask.Pallet_No); // 写起点 plc.Write(DataType.DataBlock, dbNo, startAddr + 30, Convert.ToInt16(lineTask.Source_Station)); // 写终点 plc.Write(DataType.DataBlock, dbNo, startAddr + 32, Convert.ToInt16(lineTask.Destination_Station)); LogHelper.Info( $"线体编号{conveyorlinesInfoDto.devicesign},写入数据【任务号:{lineTask.Task_No}、条形码{lineTask.Pallet_No}、起点:{lineTask.Source_Station}、终点:{lineTask.Destination_Station}】", "PLC读写"); var taskNo = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr, VarType.DInt, 1)); var cntrCode = Convert.ToString(plc.Read(DataType.DataBlock, dbNo, startAddr + 4 ,VarType.String, 24)); var sourceStation = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr + 30, VarType.Int, 1)); var destinationStation = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr + 32, VarType.Int, 1)); result = lineTask.Task_No == taskNo; LogHelper.Info( $"线体编号{conveyorlinesInfoDto.devicesign},读取数据【任务号:{taskNo}、托盘号:{cntrCode}、起点:{sourceStation}、终点:{destinationStation}】,bool返回为{result}", "PLC读写"); } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); } } catch (Exception e) { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); } } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); } return result; } // /// // /// 往设备写数据 - 输送线 // /// // /// // /// // /// // /// // /// // public static bool SendTaskPipelinePlcTwo(ConveyorlinesInfoDto conveyorlinesInfoDto, PipeLineDto pipeLineDto, // int startAddr, int dbNo) // { // var result = false; // // var plc = GetPlc(conveyorlinesInfoDto.address); // // if (plc != null) // { // try // { // if (plc.IsConnected) // { // // 写任务 // plc.Write(DataType.DataBlock, dbNo, startAddr + 14, Convert.ToInt32(pipeLineDto.WCS_TaskNo)); // plc.Write(DataType.DataBlock, dbNo, startAddr + 18, // Convert.ToInt16(pipeLineDto.WCS_Destination)); // // LogHelper.Info( // $"线体编号{conveyorlinesInfoDto.devicesign},写入数据【任务号:{pipeLineDto.WCS_TaskNo}、目的地:{pipeLineDto.WCS_Destination}】", // "PLC读写"); // // var taskNo = // Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr + 14, VarType.DInt, 1)); // var destination = // Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr + 18, VarType.Int, 1)); // // result = pipeLineDto.WCS_TaskNo == taskNo; // // LogHelper.Info( // $"线体编号{conveyorlinesInfoDto.devicesign},读取数据【任务号:{taskNo}、目的地:{destination}】,bool返回为{result}", // "PLC读写"); // // } // else // { // LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); // } // } // catch (Exception e) // { // LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); // } // } // else // { // LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); // } // // return result; // } /// /// 往设备写数据 - 输送线(单条数据) /// /// /// /// /// /// public static bool WritePipelinePlcFromInt(ConveyorlinesInfoDto conveyorlinesInfoDto, int data, int startAddr, int dbNo) { var result = false; var plc = GetPlc(conveyorlinesInfoDto.address); if (plc != null) { try { if (plc.IsConnected) { // 写任务 plc.Write(DataType.DataBlock, dbNo, startAddr, Convert.ToInt16(data)); LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign},往偏移量{startAddr}写入数据{data}", "PLC读写"); var readData = Convert.ToInt32(plc.Read(DataType.DataBlock, dbNo, startAddr, VarType.Int, 1)); result = data == readData; LogHelper.Info( $"线体编号{conveyorlinesInfoDto.devicesign},往偏移量{startAddr}读取数据{readData},bool返回为{result}", "PLC读写"); } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); } } catch (Exception e) { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); } } else { LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); } return result; } // /// // /// 清理管道 - 输送线 // /// // /// // /// // /// // public static bool clearPipeLinePlc(ConveyorlinesInfoDto conveyorlinesInfoDto, int startAddr) // { // var result = false; // // var plc = GetPlc(conveyorlinesInfoDto.address); // // if (plc != null) // { // try // { // if (plc.IsConnected) // { // result = plc.WriteBytes(DataType.DataBlock, 500, startAddr, new byte[42]) == ErrorCode.NoError; // // var readBytes = plc.ReadBytes(DataType.DataBlock, 1000, startAddr + 6, 42); // // LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}管道清理,读取到的数据长度为{readBytes.Length}", // "PLC读写"); // } // else // { // LogHelper.Info($"线体编号{conveyorlinesInfoDto.devicesign}连接失败", "PLC读写"); // } // } // catch (Exception e) // { // LogHelper.Info($"堆垛机编号{conveyorlinesInfoDto.devicesign}异常报错:" + e, "PLC读写"); // } // } // else // { // LogHelper.Info($"堆垛机编号{conveyorlinesInfoDto.devicesign}的plc配置失败", "PLC读写"); // } // // return result; // } } }