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

143 lines
4.5 KiB

using NModbus;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace GummingControl
{
public class DTM
{
private static ModbusFactory modbusFactory;
private static IModbusMaster master;
private static string IP = "192.168.1.5";
private static int Port = 502;
public static void CreateLink()
{
if (!Global.IsRelease)
{
return;
}
//实际不起作用CancellationTokenSource cancellation = new CancellationTokenSource();
//cancellation.CancelAfter(TimeSpan.FromSeconds(1));
bool WaitDone = false;
bool AnyError = false;
bool IsExecuteDone = false;
Thread tr1 = new Thread(new ThreadStart((Action)(() =>
{
try
{
IsExecuteDone = false;
//初始化modbusmaster
modbusFactory = new ModbusFactory();
//在本地测试 所以使用回环地址,modbus协议规定端口号 502
var client = new TcpClient();
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
client.Connect(IP, Port);
master = modbusFactory.CreateMaster(client);
//设置读取超时时间
master.Transport.ReadTimeout = 1000;
master.Transport.Retries = 1;
master.Transport.WriteTimeout = 1000;
IsExecuteDone = true;
}
catch
{
AnyError = true;
}
WaitDone = true;
})));
tr1.IsBackground = true;
tr1.Start();
//timeout check thread
Thread tr2 = new Thread(new ThreadStart((Action)(() =>
{
try
{
Thread.Sleep(2000);
if (!IsExecuteDone)
{
AnyError = true;
tr1.Abort();
WaitDone = true;
}
}
catch { }
})));
tr2.IsBackground = true;
tr2.Start();
while (!WaitDone)
{
Thread.Sleep(50);
}
if (AnyError)
{
Global.DTMWaitError = true;
}
}
/// <summary>
///
/// </summary>
/// <param name="slaveAddress">0</param>
/// <param name="startAddress">0</param>
/// <param name="numberOfPoints">0</param>
/// <returns></returns>
public static ushort[] Read(byte slaveAddress, ushort startAddress, ushort numberOfPoints)
{
if (!Global.IsRelease)
{
return new ushort[] { (ushort)new Random().Next(800), (ushort)new Random().Next(200), 250, 310, 400, 330, 650, 210 };
}
try
{
ushort[] registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
return registerBuffer;
}
catch
{
//尝试两次重连
Thread.Sleep(100);
CreateLink();
ushort[] registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
return registerBuffer;
}
}
/// <summary>
///
/// </summary>
/// <param name="slaveAddress">0</param>
/// <param name="startAddress">0</param>
/// <param name="numberOfPoints">0</param>
/// <returns></returns>
public static void Write(byte slaveAddress, ushort startAddress, ushort value)
{
if (!Global.IsRelease)
{
return;
}
try
{
master.WriteSingleRegister(slaveAddress, startAddress, value);
}
catch
{
//尝试两次重连
Thread.Sleep(100);
CreateLink();
master.WriteSingleRegister(slaveAddress, startAddress, value);
}
}
}
}