|
|
|
|
using EasyModbus;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace MasterClient.Client
|
|
|
|
|
{
|
|
|
|
|
class ModbusMaster : ICommClient
|
|
|
|
|
{
|
|
|
|
|
private ModbusClient client;
|
|
|
|
|
|
|
|
|
|
public byte identifier = 1;
|
|
|
|
|
|
|
|
|
|
public ModbusMaster(byte identifier = 1)
|
|
|
|
|
{
|
|
|
|
|
client = new ModbusClient();
|
|
|
|
|
this.identifier = identifier;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Connect()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (client.Connected)
|
|
|
|
|
client.Disconnect();
|
|
|
|
|
|
|
|
|
|
client.Connect();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Disconnect()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
client.Disconnect();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool GetStatus()
|
|
|
|
|
{
|
|
|
|
|
if (client == null)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return client.Connected;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string ReadValue(string name)
|
|
|
|
|
{
|
|
|
|
|
if (!client.Connected)
|
|
|
|
|
throw new Exception("Disconnected status");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
int address;
|
|
|
|
|
|
|
|
|
|
if (!int.TryParse(name, out address))
|
|
|
|
|
throw new Exception("cannot parse as int");
|
|
|
|
|
|
|
|
|
|
string value = "";
|
|
|
|
|
if (address >= 40001 && address < 50000)
|
|
|
|
|
value = client.ReadHoldingRegisters(address - 40001, 1)[0].ToString();
|
|
|
|
|
else if (address >= 30001 && address < 40000)
|
|
|
|
|
value = client.ReadInputRegisters(address - 30001, 1)[0].ToString();
|
|
|
|
|
else if (address >= 10001 && address < 20000)
|
|
|
|
|
value = client.ReadInputRegisters(address - 10001, 1)[0].ToString();
|
|
|
|
|
else if (address >= 1 && address < 10000)
|
|
|
|
|
value = client.ReadCoils(address - 1, 1)[0].ToString();
|
|
|
|
|
else
|
|
|
|
|
throw new Exception("Address is unavailable. (0x, 1x, 3x, 4x only)");
|
|
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetServer(string ip, int port)
|
|
|
|
|
{
|
|
|
|
|
client.IPAddress = ip;
|
|
|
|
|
client.Port = port;
|
|
|
|
|
client.UnitIdentifier = this.identifier;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void WriteValue(string name, string value)
|
|
|
|
|
{
|
|
|
|
|
if (!client.Connected)
|
|
|
|
|
throw new Exception("Disconnected status");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 0x, 4x 만 쓰기 가능
|
|
|
|
|
int address;
|
|
|
|
|
|
|
|
|
|
if (!int.TryParse(name, out address))
|
|
|
|
|
throw new Exception("Cannot parse as int");
|
|
|
|
|
|
|
|
|
|
if (address >= 40001 && address < 50000)
|
|
|
|
|
{
|
|
|
|
|
int parsed = 0;
|
|
|
|
|
if (!int.TryParse(value, out parsed))
|
|
|
|
|
throw new Exception("Value is not integer");
|
|
|
|
|
|
|
|
|
|
client.WriteSingleRegister(address - 40001, parsed);
|
|
|
|
|
}
|
|
|
|
|
else if (address >= 1 && address < 10000)
|
|
|
|
|
{
|
|
|
|
|
bool parsed = false;
|
|
|
|
|
if (value == "0")
|
|
|
|
|
parsed = false;
|
|
|
|
|
else if (value == "1")
|
|
|
|
|
parsed = true;
|
|
|
|
|
else if (!bool.TryParse(value, out parsed))
|
|
|
|
|
throw new Exception("Value is not boolean");
|
|
|
|
|
|
|
|
|
|
client.WriteSingleCoil(address - 1, parsed);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw new Exception("Address is unavailable (0x, 4x only)");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|