65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (21投票s)

2015年2月26日

CPOL

4分钟阅读

viewsIcon

142881

downloadIcon

4680

使用 C# 套接字编程为 NutRunner 开发开放协议

引言

在我的一个项目中,我曾有机会使用 C# 套接字编程创建一个 阿特拉斯·科普柯 PowerFocus (3000/4000) 螺栓枪工具的通讯。 当我开始螺栓枪工具通讯程序时,它就像一张白纸。 我对如何完成这项任务毫无头绪; 我在谷歌上搜索了几天,但找不到使用 C# 与螺栓枪工具通讯的示例代码。 最后,我使用开放协议获得了一个解决方案。 今天,我将向您解释什么是 C# 螺栓枪工具通讯的套接字通讯程序

您可以从 这个网站 下载开放协议文档。

阿特拉斯·科普柯 OpenProtocol 论坛

通讯消息

MID 0001 通讯开始

此消息启用通讯。 在此消息之前,控制器不会响应任何其他命令

  • 由:集成商发送的消息
  • 应答:MID 0002 通讯开始确认MID 0004 命令错误,客户端已连接

如果通讯被接受,我们可以接收到结果作为 MID 0002,如果不是,我们接收到 MID 0004。 有关 Open 协议的更多详细信息,请查阅附件的 Open 协议 PDF 文档。

用于螺栓枪工具通讯的 C# 套接字通讯程序

  1. 连接
  2. 通讯
  3. 数据发送和接收
  4. 断开连接

详细代码将列在下面。

背景

主要目标是为阿特拉斯·科普柯 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();
    }
}
  1. 首先,我们从命名空间声明开始
  2. 变量声明
  3. 连接(用于连接 Nutrunner 工具进行通讯)
  4. 扭矩数据接收
    • 由:集成商发送的消息
    • 应答:MID 0005 命令已接受或 MID 0004 命令错误,上次拧紧订阅已存在或 MID 版本不受支持
  5. 断开连接

关注点

我喜欢使用 HMI(人机界面程序)进行工作和娱乐。 我已经使用 C# 使用过几个 HML 程序,例如 PLC、传感器编程和螺栓枪工具通讯程序。 在使用此程序时,我没有得到实现结果的正确指导,但最终我让它工作了。 我希望阅读本文的最终用户能够从该程序中受益。

如果您喜欢我的文章,请给我留言并为我的文章投票。

历史

  • 2015 年 2 月 26 日:初始帖子
© . All rights reserved.