不再为MES对接发愁!C#上位机三种通信模式详解与代码实现

193 阅读4分钟

前言

工业自动化场景中,设备的上位机与客户工厂MES(制造执行系统)对接十分常见。

通过这种对接,设备能够将产量、生产数据、故障信息等关键信息传输至客户服务器。部分客户还具备从服务器端远程控制设备启停、设置工艺参数等需求。

经过多年调试经验的积累,总结出三种常用的方法:DLL调用(近距离快)、Web Service和HttpClient(跨网能用)。本文将详细介绍这三种方法的具体实现过程。

正文

一、DLL调用:车间内网高频交互用这个

1、添加DLL

首先准备好所需的DLL文件,以项目"OmronFins"为例,右键点击项目,选择"添加"->"引用",在弹出的界面中找到并选中目标DLL,点击确定。

操作如下图所示:

双击添加的DLL,即可查看该DLL包含的方法:

若添加完成后出现报错,需检查依赖DLL是否缺失,将所有依赖DLL放置在项目的bin/Debug目录中(与exe文件放在一起)。

2、编写DLL调用代码

假设该DLL包含LoadData类,示例代码如下:

BIS.Communication.TestingBLL testingBll;//定义变量
private void button3_Click(object sender, EventArgs e)
{
    testingBll = new BIS.Communication.TestingBLL();//实例化
    testingBll.StrBarcode = "A123456789";//赋值
    //.......一系列操作
}

不同的封装类,其函数名和使用方法可能不同,通常客户会提供相关文档进行说明,开发者可参考文档进行调用。

Web Service:跨网、低频次交互用这个

1、添加引用

在项目"OmronFins"中,右键点击项目,选择"引用"->"服务引用",弹出对话框后,不要在引用输入框中输入内容,而是点击"高级"->"添加Web引用"。

操作如下图所示:

在弹出的界面中,URL(U)右边的输入框可输入客户提供的服务器地址:

  1. 获取URL

为方便演示,使用一个全网有效的URL,以天气预报查询URL为例:"www.webxml.com.cn/WebServices…

搜索成功后,点击添加引用:

添加完成后,显示"Web References"->cn.com.webxml.www:

  1. 编写代码

在界面的"Web接口"按钮上添加事件,示例代码如下:

private void button4_Click(object sender, EventArgs e)
{
    try
    {
        cn.com.webxml.www.WeatherWebService _weatherClient = new cn.com.webxml.www.WeatherWebService();
        string[] weatherInfo = _weatherClient.getWeatherbyCityName("上海");

        if (weatherInfo != null && weatherInfo.Length > 8)
        {
            // 整理显示内容
            string result = $"城市:{weatherInfo[1]}\r\n" +
                            $"更新时间:{weatherInfo[4]}rn" +
                            $"天气状况:{weatherInfo[10]}\r\n" +
                            $"温度:{weatherInfo[5]}rn" +
                            $"风向:{weatherInfo[7]}\r\n" +
                            $"湿度:{weatherInfo[7]}rn" +
                            $"今日提示:{weatherInfo[8]}";
            textBoxLog.Text = result;
        }
        else
        {
            textBoxLog.Text = "获取天气信息失败,可能是城市名称错误或接口返回格式变化";
        }
    }
    catch (TimeoutException)
    {
        textBoxLog.Text = "错误:请求超时,可能网络较慢";
    }
    catch (Exception ex)
    {
        textBoxLog.Text = $"查询失败:{ex.Message}";
    }
}

点击"Web接口"按钮,即可获取具体信息:

以上通过天气预报接口模拟了工厂MES接口使用WebService进行连接的过程。

使用HttpClient的方式(跨网、低频次交互,要求灵活性强用这个)

1、获取API接口及key

以测试获取上海的天气预报为例,首先打开聚合数据官网:www.juhe.cn,使用手机号注册账号(无需企业认证)。

按照以下步骤搜索"天气预报":

申请相关服务:

完成注册和认证后,最终申请成功:

这里提供一个示例API key(6d2465d2a144d3b8d17e0b050e00fbbd),供测试使用。

2、编写代码

在"http接口"按钮上添加点击事件,示例代码如下:

private void button5_Click(object sender, EventArgs e)
{
    string url = "http://v.juhe.cn/weather/index";
    string apiKey = "6d2465d2a144d3b8d17e0b050e00fbbd";

    Dictionary<string, string> data = new Dictionary<string, string>();
    data.Add("key", apiKey);
    data.Add("cityname", "上海");
    data.Add("dtype", "json");
    data.Add("format", "");

    using (System.Net.WebClient client = new WebClient())
    {
        // 关键:指定UTF-8编码,匹配API返回的编码
        client.Encoding = System.Text.Encoding.UTF8;

        string fullUrl = url + "?" + string.Join("&", data.Select(x => x.Key + "=" + x.Value));

        try
        {
            string responseContent = client.DownloadString(fullUrl);
            dynamic responseData = JsonConvert.DeserializeObject(responseContent);
            textBoxLog.Text = responseContent;
            if (responseData != null)
            {
                Console.WriteLine("Return Code: " + responseData["error_code"]);
                Console.WriteLine("Return Message: " + responseData["reason"]);
            }
            else
            {
                Console.WriteLine("json解析异常!");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("请检查其它错误" + ex.Message);
        }
    }
}

点击"http接口"按钮,即可获取具体信息:

总结

无论采用哪种方式,最终目的都是将数据和信息传输至客户的MES系统,并保存到客户服务器中。

以上介绍的三种方法(DLL调用、Web Service、HttpClient)是常用的对接方式。

在实际应用中,如果遇到问题,欢迎在评论区提问,大家一起探讨解决。

关键词

设备上位机、MES对接、DLL调用、Web Service、HttpClient、DLL调用、Web Service、HttpClient、PLC数据采集、MES对接、WinForm、策略模式、工厂模式、模块化架构

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

来源:mp.weixin.qq.com/s/FlzDJGW90ivv3sLSj-zUOQ