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;
// }
}
}