110,536
社区成员
发帖
与我相关
我的任务
分享
public frmStart()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
static void Main()
{
Application.Run(new frmStart());
}
private void frmStart_Load(object sender, System.EventArgs e)
{
// Set standard format byte, make some textboxes
radBytes.Checked = true;
data = new byte[0];
ResizeData();
}
private void frmStart_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(MBmaster != null)
{
MBmaster.Dispose();
MBmaster = null;
}
Application.Exit();
}
// ------------------------------------------------------------------------
// Button connect
// ------------------------------------------------------------------------
private void btnConnect_Click(object sender, System.EventArgs e)
{
try
{
// Create new modbus master and add event functions
MBmaster = new Master(txtIP.Text, 502);
MBmaster.OnResponseData += new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData);
MBmaster.OnException += new ModbusTCP.Master.ExceptionData(MBmaster_OnException);
// Show additional fields, enable watchdog
grpExchange.Visible = true;
grpData.Visible = true;
}
catch(SystemException error)
{
MessageBox.Show(error.Message);
}
}
// ------------------------------------------------------------------------
// Button read coils
// ------------------------------------------------------------------------
private void btnReadCoils_Click(object sender, System.EventArgs e)
{
ushort ID = 1;
byte unit = Convert.ToByte(txtUnit.Text);
ushort StartAddress = ReadStartAdr();
byte Length = Convert.ToByte(txtSize.Text);
MBmaster.ReadCoils(ID, unit, StartAddress, Length);
}
// ------------------------------------------------------------------------
// Button read discrete inputs
// ------------------------------------------------------------------------
private void btnReadDisInp_Click(object sender, System.EventArgs e)
{
ushort ID = 2;
byte unit = Convert.ToByte(txtUnit.Text);
ushort StartAddress = ReadStartAdr();
byte Length = Convert.ToByte(txtSize.Text);
MBmaster.ReadDiscreteInputs(ID, unit, StartAddress, Length);
}
// ------------------------------------------------------------------------
// Button read holding register
// ------------------------------------------------------------------------
private void btnReadHoldReg_Click(object sender, System.EventArgs e)
{
ushort ID = 3;
byte unit = Convert.ToByte(txtUnit.Text);
ushort StartAddress = ReadStartAdr();
byte Length = Convert.ToByte(txtSize.Text);
MBmaster.ReadHoldingRegister(ID, unit, StartAddress, Length);
}
// ------------------------------------------------------------------------
// Button read holding register
// ------------------------------------------------------------------------
private void btnReadInpReg_Click(object sender, System.EventArgs e)
{
ushort ID = 4;
byte unit = Convert.ToByte(txtUnit.Text);
ushort StartAddress = ReadStartAdr();
byte Length = Convert.ToByte(txtSize.Text);
MBmaster.ReadInputRegister(ID, unit, StartAddress, Length);
}
private void MBmaster_OnResponseData(ushort ID, byte unit, byte function, byte[] values)
{
// ------------------------------------------------------------------
// Seperate calling threads
if (this.InvokeRequired)
{
this.BeginInvoke(new Master.ResponseData(MBmaster_OnResponseData), new object[] { ID, unit, function, values });
return;
}
// ------------------------------------------------------------------------
// Identify requested data
switch(ID)
{
case 1:
grpData.Text = "Read coils";
data = values;
ShowAs(null, null);
break;
case 2:
grpData.Text = "Read discrete inputs";
data = values;
ShowAs(null, null);
break;
case 3:
grpData.Text = "Read holding register";
data = values;
ShowAs(null, null);
break;
case 4:
grpData.Text = "Read input register";
data = values;
ShowAs(null, null);
break;
case 5:
grpData.Text = "Write single coil";
break;
case 6:
grpData.Text = "Write multiple coils";
break;
case 7:
grpData.Text = "Write single register";
break;
case 8:
grpData.Text = "Write multiple register";
break;
}
}
// ------------------------------------------------------------------------
// Modbus TCP slave exception
// ------------------------------------------------------------------------
private void MBmaster_OnException(ushort id, byte unit, byte function, byte exception)
{
string exc = "Modbus says error: ";
switch(exception)
{
case Master.excIllegalFunction: exc += "Illegal function!"; break;
case Master.excIllegalDataAdr: exc += "Illegal data adress!"; break;
case Master.excIllegalDataVal: exc += "Illegal data value!"; break;
case Master.excSlaveDeviceFailure: exc += "Slave device failure!"; break;
case Master.excAck: exc += "Acknoledge!"; break;
case Master.excGatePathUnavailable: exc += "Gateway path unavailbale!"; break;
case Master.excExceptionTimeout: exc += "Slave timed out!"; break;
case Master.excExceptionConnectionLost: exc += "Connection is lost!"; break;
case Master.excExceptionNotConnected: exc += "Not connected!"; break;
}
MessageBox.Show(exc, "Modbus slave exception");
}
// ------------------------------------------------------------------------
// Generate new number of text boxes
// ------------------------------------------------------------------------
private void ResizeData()
{
// Create as many textboxes as fit into window
grpData.Controls.Clear();
int x = 0;
int y = 10;
int z = 20;
while(y < grpData.Size.Width - 100)
{
labData = new Label();
grpData.Controls.Add(labData);
labData.Size = new System.Drawing.Size(30, 20);
labData.Location = new System.Drawing.Point(y, z);
labData.Text = Convert.ToString(x + 1);
txtData = new TextBox();
grpData.Controls.Add(txtData);
txtData.Size = new System.Drawing.Size(50, 20);
txtData.Location = new System.Drawing.Point(y + 30, z);
txtData.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
txtData.Tag = x;
x++;
z = z + txtData.Size.Height + 5;
if(z > grpData.Size.Height - 40)
{
y = y + 100;
z = 20;
}
}
}
// ------------------------------------------------------------------------
// Resize form elements
// ------------------------------------------------------------------------
private void frmStart_Resize(object sender, System.EventArgs e)
{
if(grpData.Visible == true) ResizeData();
}
// ------------------------------------------------------------------------
// Read start address
// ------------------------------------------------------------------------
private ushort ReadStartAdr()
{
// Convert hex numbers into decimal
if(txtStartAdress.Text.IndexOf("0x", 0, txtStartAdress.Text.Length) == 0)
{
string str = txtStartAdress.Text.Replace("0x", "");
ushort hex = Convert.ToUInt16(str, 16);
return hex;
}
else
{
return Convert.ToUInt16(txtStartAdress.Text);
}
}
// ------------------------------------------------------------------------
// Show values in selected way
// ------------------------------------------------------------------------
private void ShowAs(object sender, System.EventArgs e)
{
RadioButton rad;
if(sender is RadioButton)
{
rad = (RadioButton) sender;
if(rad.Checked == false) return;
}
bool[] bits = new bool[1];
int[] word = new int[1];
// Convert data to selected data type
if(radBits.Checked == true)
{
BitArray bitArray = new BitArray(data);
bits = new bool[bitArray.Count];
bitArray.CopyTo(bits, 0);
}
if(radWord.Checked == true)
{
if(data.Length < 2) return;
word = new int[data.Length/2];
for(int x=0;x<data.Length;x=x+2)
{
word[x/2] = data[x] * 256 + data[x+1];
}
}
// ------------------------------------------------------------------------
// Put new data into text boxes
foreach(Control ctrl in grpData.Controls)
{
if (ctrl is TextBox)
{
int x = Convert.ToInt16(ctrl.Tag);
if(radBits.Checked)
{
if(x <= bits.GetUpperBound(0))
{
ctrl.Text = Convert.ToByte(bits[x]).ToString();
ctrl.Visible = true;
}
else ctrl.Text = "";
}
if(radBytes.Checked)
{
if(x <= data.GetUpperBound(0))
{
ctrl.Text = data[x].ToString();
ctrl.Visible = true;
}
else ctrl.Text = "";
}
if(radWord.Checked)
{
if(x <= word.GetUpperBound(0))
{
ctrl.Text = word[x].ToString();
ctrl.Visible = true;
}
else ctrl.Text = "";
}
}
}
}