Files
TouchSocket/examples/Modbus/ModbusSlaveConsoleApp/Program.cs
若汝棋茗 890c2fce65 更新文档
2024-03-03 19:18:05 +08:00

174 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using TouchSocket.Core;
using TouchSocket.Modbus;
using TouchSocket.SerialPorts;
using TouchSocket.Sockets;
namespace ModbusSlaveConsoleApp
{
internal class Program
{
private static void Main(string[] args)
{
try
{
Enterprise.ForTest();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
var service = CreateModbusTcpSlave();
Console.ReadKey();
}
private static ModbusTcpSlave CreateModbusTcpSlave()
{
var service = new ModbusTcpSlave();
service.Setup(new TouchSocketConfig()
//监听端口
.SetListenIPHosts(7808)
.ConfigurePlugins(a =>
{
a.Add<MyModbusSlavePlugin>();
//当添加多个站点时需要禁用IgnoreSlaveId的设定
a.AddModbusSlavePoint()//添加一个从站站点
.SetSlaveId(1)//设置站点号
//.UseIgnoreSlaveId()//忽略站号验证
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
a.AddModbusSlavePoint()//再添加一个从站站点
.SetSlaveId(2)//设置站点号
//.UseIgnoreSlaveId()//忽略站号验证
.SetModbusDataLocater(new ModbusDataLocater()//设置数据区
{
//下列配置表示起始地址从1000开始10个长度
Coils = new BooleanDataPartition(1000, 10),
DiscreteInputs = new BooleanDataPartition(1000, 10),
HoldingRegisters = new ShortDataPartition(1000, 10),
InputRegisters = new ShortDataPartition(1000, 10)
});
})
);
service.Start();
Console.WriteLine("服务已启动");
//var modbusSlavePoint = service.GetSlavePointBySlaveId(slaveId: 1);
//var localMaster = modbusSlavePoint.ModbusDataLocater.CreateDataLocaterMaster();
//var coils = localMaster.ReadCoils(0, 1);
return service;
}
private static ModbusRtuOverTcpSlave CreateModbusRtuOverTcpSlave()
{
var service = new ModbusRtuOverTcpSlave();
service.Setup(new TouchSocketConfig()
//监听端口
.SetListenIPHosts(7810)
.ConfigurePlugins(a =>
{
a.Add<MyModbusSlavePlugin>();
a.AddModbusSlavePoint()//添加一个从站站点
.SetSlaveId(1)//设置站点号
.UseIgnoreSlaveId()//忽略站号验证
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
})
);
service.Start();
Console.WriteLine("服务已启动");
return service;
}
private static ModbusUdpSlave CreateModbusUdpSlave()
{
var service = new ModbusUdpSlave();
service.Setup(new TouchSocketConfig()
//监听端口
.SetBindIPHost(7809)
.ConfigurePlugins(a =>
{
a.Add<MyModbusSlavePlugin>();
a.AddModbusSlavePoint()//添加一个从站站点
.SetSlaveId(1)//设置站点号
.UseIgnoreSlaveId()//忽略站号验证
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
})
);
service.Start();
Console.WriteLine("服务已启动");
return service;
}
private static ModbusRtuOverUdpSlave CreateModbusRtuOverUdpSlave()
{
var service = new ModbusRtuOverUdpSlave();
service.Setup(new TouchSocketConfig()
//监听端口
.SetBindIPHost(7811)
.ConfigurePlugins(a =>
{
a.Add<MyModbusSlavePlugin>();
a.AddModbusSlavePoint()//添加一个从站站点
.SetSlaveId(1)//设置站点号
.UseIgnoreSlaveId()//忽略站号验证
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
})
);
service.Start();
Console.WriteLine("服务已启动");
return service;
}
private static ModbusRtuSlave CreateModbusRtuSlave()
{
var service = new ModbusRtuSlave();
service.Setup(new TouchSocketConfig()
//设置串口
.SetSerialPortOption(new SerialPortOption()
{
BaudRate = 9600,
DataBits = 8,
Parity = System.IO.Ports.Parity.Even,
PortName = "COM1",
StopBits = System.IO.Ports.StopBits.One
})
.ConfigurePlugins(a =>
{
a.Add<MyModbusSlavePlugin>();
a.AddModbusSlavePoint()//添加一个从站站点
.SetSlaveId(1)//设置站点号
//.UseIgnoreSlaveId()//如果不调用,默认会进行站号验证
.SetModbusDataLocater(new ModbusDataLocater(10, 10, 10, 10));//设置数据区
})
);
service.Connect();
Console.WriteLine("已连接COM端口");
return service;
}
}
internal class MyModbusSlavePlugin : PluginBase, IModbusSlaveExecutingPlugin, IModbusSlaveExecutedPlugin
{
public async Task OnModbusSlaveExecuted(IModbusSlavePoint sender, ModbusSlaveExecutedEventArgs e)
{
await Console.Out.WriteLineAsync("slavea操作数据完成");
await e.InvokeNext();
}
public async Task OnModbusSlaveExecuting(IModbusSlavePoint sender, ModbusSlaveExecutingEventArgs e)
{
//当想要拒绝操作时可以将IsPermitOperation = false并且e.ErrorCode可以携带返回错误码。
//e.IsPermitOperation = false;
//e.ErrorCode = ModbusErrorCode.ExecuteError;
await Console.Out.WriteLineAsync("slavea操作数据");
await e.InvokeNext();
}
}
}