S7NETPLUS与西门子PLC通讯

S7NETPLUS是一款开源的程序库,用于与西门子PLC通讯,这里使用的是西门子S71200。

PLC需要做设置,允许上位机访问

添加一个数据块,取消”优化块的访问”

S7NET下载地址

链接:https://pan.baidu.com/s/1aAVIRIhUtcorQjlz9qWmOA

提取码:4b7d

C#编程,添加S7NET的引用

使用对象浏览器,查看要用到的几个函数

源代码如下

using System;

using System.Windows.Forms;

using S7.Net;

 

namespace WindowsFormsApplication5

{


public
partial
class
Form1 : Form

{


public Form1()

{

InitializeComponent();

}

 


Plc plc = null;

 


private
void Form1_Load(object sender, EventArgs e)

{

 

plc = new
Plc(CpuType.S71200,“192.168.1.12”,0,1);


try

{

plc.Open();

}


catch(Exception ex)

{


MessageBox.Show(错误信息:+ex.Message);

}

}

 


private
void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

plc.Close();

}

 


private
void btnRead_Click(object sender, EventArgs e)

{


Object obj = plc.Read(“DB1.DBW0”);


if(obj==null)

{


MessageBox.Show(数据读取错误!);

}


else

{


MessageBox.Show(Convert.ToInt16(obj).ToString());

}

}

 


private
async
void btnReadAsync_Click(object sender, EventArgs e)

{


Object obj = await plc.ReadAsync( DataType.DataBlock,1,0,VarType.Int,1 );


if (obj == null)

{


MessageBox.Show(数据读取错误!);

}


else

{


MessageBox.Show(obj.ToString());

}

}

 


private
void btnWrite_Click(object sender, EventArgs e)

{

plc.Write(“DB1.DBW0”,Convert.ToInt16(textBox1.Text));

}

}

}

2021年9月23日

Nmodbus4使用示例

Nmodbus4是一套开源的驱动程序,支持ModbusRTU,,ModbusASCII,ModbusTCP等,支持主从站模式,这里介绍基本的ModbusRTU主站的使用方法,详细的使用方法请参见帮助文档。

驱动文件和帮助文档下载地址:

链接:https://pan.baidu.com/s/1eK16kj9M19QvQwfT-Bvo1Q

提取码:o923

我们读取和写入个保持寄存器的的一个值。

代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.IO;

using System.IO.Ports;

using Modbus;

using Modbus.Data;

using Modbus.Device;

using Modbus.Extensions;

using Modbus.IO;

using Modbus.Message;

using Modbus.Utility;

using System.Threading;

 

namespace WindowsFormsApplication9

{


public
partial
class
Form1 : Form

{


public Form1()

{

InitializeComponent();

}

 


//定义主站


ModbusSerialMaster master = null;


private
void button1_Click(object sender, EventArgs e)

{


//读取保持寄存器0的值


ushort[] hr= master.ReadHoldingRegisters(1,0,1);

textBox1.Text = hr[0].ToString();

}

 


private
void Form1_Load(object sender, EventArgs e)

{


//初始化串口和主站

serialPort1.PortName = “COM5”;

serialPort1.BaudRate = 9600;

serialPort1.DataBits = 8;

serialPort1.StopBits = StopBits.One;

serialPort1.Parity = Parity.None;

serialPort1.Open();

 

master = ModbusSerialMaster.CreateRtu(serialPort1);

}

 


private
void button2_Click(object sender, EventArgs e)

{


//写入保持寄存器1,如从站返回错误,需要处理


try

{

master.WriteSingleRegister(1, 1, Convert.ToUInt16(textBox2.Text));

}


catch (SlaveException ex)

{


MessageBox.Show(ex.Message);

}

 

 

}

 


private
void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

serialPort1.Close();

master.Dispose();

}

 


private
async
void button3_Click(object sender, EventArgs e)

{


//异步读取保持寄存器0的值


ushort[] hr = await master.ReadHoldingRegistersAsync(1, 0, 1);

textBox1.Text = hr[0].ToString();

}

}

}