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