用C#通过modbus tcp协议写master端接收plc传来的数据
用modbus tcp协议,在用户界面接收传来的数据,现在已经可以接收和显示传来的数据了,但想用户点击按钮之后界面上的数据实时变化,比如1s变化一次,该如何做?语言用的C#,下面贴出界面的代码,modbusTCP类用的就是从csdn下载的。只需要接收数据,不用写数据。
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 = "";
}
}
}
}
...全文
相关推荐
ModBus Tcp 通讯C# +Demo
ModBus TCP 是一种广泛使用的工业通信协议,它允许设备通过TCP/IP网络进行通信。在C#编程环境中,我们可以利用此协议来实现设备间的交互,例如读取或写入传感器数据、控制设备状态等。
台达PLC modbus通信上位机64位C#实例
Modbus通信协议允许不同设备通过串行或网络连接进行数据传输。在C#中实现Modbus通信,我们可以利用第三方库,如NModbus,这是一个开源的.NET实现,支持TCP和RTU两种模式。
C# Modbus TCP测试源码
Modbus TCP是工业自动化领域广泛使用的通信协议,它允许设备之间通过TCP/IP网络进行数据交换。
基恩士PLC通讯协议+代码实例
MODBUS协议:MODBUS协议分为ASCII、RTU和TCP三种模式,其中RTU模式常用于基恩士PLC。它通过定义功能码来执行不同的操作,如读取输入寄存器、写入单个寄存器等。2.
西门子SEP7-200smart PLC Modbus TCP通讯介绍及使用
Modbus TCP是一种广泛使用的工业以太网通信协议,允许不同设备间的透明数据交换。在本文中,我们将深入探讨如何使用西门子SEP7-200 SMART PLC进行Modbus TCP通信。


