Я ожидал увидеть значения в диапазоне 40001–40005. .
Код: Выделить всё
public class ModbusManager
{
private static System.Timers.Timer Modbus_Poll_Timer;
private const string PrimarySerialPortName = "COM4";
private const string SecondarySerialPortName = "COM2";
// public ModbusSlave _slave;
public int _ModbusMode = 1; //0 = Serial , 1 = TCP
private readonly IModbusFactory _modbusFactory;
private IModbusMaster _master;
private TcpClient _tcpClient;
// private imodbus
private IModbusSlaveNetwork _slaveNetwork;
private TcpListener _tcpListener;
IPAddress iphost = IPAddress.Any;
IPAddress ipclient = IPAddress.Any;
int tcpport = 502;
byte _slaveid = 1;
private static Action _Action; // = new Action(() => Update()
TestCtrlMgr _TestCtrl;
MainWindowModel _Model;
object mylock = new object();
public ModbusManager(MainWindowModel model)
{
_Model = model;
_TestCtrl = _Model.m_TestCtrlMgr;
_modbusFactory = new ModbusFactory();
ipclient = System.Net.IPAddress.Parse("192.168.1.108"); //my dev laptop , client
// ip = new IPAddress(new byte[] { 192, 168, 1, 82 }); //server pc where modscan runs
//192.168.1.82
if (_ModbusMode == 0)
OpenDevice(); //open slave device
else
OpenTCPDevice();
Modbus_Poll_Timer = new System.Timers.Timer();
// TGA_Poll_Timer.Interval = 3000;
Modbus_Poll_Timer.Interval = 1000;
// Hook up the Elapsed event for the timer.
Modbus_Poll_Timer.Elapsed += OnModbusTimerEvent;
// Have the timer fire repeated events (true is the default)
Modbus_Poll_Timer.AutoReset = true;
// Start the timer
Modbus_Poll_Timer.Enabled = true;
_Action = new Action(() => Exchange());
}
private void Exchange()
{
try
{
_Model.MainAppWindow.Dispatcher.Invoke(_Action /*new Action(() => Update())*/);
}
catch (Exception ex)
{
}
}
~ModbusManager()
{
}
private void OnModbusTimerEvent(object sender, ElapsedEventArgs e)
{
//var performanceData = _devicePerformance.GetPerformanceInfo();
//periodically write data to modbus master;
lock(mylock)
{
WriteData();
}
}
public void WriteData()
{
ushort address = 0; //0 = 40001 for WriteMultipleRegs
ushort[] registers = new ushort[] { 1, 2, 3,4,5 };
Write(_slaveid, address, registers);
}
public void OpenDevice() //opens slave device
{
using (SerialPort slavePort = new SerialPort(PrimarySerialPortName))
{
// configure serial ports
slavePort.BaudRate = 9600;
slavePort.DataBits = 8;
slavePort.Parity = Parity.None;
slavePort.StopBits = StopBits.One;
slavePort.Open();
// _master = _modbusFactory.CreateMaster(slavePort);
///// var slaveAdapter = new SerialPortAdapter(slavePort);
// create modbus slave on seperate thread
byte slaveId = 1;
/* _slave = ModbusSerialSlave.CreateAscii(slaveId, slavePort);
_slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
_slave.DataStore.DataStoreWrittenTo += DataStore_DataStoreWrittenTo;
// var listenTask = slave.ListenAsync();
_slave.ModbusSlaveRequestReceived += Slave_ModbusSlaveRequestReceived;
//_slave.*/
}
}
public void OpenTCPDevice() //opens slave device
{
CreateServer(ipclient, tcpport); //for reading
StartServer();
CreateMaster(ipclient, tcpport); //for writing
}
public void CreateMaster(IPAddress ip, int port)
{
if (_tcpClient != null)
return;
_tcpClient = new TcpClient();
// _tcpClient.Client.Connect(ip,port);
try
{
_tcpClient.Connect(ip, 502);
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
catch (System.Reflection.TargetInvocationException e)
{
Console.WriteLine("SocketException: {0}", e);
}
catch (System.Windows.Markup.XamlParseException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
_tcpClient.Close();
}
//_tcpClient.Connect(ip,502);
_master = _modbusFactory.CreateMaster(_tcpClient);
}
public void Write(byte unitId, ushort address, ushort[] data)
{
if (_master == null)
return;
try
{
_master.WriteMultipleRegisters(unitId, address, data);
}
catch (Exception e)
{
}
}
public void CreateServer(IPAddress ip, int port)
{
_tcpListener = new TcpListener(ip, port);
_tcpListener.Start();
_slaveNetwork = _modbusFactory.CreateSlaveNetwork(_tcpListener);
AddSlave(_slaveid);
}
public void AddSlave(byte unitId)
{
var slave = _modbusFactory.CreateSlave(unitId);
_slaveNetwork.AddSlave(slave);
}
public void StartServer()
{
_slaveNetwork.ListenAsync();
}
public void Dispose()
{
_master?.Dispose();
_master = null;
_tcpClient?.Close();
_tcpClient = null;
_slaveNetwork?.Dispose();
_slaveNetwork = null;
_tcpListener?.Stop();
_tcpListener = null;
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... using-nmod