Как записать в Modbus TCP Master (регистр хранения) с TCP-ведомого устройства с помощью NModbusC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как записать в Modbus TCP Master (регистр хранения) с TCP-ведомого устройства с помощью NModbus

Сообщение Anonymous »

У меня есть простой код на C#, который пытается написать регистр Modbus с помощью nmodbus. Я не уверен, чего мне не хватает, но все регистры временного хранения в главном устройстве (видимые в MODScan) равны 0. Не знаете, почему?
Я ожидал увидеть значения в диапазоне 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(); will be called with/without exception

}

//_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;
}
}
Приведенный выше пример кода — это то, что я пробовал и не нашел никаких значений в modscan. Modscan подключается к подчиненному устройству, имеет хороший статус опроса и ответ, просто не может видеть значения, записанные с клиента.
Теперь я вижу значения в modscan. см. картинку. введите описание изображения здесь

Подробнее здесь: https://stackoverflow.com/questions/791 ... using-nmod
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как записать в Modbus TCP Master (регистр хранения) с TCP-ведомого устройства с помощью NModbus
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Как записать в Modbus TCP Master (регистр хранения) с TCP-ведомого устройства с помощью NModbus
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Linux C++ Modbus TCP подключает IO-Link Master (fen20-4iol) для управления EGP-50
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Linux C++ Modbus TCP подключает IO-Link Master (fen20-4iol) для управления EGP-50
    Anonymous » » в форуме Linux
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как мне прочитать регистр пирометра через NModbus на C#?
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»