前言
工业自动化领域,上位机软件不仅要完成数据采集和人机交互,越来越多的场景需要它对外提供数据服务。
尤其是在与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.Text, this.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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!