public partial class MainForm : Form
{
ModbusTcp modbusTcp;
#region 界面初始化、加载、初始化参数
public MainForm()
{
InitializeComponent();
this.CenterToParent();
rtbx_Message.ForeColor = Color.Gray;
}
private void MainForm_Load(object sender, EventArgs e)
{
Initialize();
}
private void Initialize()
{
modbusTcp = new ModbusTcp();
modbusTcp.RequestMessage += ModbusTcp_RequestMessage;
modbusTcp.ResponseMessage += ModbusTcp_ResponseMessage;
//控件
ControlStateUpdate();
string[] funcCodes = { "01_读取线圈","02_读取离散输入",
"03_读取保持寄存器", "04_读取输入寄存器",
"05_写单个线圈", "06_写单个寄存器",
"15_写多个线圈", "16_写多个寄存器" };
cbx_FuncCode.DataSource = funcCodes;
}
#endregion
#region 事件方法
private void btn_Connect_Click(object sender, EventArgs e)
{
try
{
if (modbusTcp == null) return;
if (!modbusTcp.IsConnected)
{
modbusTcp.Connect(tbx_IPAddress.Text);
MessageUpdate("连接成功...", Color.Green);
ControlStateUpdate();
}
else
{
modbusTcp.Disconnect();
ControlStateUpdate();
MessageUpdate("断开连接...", Color.Red);
}
}
catch (Exception ex)
{
MessageUpdate(ex.Message, Color.Red);
modbusTcp.Disconnect();
ControlStateUpdate();
}
}
private void btn_ReadData_Click(object sender, EventArgs e)
{
if (!modbusTcp.IsConnected)
{
MessageUpdate("ModbusTCP未连接!!!请连接后再尝试读取数据...",Color.Red);
return;
}
bool[] coils = null;
ushort[] registers = null;
switch (modbusTcp.FuncCode)
{
case "01":
coils = modbusTcp.ReadCoils(modbusTcp.DataModel.ReadStartAddress, modbusTcp.DataModel.ReadDataLength);
MessageUpdate($"[{modbusTcp.DataModel.ReadStartAddress}][{ArrayToString(coils)}]",
Color.Blue, $"# 读取 线圈 >");
break;
case "02":
coils = modbusTcp.ReadDiscreteInputs(modbusTcp.DataModel.ReadStartAddress, modbusTcp.DataModel.ReadDataLength);
MessageUpdate($"[{modbusTcp.DataModel.ReadStartAddress}][{ArrayToString(coils)}]",
Color.Blue, $"# 读取 离散输入>");
break;
case "03":
registers = modbusTcp.ReadHoldingRegisters(modbusTcp.DataModel.ReadStartAddress, modbusTcp.DataModel.ReadDataLength);
MessageUpdate($"[{modbusTcp.DataModel.ReadStartAddress}][{ArrayToString(registers)}]",
Color.Blue, $"# 读取 保持寄存器 >");
break;
case "04":
registers = modbusTcp.ReadInputRegisters(modbusTcp.DataModel.ReadStartAddress, modbusTcp.DataModel.ReadDataLength);
MessageUpdate($"[{modbusTcp.DataModel.ReadStartAddress}][{ArrayToString(registers)}]",
Color.Blue, $"# 读取 输入寄存器 >");
break;
}
}
private void btn_SendData_Click(object sender, EventArgs e)
{
byte[] responseData = null;
switch (modbusTcp.FuncCode)
{
case "05":
string coil = rtbx_SendData.Text.Trim().ToLower();
if (coil.Equals("true")|| coil.Equals("false"))
{
responseData = modbusTcp.WriteSingleCoil(modbusTcp.DataModel.ReadStartAddress, coil.Equals("true")? true:false);
MessageUpdate($"{coil}", Color.Green, $"# 写入 单个线圈 >");
}
else
MessageUpdate($"请输入有效数值类型...如:true 或 false", Color.Red, $"# 写入数据 >");
break;
case "06":
string register = rtbx_SendData.Text.Trim().ToLower();
if (ushort.TryParse(register, out ushort result))
{
responseData = modbusTcp.WriteSingleRegister(modbusTcp.DataModel.ReadStartAddress, result);
MessageUpdate($"{register}", Color.Green, $"# 写入 单个寄存器 >");
}
else
MessageUpdate($"请输入有效数值类型...如:0,1,2,3...", Color.Red, $"# 写入数据 >");
break;
case "15":
responseData = modbusTcp.WriteMultipleCoils(modbusTcp.DataModel.ReadStartAddress, ParseArray<bool>(rtbx_SendData.Text));
MessageUpdate($"{ArrayToString(ParseArray<bool>(rtbx_SendData.Text))}", Color.Green, $"# 写入 多个线圈 >");
break;
case "16":
responseData = modbusTcp.WriteMultipleRegisters(modbusTcp.DataModel.ReadStartAddress, ParseArray<ushort>(rtbx_SendData.Text));
MessageUpdate($"{ArrayToString(ParseArray<ushort>(rtbx_SendData.Text))}", Color.Green, $"# 写入 寄存器 >");
break;
}
}
private void btn_ClearMessage_Click(object sender, EventArgs e)
{
rtbx_Message.Clear();
}
private void btn_ClearSendData_Click(object sender, EventArgs e)
{
rtbx_SendData.Clear();
}
private void rtbx_Message_TextChanged(object sender, EventArgs e)
{
label_RecvLine.Text = $"row:{rtbx_Message.Lines.Length}";
}
/// <summary>
/// 响应报文
/// </summary>
private void ModbusTcp_ResponseMessage(object sender, ModbusMessageEvents args)
{
if (checkBox_PrintResponseMessage.Checked)
{
ModbusMessageEvents message = args as ModbusMessageEvents;
MessageUpdate($"{ArrayToHex<byte>(message.Message)}", Color.Blue, $"# 接收:响应报文 >");
}
}
/// <summary>
/// 请求报文
/// </summary>
private void ModbusTcp_RequestMessage(object