Files
DevToolsAvalonia/常用工具集/Utility/Network/Mitsubishi/McHelper.cs
2025-08-26 08:37:44 +08:00

513 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using McProtocol.Mitsubishi;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace McProtocol
{
/// <summary>
/// MC协议通信帮助类
/// </summary>
public class McHelper : IDisposable
{
private McProtocolTcp plc;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
public McHelper(string ip, int port)
{
plc = new McProtocolTcp(ip, port, McFrame.MC3E);
}
public McHelper(string ip, int port, McFrame mcFrame)
{
plc = new McProtocolTcp(ip, port, mcFrame);
}
/// <summary>
/// 建立连接
/// </summary>
/// <returns></returns>
public bool Connect()
{
try
{
plc.Open();
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 退出后销毁
/// </summary>
public void Dispose()
{
plc.Dispose();
}
#region Int16读写操作
/// <summary>
/// 读取Int16数据
/// </summary>
/// <param name="address">地址:例如 D10</param>
/// <param name="value">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadInt16(string address, out short value)
{
short[] values = new short[1];
bool flag = ReadInts16(address, 1, out values);
if (!flag)
{
value = 0;
return false;
}
value = values[0];
return true;
}
/// <summary>
/// 读取Int16数据
/// </summary>
/// <param name="address">地址:例如 D10</param>
/// <param name="count">读取长度</param>
/// <param name="values">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadInts16(string address, int count, out short[] values)
{
try
{
//地址解析
values = plc.ReadInt16(address, count);
return true;
}
catch (Exception ex)
{
values = null;
return false;
}
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="value">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteInt16(string address, short value)
{
short[] values = new short[1];
values[0] = value;
return WriteInts16(address, values);
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="values">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteInts16(string address, short[] values)
{
try
{
plc.WriteInt16(address, values);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region UInt16读写操作
/// <summary>
/// 读取UInt16数据
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="value">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadUInt16(string address, out ushort value)
{
ushort[] values = new ushort[1];
bool flag = ReadUInts16(address, 1, out values);
if (!flag)
{
value = 0;
return false;
}
value = values[0];
return true;
}
/// <summary>
/// 读取UInt16数据
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="count">读取数量</param>
/// <param name="values">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadUInts16(string address, int count, out ushort[] values)
{
try
{
values = plc.ReadUInt16(address, count);
return true;
}
catch (Exception ex)
{
values = null;
return false;
}
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="value">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteUInt16(string address, ushort value)
{
ushort[] values = new ushort[1];
values[0] = value;
return WriteUInts16(address, values);
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="values">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteUInts16(string address, ushort[] values)
{
try
{
plc.WriteUInt16(address, values);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region Int32读写操作
/// <summary>
/// 读取Int32
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="value">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadInt32(string address, out int value)
{
int[] values;
bool flag = ReadInts32(address, 1, out values);
if (!flag)
{
value = 0;
return false;
}
value = values[0];
return true;
}
/// <summary>
/// 读取Int32
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="count">读取数量</param>
/// <param name="values">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadInts32(string address, int count, out int[] values)
{
try
{
//地址解析
values = plc.ReadInt32(address, count);
return true;
}
catch (Exception ex)
{
values = null;
return false;
}
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="value">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteInt32(string address, int value)
{
int[] values = new int[1];
values[0] = value;
return WriteInts32(address, values);
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="values">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteInts32(string address, int[] values)
{
try
{
plc.WriteInt32(address, values);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region UInt32读写操作
/// <summary>
/// 读取UInt32
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="value">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadUInt32(string address, out uint value)
{
uint[] values = new uint[1];
bool flag = ReadUInts32(address, 1, out values);
if (!flag)
{
value = 0;
return false;
}
value = values[0];
return true;
}
/// <summary>
/// 读取UInt32
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="count">读取数量</param>
/// <param name="values">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadUInts32(string address, int count, out uint[] values)
{
try
{
//地址解析
values = plc.ReadUInt32(address, count);
return true;
}
catch (Exception ex)
{
values = null;
return false;
}
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="value">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteUInt32(string address, uint value)
{
uint[] values = new uint[1];
values[0] = value;
return WriteUInts32(address, values);
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="values">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteUInts32(string address, uint[] values)
{
try
{
plc.WriteUInt32(address, values);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region Float读写操作
/// <summary>
/// 读取Float
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="value">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadFloat(string address, out float value)
{
float[] values;
bool flag = ReadFloats(address, 1, out values);
if (!flag)
{
value = 0;
return false;
}
value = values[0];
return true;
}
/// <summary>
/// 读取Float
/// </summary>
/// <param name="address">例如 D10</param>
/// <param name="count">读取数量</param>
/// <param name="values">返回数据</param>
/// <returns>读取成功还是失败</returns>
public bool ReadFloats(string address, int count, out float[] values)
{
try
{
//地址解析
values = plc.ReadFloat(address, count);
return true;
}
catch (Exception ex)
{
values = null;
return false;
}
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="value">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteFloat(string address, float value)
{
float[] values = new float[1];
values[0] = value;
return WriteFloats(address, values);
}
/// <summary>
/// 写入数据
/// </summary>
/// <param name="address">地址D100</param>
/// <param name="values">写入数据</param>
/// <returns>写入成功还是失败</returns>
public bool WriteFloats(string address, float[] values)
{
try
{
plc.WriteFloat(address, values);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region String读写操作
/// <summary>
/// 读取字符串
/// </summary>
/// <param name="address">地址,例如:D3200</param>
/// <param name="length">此处为地址长度例50表示字符串长度100</param>
/// <param name="str">读到的字符串</param>
/// <returns>返回读取成功还是失败</returns>
public bool ReadString(string address, int length, out string str)
{
try
{
ushort[] value = new ushort[length];
byte[] values = plc.ReadDeviceBlock(address, length, value);
List<byte> bytes = new List<byte>();
foreach (var item in value)
{
bytes.AddRange(BitConverter.GetBytes(item));
}
str = Encoding.GetEncoding("GB2312").GetString(bytes.ToArray());
return true;
}
catch (Exception ex)
{
str = string.Empty;
return false;
}
}
/// <summary>
/// 写入字符串
/// </summary>
/// <param name="address">地址,例如:D3200</param>
/// <param name="length">此处为地址长度例50表示字符串长度100</param>
/// <param name="str">写入的字符串</param>
/// <returns>返回写入成功还是失败</returns>
public bool WriteString(string address, int length, string str)
{
try
{
byte[] Bytes = new byte[length * 2];
byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);
if (bytes.Length > Bytes.Length)
{
for (int i = 0; i < Bytes.Length; i++)
{
Bytes[i] = bytes[i];
}
}
else
{
for (int i = 0; i < bytes.Length; i++)
{
Bytes[i] = bytes[i];
}
}
ushort[] value = new ushort[length];
for (int i = 0; i < length; i++)
{
value[i] = BitConverter.ToUInt16(Bytes, i * 2);
}
plc.WriteDeviceBlock(address, value);
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
}
}