使用基恩士的上位链路通讯方式
本人实际项目中在用的。
官方通讯文档下载地址,直接看第8章即可。
说明文档下载地址
通讯使用TCP/IP协议,代码比较简单就直接贴了。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.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
如有需要下面的是代码的下载链接:
下载连接