iotgateway/Plugins/Plugin/ModbusSlaveService.cs

66 lines
2.5 KiB
C#
Raw Normal View History

2022-03-24 13:38:11 +00:00
using Microsoft.Extensions.Logging;
2022-02-16 15:10:52 +00:00
using System.Net;
using System.Net.Sockets;
using Modbus.Data;
using Modbus.Device;
2022-02-16 15:10:52 +00:00
namespace Plugin
{
public class ModbusSlaveService : IDisposable
{
2022-03-24 13:38:11 +00:00
private readonly ILogger<ModbusSlaveService> _logger;
2022-08-10 08:55:44 +00:00
readonly TcpListener _slaveTcpListener;
private readonly Timer _mSimulationTimer;
private readonly object _lock = new();
private readonly ModbusSlave _slave;
private Task _task;
2022-03-24 13:38:11 +00:00
public ModbusSlaveService(ILogger<ModbusSlaveService> logger)
2022-02-16 15:10:52 +00:00
{
2022-03-24 13:38:11 +00:00
_logger = logger;
2022-02-16 15:10:52 +00:00
byte slaveId = 1;
int port = 503;
IPAddress address = IPAddress.Any;
// create and start the TCP slave
2022-08-10 08:55:44 +00:00
_slaveTcpListener = new TcpListener(address, port);
_slaveTcpListener.Start();
_slave = ModbusTcpSlave.CreateTcp(slaveId, _slaveTcpListener);
_slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
_slave.ListenAsync();
_mSimulationTimer = new Timer(DoSimulation, null, 1000, 1000);
2022-03-24 13:38:11 +00:00
_logger.LogInformation($"Modbus Server Started");
2022-02-16 15:10:52 +00:00
}
private void DoSimulation(object state)
{
try
{
2022-08-10 08:55:44 +00:00
lock (_lock)
2022-02-16 15:10:52 +00:00
{
for (int i = 1; i <= 20; i++)
{
2022-08-10 08:55:44 +00:00
if (i != 1 || i != 2 || i != 7)
_slave.DataStore.HoldingRegisters[i] = (ushort)new Random().Next(0, short.MaxValue);
_slave.DataStore.InputRegisters[i] = (ushort)new Random().Next(0, short.MaxValue);
_slave.DataStore.CoilDiscretes[i] = new Random().Next() % 2 == 0;
_slave.DataStore.InputDiscretes[i] = new Random().Next() % 2 == 0;
2022-02-16 15:10:52 +00:00
}
2022-08-10 08:55:44 +00:00
_slave.DataStore.HoldingRegisters[1] = (ushort)new Random().Next(2000, 3000); //前端要用的温度
_slave.DataStore.HoldingRegisters[2] = (ushort)new Random().Next(4000, 7000);//湿度
_slave.DataStore.HoldingRegisters[7] = (ushort)new Random().Next(0, 10000);//随机值
2022-02-16 15:10:52 +00:00
}
}
catch (Exception ex)
{
2022-03-24 13:38:11 +00:00
_logger.LogError($"Modbus Server Error", ex);
2022-02-16 15:10:52 +00:00
}
}
public void Dispose()
{
2022-03-24 13:38:11 +00:00
_logger.LogError($"Modbus Server Dispose");
2022-08-10 08:55:44 +00:00
_mSimulationTimer.Dispose();
_slaveTcpListener.Stop();
2022-02-16 15:10:52 +00:00
}
}
}