У меня есть простой код на 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();
}
//_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 подключается к подчиненному устройству и имеет хороший статус опроса и ответ, но не может видеть значения, записанные с клиента.
У меня есть простой код на C#, который пытается написать регистр Modbus с помощью nmodbus. Я не уверен, чего мне не хватает, но все регистры временного хранения в главном устройстве (видимые в MODScan) равны 0. Не знаете, почему? Я ожидал увидеть значения в диапазоне 40001–40005. . [code]public class ModbusManager {
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());
} 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; } } [/code] Приведенный выше пример кода — это то, что я пробовал и не нашел никаких значений в modscan. Modscan подключается к подчиненному устройству и имеет хороший статус опроса и ответ, но не может видеть значения, записанные с клиента.
``
//У меня есть простой код на C#, который пытается записать регистр Modbus с помощью nmodbus. Я не уверен, чего мне // не хватает, но все регистры временного хранения в главном устройстве (видимые в MODScan) равны 0. Не знаю, почему?
//Я ожидал...
У меня есть простой код на C#, который пытается написать регистр Modbus с помощью nmodbus. Я не уверен, чего мне не хватает, но все регистры временного хранения в главном устройстве (видимые в MODScan) равны 0. Не знаете, почему?
Я ожидал увидеть...
Я использовал libmodbus для управления мастером io-link и мог прочитать значение регистра, но когда я попытался записать регистр для подтверждения EGP-50, его значение изменилось, но светодиод состояния моего EGP-50 стал зеленым Красный свет...
Я использовал libmodbus для управления мастером io-link и мог прочитать значение регистра, но когда я попытался записать регистр для подтверждения EGP-50, его значение изменилось, но светодиод состояния моего EGP-50 стал зеленым Красный свет...
Я новичок в MODBus, но раньше работал с Profibus/PLC. Я пытаюсь использовать пакет C# NModbus для связи с двумя пирометрами с использованием RS485. Система настроена так:
|Компьютер| -> |RS485 на USB| -> |Раб 1| -> |Slave 2|
Пирометры, которые я...