You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

597 lines
17 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HslCommunication;
using HslCommunication.Profinet.Melsec;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Aucma.Core.HwPLc
{
/// <summary>
/// 三菱PLC
/// </summary>
public class MelsecPlc : IPlc
{
private readonly log4net.ILog log = LogManager.GetLogger(typeof(MelsecPlc));
private MelsecMcNet melsecMcNet = null;
#region 构造函数
//public MelsecPlc()
//{
// if (!HslCommunication.Authorization.SetAuthorizationCode("ed1415f8-e06a-43ad-95f7-c04f7ae93b41"))
// {
// log.Info("HslCommunication激活失败");
// return;
// }
// log.Info("HslCommunication激活成功!");
// melsecMcNet = new MelsecMcNet();
// melsecMcNet.ConnectTimeOut = 2000;
//}
public MelsecPlc(string iP, int port)
{
//if (!HslCommunication.Authorization.SetAuthorizationCode("ed1415f8-e06a-43ad-95f7-c04f7ae93b41"))
//{
// //log.Info("HslCommunication激活失败");
// return;
//}
//Console.WriteLine("HwCommunication激活成功!");
if (!HslCommunication.Authorization.SetAuthorizationCode("ed1415f8-e06a-43ad-95f7-c04f7ae93b41"))
{
log.Info("HslCommunication激活失败");
return;
}
log.Info("HslCommunication激活成功!");
melsecMcNet = new MelsecMcNet();
melsecMcNet.ConnectTimeOut = 2000;
IsConnected = Connect(iP, port);//建立连接
}
#endregion
#region 注册
public bool Registed()
{
//if (!HslCommunication.Authorization.SetAuthorizationCode("ed1415f8-e06a-43ad-95f7-c04f7ae93b41"))
//{
// log.Info("HslCommunication激活失败");
// return false;
//}
Console.WriteLine("HwCommunication激活成功!");
melsecMcNet = new MelsecMcNet();
melsecMcNet.ConnectTimeOut = 2000;
return true;
}
#endregion
#region 是否连接
/// <summary>
/// 是否连接
/// </summary>
public bool IsConnected { get; set; }
#endregion
#region 建立连接
/// <summary>
/// 建立连接
/// </summary>
/// <param name="IP"></param>
/// <param name="port"></param>
/// <returns></returns>
public bool Connect(string iP, int port)
{
melsecMcNet.IpAddress = iP;//正式环境开启
melsecMcNet.Port = port;
// 如果网络不太理想,配置了两个端口,一个有问题,立即切换另一个的话,可以配置如下的代码
// melsecMcNet.GetPipeSocket().SetMultiPorts(new int[] { 5552, 5553, 5554, 5555});
try
{
// 先关闭再重连,防止多次重连
melsecMcNet.ConnectClose();
OperateResult connect = melsecMcNet.ConnectServer();
if (connect.IsSuccess)
{
IsConnected = true;
return true;
}
else
{
melsecMcNet.ConnectClose();
IsConnected = false;
//Console.WriteLine($"连接失败!【{iP}:{port}】{connect.Message} ");
return false;
}
}
catch (Exception ex)
{
log.Error(ex.Message);
IsConnected = false;
return false;
}
}
#endregion
#region 断开连接
/// <summary>
/// 断开连接
/// </summary>
/// <returns></returns>
public bool DisConnect()
{
return melsecMcNet.ConnectClose().IsSuccess;
}
#endregion
#region 读取byte数据
/// <summary>
/// 读取byte数据
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public byte[] ReadBytes(string address,ushort len)
{
byte[] bytes = null;
try
{
OperateResult<byte[]> read = melsecMcNet.Read(address, len);
if (read.IsSuccess)
{
byte[] code = new byte[read.Content.Length - 2];
Array.Copy(read.Content, 2, code, 0, 24);
string scode = Encoding.ASCII.GetString(code, 0, code.Length);
bytes = code;
}
}
catch (Exception ex)
{
log.Error("ReadBytes方法异常" + ex.ToString());
}
return bytes;
}
#endregion
#region 读取bool
/// <summary>
/// 读取bool
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public bool ReadBool(string address)
{
bool iflag = false;
try
{
OperateResult<bool> read = melsecMcNet.ReadBool(address);
if (read.IsSuccess)
{
iflag = read.Content;
}
return iflag;
}
catch (Exception ex)
{
log.Error("ReadBool方法异常" + ex.ToString());
}
return iflag;
}
#endregion
#region 读取int16
/// <summary>
/// 读取int16
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public int ReadInt16(string address)
{
int returnflag = 0;
try
{
OperateResult<Int16> read = melsecMcNet.ReadInt16(address);
if (read.IsSuccess)
{
returnflag = read.Content;
}
}
catch (Exception ex)
{
log.Error("ReadInt16方法异常" + ex.ToString());
}
return returnflag;
}
#endregion
#region 读取int32
/// <summary>
/// 读取int32
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public int ReadInt32(string address)
{
int returnflag = 0;
try
{
OperateResult<Int32> read = melsecMcNet.ReadInt32(address);
if (read.IsSuccess)
{
returnflag = read.Content;
}
}
catch (Exception ex)
{
log.Error("ReadInt32方法异常" + ex.ToString());
}
return returnflag;
}
#endregion
#region 读取string
/// <summary>
/// 读取string
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public string ReadString(string address)
{
string returnflag = "";
try
{
OperateResult<string> read = melsecMcNet.ReadString(address, 10);
if (read.IsSuccess)
{
returnflag = read.Content;
}
}
catch (Exception ex)
{
log.Error("ReadString方法异常" + ex.ToString());
}
return returnflag;
}
#endregion
#region 读取Float
/// <summary>
/// 读取Float
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public float ReadFloat(string address)
{
float flag = 0;
try
{
OperateResult<float> read = melsecMcNet.ReadFloat(address);
if (read.IsSuccess)
{
flag = read.Content;
}
}
catch (Exception ex)
{
log.Error("ReadFloat方法异常" + ex.ToString());
}
return flag;
}
#endregion
#region 读取Double
/// <summary>
/// 读取Double
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public double ReadDouble(string address)
{
double flag = 0;
try
{
OperateResult<double> read = melsecMcNet.ReadDouble(address);
if (read.IsSuccess)
{
flag = read.Content;
}
}
catch (Exception ex)
{
log.Error("ReadDouble方法异常" + ex.ToString());
}
return flag;
}
#endregion
#region 写入int16
/// <summary>
/// 写入int16
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool WriteInt16(string address, string value)
{
bool iflag = false;
try
{
OperateResult write = melsecMcNet.Write(address, short.Parse(value));
//Task<OperateResult<TimeSpan>> operateResult = melsecMcNet.Wait(address, short.Parse(value));
if (write.IsSuccess)
{
iflag = true;
}
else
{
iflag = false;
}
return iflag;
}
catch (Exception ex)
{
log.Error("WriteInt16方法异常" + ex.ToString());
return iflag;
}
}
#endregion
#region 写入int32
/// <summary>
/// 写入int32
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool WriteInt32(string address, int value)
{
bool iflag = false;
try
{
OperateResult write = melsecMcNet.Write(address, value);
if (write.IsSuccess)
{
iflag = true;
}
else
{
iflag = false;
}
return iflag;
}
catch (Exception ex)
{
log.Error("WriteInt32方法异常" + ex.ToString());
return iflag;
}
}
#endregion
#region 写入string
/// <summary>
/// 写入string
/// </summary>
/// <param name="address"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool WriteString(string address, string value)
{
bool iflag = false;
try
{
OperateResult write = melsecMcNet.Write(address, value);
if (write.IsSuccess)
{
iflag = true;
}
else
{
iflag = false;
}
}
catch (Exception ex)
{
log.Error("WriteString方法异常" + ex.ToString());
iflag = false;
}
return iflag;
}
#endregion
#region 写入byte
/// <summary>
/// 写入byte
/// </summary>
/// <param name="address"></param>
/// <param name="bytes"></param>
/// <returns></returns>
public bool WriteByte(string address, byte[] bytes)
{
bool iflag = false;
try
{
OperateResult write = melsecMcNet.Write(address, bytes);
if (write.IsSuccess)
{
iflag = true;
}
else
{
iflag = false;
}
}
catch (Exception ex)
{
log.Error("WriteByte方法异常" + ex.ToString());
iflag = false;
}
return iflag;
}
#endregion
#region 写入Float
/// <summary>
/// 写入byte
/// </summary>
/// <param name="address"></param>
/// <param name="bytes"></param>
/// <returns></returns>
public bool WriteFloat(string address, float value)
{
bool iflag = false;
try
{
OperateResult write = melsecMcNet.Write(address, value);
if (write.IsSuccess)
{
iflag = true;
}
else
{
iflag = false;
}
}
catch (Exception ex)
{
log.Error("WriteByte方法异常" + ex.ToString());
iflag = false;
}
return iflag;
}
#endregion
#region 心跳使用——喂狗
/// <summary>
/// 心跳使用
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<bool> Read(string address)
{
try
{
melsecMcNet.ReceiveTimeOut = 2000;
OperateResult<bool> read = melsecMcNet.ReadBool(address);
if (read.IsSuccess)
{
IsConnected = true;
return true;
}
else
{
var k = read.ErrorCode < 0 ? false : true;
if (k)
{
IsConnected = true;
return await Task.FromResult(IsConnected);
}
else
{
IsConnected = false;
return await Task.FromResult(IsConnected);
}
}
}
catch (Exception ex)
{
log.Error("ReadInt32方法异常" + ex.ToString());
}
return false;
}
#endregion
/// <summary>
/// 读取byte
/// </summary>
/// <param name="address">地址</param>
/// <param name="len">长度</param>
/// <returns></returns>
public byte[] Read(string address, ushort len)
{
OperateResult<byte[]> readbyte = melsecMcNet.Read(address, len);
if (readbyte.IsSuccess)
{
IsConnected = true;
return readbyte.Content;
}
else
{
//IsConnected = false;
Console.WriteLine($"读取失败信息:{readbyte.Message}");
return null;
}
}
/// <summary>
/// 读取byte高度位已转换
/// </summary>
/// <param name="address">地址</param>
/// <param name="len">长度</param>
/// <returns></returns>
public byte[] ReadByte(string address, ushort len)
{
OperateResult<byte[]> readbyte = melsecMcNet.Read(address, len);
if (readbyte.IsSuccess)
{
IsConnected = true;
return Reversal(readbyte.Content);
}
else
{
IsConnected = false;
return null;
}
}
public byte[] Reversal(byte[] nums)
{
byte[] by = new byte[nums.Length];
for (int i = 0; i < nums.Length - 1; i += 2)
{
fun1(ref nums[i], ref nums[i + 1]);
}
if (nums.Length % 2 == 0)
{
for (int i = 0; i < nums.Length; i++)
{
by[i] += nums[i];
}
}
else
{
for (int i = 0; i < nums.Length - 1; i++)
{
by[i] += nums[i];
}
}
return by;
}
public static void fun1(ref byte a, ref byte b)
{
byte temp;
temp = a;
a = b;
b = temp;
}
}
}