阿特拉斯·科普柯 PowerFocus (3000/4000) / 螺栓枪工具 使用 C# 的以太网通讯






4.91/5 (21投票s)
使用 C# 套接字编程为 NutRunner 开发开放协议
引言
在我的一个项目中,我曾有机会使用 C# 套接字编程创建一个 阿特拉斯·科普柯 PowerFocus (3000/4000) 螺栓枪工具的通讯。 当我开始螺栓枪工具通讯程序时,它就像一张白纸。 我对如何完成这项任务毫无头绪; 我在谷歌上搜索了几天,但找不到使用 C# 与螺栓枪工具通讯的示例代码。 最后,我使用开放协议获得了一个解决方案。 今天,我将向您解释什么是 C# 螺栓枪工具通讯的套接字通讯程序。
您可以从 这个网站 下载开放协议文档。
通讯消息
MID 0001 通讯开始
此消息启用通讯。 在此消息之前,控制器不会响应任何其他命令
- 由:集成商发送的消息
- 应答:MID 0002 通讯开始确认 或 MID 0004 命令错误,客户端已连接。
如果通讯被接受,我们可以接收到结果作为 MID 0002,如果不是,我们接收到 MID 0004。 有关 Open 协议的更多详细信息,请查阅附件的 Open 协议 PDF 文档。
用于螺栓枪工具通讯的 C# 套接字通讯程序
- 连接
- 通讯
- 数据发送和接收
- 断开连接
详细代码将列在下面。
背景
主要目标是为阿特拉斯·科普柯 Power Focus (3000/4000) – 螺栓枪工具开发一个简单易用的 .NET 通讯程序。
Using the Code
代码非常简单,并且对所有函数都有注释。 主要目标是使程序非常简单易用; 项目中的所有函数都已进行了很好的注释。
using System.Net;
using System.IO;
using System.Net.Sockets;
Socket server;// Declare your Socket
IPEndPoint ip; // Declare your IPEndpoint
为了连接,我们需要螺栓枪工具的 IP 地址。 这里我的工具的 IP 地址是“10.126.224.186”,通讯的默认端口是“4545”。 请与您的硬件工程师核对您的工具上使用的端口。 在这里,我们使用套接字通讯程序进行连接。 连接成功后,我们需要向 NutRunner 工具发送通讯开始信号 “MID 0001” – (“00200001000000000000#)。
Server.Send()
String szData = "00200001000000000000#";//Nutrunner Communication Start
byte[] byData = Encoding.Default.GetBytes(szData);//convert the string as Byte
int sent = server.Send(byData, SocketFlags.None);
server.Receive()
byte[] bytesFrom = new byte[1025];
int iRx = server.Receive(bytesFrom);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
String resultchk = dataFromClient.Substring(4, 4).ToString();
如果我们将 MID 0002 作为结果接收到,则通讯开始成功。 如果我们将 MID 0004 作为结果接收到,则通讯开始时发生错误。 详细的连接功能
private void button1_Click(object sender, EventArgs e)
{
try
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
String ipaddress = “10.126.224.186”;
ip = new IPEndPoint(IPAddress.Parse(ipaddress), 4545);
server.Connect(ip);
label2.BackColor = System.Drawing.Color.GreenYellow;
label2.Text = "Connected";
connectServer();
}
catch (Exception ex)
{
}
}
private void connectServer()
{
try
{
if (server.Connected == false)
{
label2.BackColor = System.Drawing.Color.Red;
server = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
String ipaddress = textips.Text.Trim();
ip = new IPEndPoint(IPAddress.Parse(ipaddress), 4545);
server.Connect(ip);
label2.BackColor = System.Drawing.Color.GreenYellow;
label2.Text = "Connected";
}
if (server.Connected == true)
{
String szData = "00200001000000000000#"; //Nutrunner Communication Start
byte[] byData = Encoding.Default.GetBytes(szData);//System.Text.Encoding.ASCII.
//GetBytes(szData);
int sent = server.Send(byData, SocketFlags.None);
byte[] bytesFrom = new byte[1025];
// string bytesSent = server.Send(
int iRx = server.Receive(bytesFrom);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
String resultchk = dataFromClient.Substring(4, 4).ToString();
////String szData = "00200060000000000000#"; //Nutrunner
//Communication Start
////byte[] byData = Encoding.Default.GetBytes(szData);//System.Text.Encoding.
//ASCII.GetBytes(szData);
////int sent = server.Send(byData, SocketFlags.None);
timer1.Enabled = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
在这里,在我的程序中,我使用了一个 Timer
控件来接收扭矩数据。 在定时器中,我们经常检查连接。 如果连接失败,我们会重新连接到 NutRunner 工具。 为了接收扭矩数据,我们使用消息 ID MID 0060。 为了接收扭矩数据,我们向 Nutrunner 工具发送 MID 0060。
MID 0060 上次拧紧结果数据订阅
设置结果拧紧的订阅。 此命令的结果将是在拧紧执行后(推送功能)传输拧紧结果。 标题中的 MID 版本用于订阅 MID 0061 上次拧紧结果数据上传回复的不同版本。
发送数据以获取扭矩结果
String szData = "00200060000000000000#";//Torque data Request Send
byte[] byData = Encoding.Default.GetBytes(szData);
int sent = server.Send(byData, SocketFlags.None);
接收扭矩结果
byte[] bytesFrom = new byte[1025];
int iRx = server.Receive(bytesFrom);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
String resultchk = dataFromClient.Substring(4, 4).ToString();
我们接收到带有扭矩数据的 MID 0061 作为结果。 我们将收到类似这样的结果数据:“023100610010 010001020103airbag7 04KPOL3456JKLO897 05000600307000008000009010011112000840 130014001400120015000739160000017099991800000 1900000202001-06-02:09:54:09212001-05-29:12:34:3322123345675 NUL
”。 格式化结果字符串并获取最终的扭矩结果。 例如,我使用了子字符串并在这里获取了最终的扭矩结果
txtfinaltorque.Text = dataFromClient.Substring(132, 6).ToString();
详细的定时器代码
private void timer1_Tick(object sender, EventArgs e)
{
try
{
if (server.Connected == false)
{
label2.BackColor = System.Drawing.Color.Red;
label2.Text = "Not Connected";
server.Disconnect(true);
server.Close();
server.Dispose();
connectServer();
}
String szData = "00200060000000000000#";//Nutrunner Communication Start
byte[] byData = Encoding.Default.GetBytes(szData);//System.Text.Encoding.ASCII.
//GetBytes(szData);
int sent = server.Send(byData, SocketFlags.None);
byte[] bytesFrom = new byte[1025];
// string bytesSent = server.Send(
int iRx = server.Receive(bytesFrom);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
String resultchk = dataFromClient.Substring(4, 4).ToString();
if (resultchk == "0061")
{
label2.BackColor = Color.Violet;
label2.Text = "Torque Data Readed ";
textBox1.Text = dataFromClient.ToString();
txtcellid.Text = dataFromClient.Substring(22, 4).ToString();
txtchannelid.Text = dataFromClient.Substring(28, 2).ToString();
txtjobid.Text = dataFromClient.Substring(86, 2).ToString();
txtControlorName.Text = dataFromClient.Substring(32, 25).ToString();
txtBatchSize.Text = dataFromClient.Substring(95, 4).ToString();
txtBatchCount.Text = dataFromClient.Substring(101, 4).ToString();
txttighteningstatus.Text = dataFromClient.Substring(107, 1).ToString();
if (txttighteningstatus.Text.Trim() == "0")
{
txttighteningstatusok.Text = "NOK";
}
else
{
txttighteningstatusok.Text = "OK";
}
txttorquestatus.Text = dataFromClient.Substring(110, 1).ToString();
if (txttorquestatus.Text.Trim() == "0")
{
txttorquestatusok.Text = "Low";
}
else if (txttorquestatus.Text.Trim() == "1")
{
txttorquestatusok.Text = "OK";
}
else
{
txttorquestatusok.Text = "High";
}
txtanglestatus.Text = dataFromClient.Substring(113, 1).ToString();
txttorqueminlimit.Text = dataFromClient.Substring(116, 6).ToString();
txttorquemax.Text = dataFromClient.Substring(124, 6).ToString();
txtfinaltorque.Text = dataFromClient.Substring(132, 6).ToString();
txttorque.Text = dataFromClient.Substring(142, 2).ToString() + "." +
dataFromClient.Substring(144, 2).ToString();//dataFromClient.Substring(140,6).
//ToString()
txtTighteningID.Text = dataFromClient.Substring(221, 10).ToString();
String szData3 = "00200062000000000000#"; //Nutrunner Communication Start
byte[] byData3 = Encoding.Default.GetBytes(szData3);//System.Text.Encoding.ASCII.
//GetBytes(szData);
int sent3 = server.Send(byData3, SocketFlags.None);
}
}
catch (Exception ex)
{
}
}
检查连接,如果已连接,则在下面的详细代码中断开通讯
private void button2_Click(object sender, EventArgs e)
{
if (server.Connected == true)
{
label2.BackColor = System.Drawing.Color.Red;
label2.Text = "Not Connected";
server.Disconnect(true);
server.Close();
server.Dispose();
clears();
}
}
- 首先,我们从命名空间声明开始
- 变量声明
- 连接(用于连接 Nutrunner 工具进行通讯)
- 扭矩数据接收
- 由:集成商发送的消息
- 应答:MID 0005 命令已接受或 MID 0004 命令错误,上次拧紧订阅已存在或 MID 版本不受支持
- 断开连接
关注点
我喜欢使用 HMI(人机界面程序)进行工作和娱乐。 我已经使用 C# 使用过几个 HML 程序,例如 PLC、传感器编程和螺栓枪工具通讯程序。 在使用此程序时,我没有得到实现结果的正确指导,但最终我让它工作了。 我希望阅读本文的最终用户能够从该程序中受益。
如果您喜欢我的文章,请给我留言并为我的文章投票。
历史
- 2015 年 2 月 26 日:初始帖子