2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C# TCP/IP与基恩士PLC通讯的最简方式

C# TCP/IP与基恩士PLC通讯的最简方式

时间:2020-02-21 20:03:34

相关推荐

C# TCP/IP与基恩士PLC通讯的最简方式

使用基恩士的上位链路通讯方式

本人实际项目中在用的。

官方通讯文档下载地址,直接看第8章即可。

说明文档下载地址

通讯使用TCP/IP协议,代码比较简单就直接贴了。

代码如下:

using System;using System.Collections.Generic;using System.Linq;using ;using .Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace WindowsFormsApp4{class TCP{readonly object obj = new object();string Str;public string STR//接收到的消息{get {return Str; }set {; }}Socket socketSend;//= new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);public bool Connect(string ip, int port){try{socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress IP = IPAddress.Parse(ip);IPEndPoint point = new IPEndPoint(IP, port); ;socketSend.Connect(point);ShowMsg("PLC连接成功");//开启新的线程,不停的接收服务器发来的消息//Thread c_thread = new Thread(Received);//c_thread.IsBackground = true;//c_thread.Start();return true;}catch (Exception){ShowMsg("请填写正确的IP地址和端口号!");return false;}}void ShowMsg(string str){Str = str;}/// <summary>/// 接收服务端返回的消息/// </summary>void Received(){try{//3M的缓存区byte[] buffer = new byte[1024];//实际接收到的有效字节数int len = socketSend.Receive(buffer);// 将接受到的数据存入到输入buffer中if (len == 0){//断连}Str = "";String str = Encoding.UTF8.GetString(buffer, 0, len);ShowMsg(str);}catch (Exception ex){//MessageBox.Show("接收数据出现异常!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}/// <summary>/// 向服务器发送消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public void Send(string msg){lock (obj){try{byte[] buffer = new byte[1024];buffer = Encoding.UTF8.GetBytes(msg + "\r");socketSend.Send(buffer);Thread.Sleep(10);Received();}catch (Exception ex){//MessageBox.Show(" 发送数据出现异常!" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}}}

连接PLC代码如下:

TCP PLC;//PLC连接public void PLC_link(){PLC = new TCP();PLC.Connect("192.168.1.1", 8501);}

这边演示读写,其他命令可以看文档解决。

举例只是方便大家看懂文档,需要注意的是空格和换行符不能少;

返回的数据是包含换行符和回车的。

读取PLC寄存器数据

格式:命令+空格+寄存器地址.数据格式+换行符(换行符写在Send方法里了)

//格式:命令+空格+寄存器地址.数据格式+换行符(换行符写在Send方法里了)PLC.Send("RD DM300");if (PLC.STR =="00001\r\n"){//寄存器DM300为1}else if(PLC.STR.Length == 4)//plc返回的非数据代码长度为4带有换行符和回车 例如:OK\r\n{}

写入PLC寄存器

写单个格式:命令+空格+寄存器地址.数据格式+空格+数据+换行符(换行符写在Send方法里了)

写多个格式:命令+空格+寄存器地址.数据格式+写入数量+空格+数据+空格+数据+。。。+换行符(换行符写在Send方法里了)

//写单个格式:命令+空格+寄存器地址.数据格式+空格+数据+换行符(换行符写在Send方法里了)PLC.Send("WR DM390 2");//改信号为2,扫码信号返回if (PLC.STR.Length == 4)//plc返回的非数据代码长度为4例如:OK\r\n{MessageBox.Show("PLC写入出错:" + PLC.STR);}// 写多个格式:命令+空格+寄存器地址.数据格式+写入数量+空格+数据+空格+数据+。。。+换行符(换行符写在Send方法里了)PLC.Send("WRS DM350.H 5 " + "数据1" + " " + "数据2" + " " + "数据3" + " " + "数据4" + " " + "数据5");//把分割好的信息发给plc

如有需要下面的是代码的下载链接:

下载连接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。