WinForm 集成 WebAPI:实现 Modbus 数据对外服务

33 阅读3分钟

前言

工业自动化领域,上位机软件不仅要完成数据采集和人机交互,越来越多的场景需要它对外提供数据服务。

尤其是在与MES、SCADA或其他管理系统集成时,通过WebApi方式暴露数据接口已成为一种高效、通用的解决方案。

本文将分享一个实用案例:如何在WinForm桌面应用程序中集成WebApi功能,实现对外提供数据服务。我们将以读取ModbusTCP设备数据为例,完整演示从设备连接到接口发布的全过程。

正文

案例的目标是开发一个WinForm应用程序,既能连接ModbusTCP设备采集数据,又能通过HTTP接口将这些数据提供给第三方系统使用。

整个实现过程清晰、实用,适合工业现场快速部署。

1、创建WinForm项目

首先,创建一个WinForm项目,并设计用户界面。界面主要包括两个部分:一是ModbusTCP设备的IP地址和端口配置,用于连接现场设备;二是本地WebApi服务的IP和端口设置,用于对外提供HTTP服务。

2、实现ModbusTCP连接

接下来是ModbusTCP设备的连接实现。通过NuGet安装xktComm库,它可以简化Modbus通信的开发工作。

连接设备的代码如下:

private void btn_Connect_Click(object sender, EventArgs e)
{
    if (CommonMethods.modbusTcp.Connect(this.txt_DevIp.Textthis.txt_DevPort.Text))
    {
        MessageBox.Show("设备连接成功");
    }
    else
    {
        MessageBox.Show("设备连接失败");
    }
}

断开连接的代码则更为简单:

private void btn_DisConn_Click(object sender, EventArgs e)
{
    CommonMethods.modbusTcp.DisConnect();
}

然后是WebAPI服务的搭建。

3、创建 HttpServer

通过NuGet安装两个关键包:

Microsoft.AspNet.WebApi.Client 和 Microsoft.AspNet.WebApi.SelfHost,它们支持在非IIS环境中自托管WebApi。

我们封装一个HttpServer类,用于管理HTTP服务的启动与关闭:

public class HttpServer
{
    private HttpSelfHostServer server;

    public HttpServer(string ip, int port)
    {
        var config = new HttpSelfHostConfiguration($"http://{ip}:{port}");
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute("DefaultApi""api/{controller}/{action}");
        server = new HttpSelfHostServer(config);
    }

    public Task StartHttpServer()
    {
        return server.OpenAsync();
    }

    public Task CloseHttpServer()
    {
        return server.CloseAsync();
    }
}

4、控制器

接着,创建一个控制器HomeController,用于处理HTTP请求。

以下示例实现了读取保持寄存器的功能:

public class HomeController : ApiController
{
    [HttpGet]
    public IHttpActionResult ReadKeepReg(int address)
    {
        byte[] res = CommonMethods.modbusTcp.ReadKeepReg(address, 1);
        return Json(res[0]*256+res[1]);
    }
}

5、开启HttpServer

最后,在WinForm界面中添加启动和停止Web服务的按钮。

启动服务的代码如下:

private async void btn_Start_Click(object sender, EventArgs e)
{
    try
    {
        httpServer = new HttpServer(this.txt_Ip.Text, int.Parse(this.txt_Port.Text));
        await httpServer.StartHttpServer();
        MessageBox.Show("开始服务成功");
    }
    catch (Exception ex)
    {
        MessageBox.Show("开始服务失败:"+ex.Message);
    }
}

停止服务的代码:

private async void btn_Stop_Click(object sender, EventArgs e)
{
    try
    {
        httpServer = new HttpServer(this.txt_Ip.Text, int.Parse(this.txt_Port.Text));
        await httpServer.CloseHttpServer();
    }
    catch (Exception ex)
    {
        MessageBox.Show("停止服务失败:" + ex.Message);
    }
}

功能测试

为了验证功能,我们使用Modbus Slave创建一个仿真设备。

运行WinForm程序,连接设备并启动Web服务后,在浏览器中访问:

http://127.0.0.1:2000/api/home/ReadKeepReg?address=0

即可获取到寄存器40001的数值,说明接口已成功返回数据。

总结

通过本文的实践,我们成功地在WinForm应用程序中集成了WebApi功能,实现了从设备数据采集到对外服务发布的完整链路。

这种方式不仅提升了上位机软件的集成能力,也简化了系统间的数据交互。对于需要快速搭建轻量级数据接口的工业场景,这种自托管WebApi的方案具有很高的实用价值。

可以根据实际需求扩展更多接口,实现更复杂的数据服务功能。

关键词

WinForm、WebApi、ModbusTCP、自托管、HTTP服务、数据接口、工业自动化、xktComm、ApiController、HttpSelfHostServer

最后

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

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

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