新生命码神工具,代码生成、网络工具、API工具、串口工具、正则工具、图标工具、加解密工具、地图接口。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
5.0 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using NewLife;
using NewLife.Log;
using NewLife.Net;
using NewLife.Security;
using NewLife.Threading;
using XCoder;
using XCoder.Common;
using XCoder.XNet;
namespace XNet
{
[Category("网络通信")]
[DisplayName("ModbusSlave")]
public partial class FrmModbusSlave : Form, IXForm
{
private ControlConfig _config;
private ILog _log;
private NetServer _Server;
private RegisterUnit[] _data;
#region 窗体
public FrmModbusSlave()
{
InitializeComponent();
// 动态调节宽度高度,兼容高DPI
this.FixDpi();
Icon = IcoHelper.GetIcon("Modbus");
}
private void FrmMain_Load(Object sender, EventArgs e)
{
_log = new TextControlLog { Control = txtReceive };
_config = new ControlConfig { Control = this, FileName = "ModbusSlave.json" };
_config.Load();
if (cbMode.SelectedIndex < 0) cbMode.SelectedIndex = 0;
txtReceive.SetDefaultStyle(12);
// 加载保存的颜色
UIConfig.Apply(txtReceive);
}
#endregion
#region 收发数据
private void btnConnect_Click(Object sender, EventArgs e)
{
var btn = sender as Button;
if (btn.Text == "开始")
{
var svr = new NetServer((Int32)numPort.Value)
{
Log = _log
};
svr.Received += OnReceived;
svr.Start();
_Server = svr;
ShowData();
pnlSetting.Enabled = false;
btn.Text = "停止";
_config.Save();
}
else
{
_Server.TryDispose();
_Server = null;
_timer.TryDispose();
pnlSetting.Enabled = true;
btn.Text = "开始";
}
}
private void ShowData()
{
var addr = (Int32)numAddress.Value;
var count = (Int32)numCount.Value;
var mode = cbMode.SelectedItem + "";
var list = new List<RegisterUnit>(count);
switch (mode)
{
case "0x0000":
for (var i = 0; i < count; i++)
{
list.Add(new RegisterUnit { Address = addr + i, Value = 0 });
}
break;
case "0x7777":
for (var i = 0; i < count; i++)
{
list.Add(new RegisterUnit { Address = addr + i, Value = 0x7777 });
}
break;
case "0xFFFF":
for (var i = 0; i < count; i++)
{
list.Add(new RegisterUnit { Address = addr + i, Value = 0xFFFF });
}
break;
case "递增":
for (var i = 0; i < count; i++)
{
list.Add(new RegisterUnit { Address = addr + i, Value = (UInt16)i });
}
break;
case "静态随机":
case "动态随机":
default:
for (var i = 0; i < count; i++)
{
list.Add(new RegisterUnit { Address = addr + i, Value = (UInt16)Rand.Next(UInt16.MaxValue) });
}
break;
}
if (mode == "动态随机") _timer = new TimerX(DoRefreshData, null, 1_000, 1_000);
_data = list.ToArray();
dataGridView1.DataSource = _data;
}
private TimerX _timer;
private void DoRefreshData(Object state)
{
if (_data == null) return;
for (var i = 0; i < _data.Length; i++)
{
var x = (Rand.Next(20) - 10) / 100.0;
_data[i].Value = (UInt16)(_data[i].Value * (1 + x));
}
//dataGridView1.DataSource = _data;
dataGridView1.Refresh();
}
private void OnReceived(Object sender, ReceivedEventArgs e)
{
var session = sender as ISocketSession;
if (session == null)
{
var ns = sender as INetSession;
if (ns == null) return;
session = ns.Session;
}
if (NetConfig.Current.ShowReceiveString)
{
var line = e.Packet.ToStr();
_log.Info(line);
}
}
private Int32 _pColor = 0;
private void timer1_Tick(Object sender, EventArgs e)
{
var cfg = NetConfig.Current;
if (cfg.ColorLog) txtReceive.ColourDefault(_pColor);
_pColor = txtReceive.TextLength;
}
#endregion
}
}