您现在的位置是:首页 > 技术教程 正文

Winform窗体利用WebApi接口实现ModbusTCP数据服务

admin 阅读: 2024-04-01
后台-插件-广告管理-内容页头部广告(手机)

在上位机开发过程中,有时候会遇到需要提供数据接口给MES或者其他系统,今天跟大家分享一下,如何在Winform等桌面应用程序中,开发WebApi接口,提供对外modbus设备的数据服务。通讯模型是:

为了更好地演示应用场景,本案例以读取ModbusTCP设备为例,开发好WeiApi接口后,第三方系统可以通过该接口读取到设备数据。

本例使用的技术环境:VS2019,Modbus Slave,WebApi

1、创建一个Winform程序

 

 

 2、布局ui界面,这里布局没有做精细优美布局,只是常规布局

 3、实现ModbusTCP连接

3.1安装Modbus Slave这个软件,这是一个Modbus从站设备的模拟软件,用来模拟一个Modbus Slave的设备,也就是下位机的设备,比如一个温度传感器,打开软件,

 3.2 填写三个数据

设置读取保存寄存器数据,

 

 3.3、Nuget搜索modbustcp并安装,便于后续可以实现ModbusTCP连接, 

 3.4,“建立连接”按钮的代码如下:

 注意要在program.cs文件中添加属性对象,当连接成功后将从站对象赋给全局变量ModbusDevice

 

 运行程序,点击连接,显示成功

 3.5断开连接的代码

 4、创建HttpServer

4.1 首先通过Nuget搜索这两个库,添加一下引用:

  • Microsoft.AspNet.WebApi.Client

  • Microsoft.AspNet.WebApi.SelfHost

  •  

    4.2 创建类,HttpServer主要是对HttpSelfHostServer的封装,HttpServer类如下: 完整代码:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Web.Http;
    7. using System.Web.Http.SelfHost;
    8. namespace WinFormsApI
    9. {
    10. public class HttpServer
    11. {
    12. private HttpSelfHostServer server;
    13. public HttpServer(string ip, int port)
    14. {
    15. var config = new HttpSelfHostConfiguration($"http://{ip}:{port}");//创建宿主服务
    16. config.MapHttpAttributeRoutes();//添加路由属性
    17. config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}");//指定路由规则
    18. server = new HttpSelfHostServer(config);
    19. }
    20. ///
    21. /// 开启服务(异步任务方式)
    22. ///
    23. ///
    24. public Task StartHttpServer()
    25. {
    26. return server.OpenAsync();
    27. }
    28. ///
    29. /// 关闭服务(异步任务方式)
    30. ///
    31. ///
    32. public Task CloseHttpServer()
    33. {
    34. return server.CloseAsync();
    35. }
    36. }
    37. }

     

  • 4.3,添加一个类HomeController, 

  •  编写了一个方法可以读取一个保持寄存器存储区数据,代码如下所示:
    1. using EasyModbus;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. using System.Web.Http;
    8. namespace WinFormsApI
    9. {
    10. public class HomeController : ApiController
    11. {
    12. public static ModbusClient mc;
    13. public HomeController()
    14. {
    15. mc = Program.ModbusDevice; //从全局变量中获取指定属性
    16. }
    17. ///
    18. /// 读保存寄存器
    19. ///
    20. /// 寄存器地址
    21. ///
    22. [HttpGet]
    23. public IHttpActionResult ReadKeepReg(int address)
    24. {
    25. int[] res = mc.ReadHoldingRegisters(address, 3);//读取保存寄存器数据,从指定地址address开始,读取3个地址
    26. string mes = "温度:" + res[0] + ",湿度:" + res[1] + ",光照:"+res[2];
    27. return Json(mes);
    28. }
    29. }
    30. }

    5、开启服务按钮的代码

  •  关闭服务按钮代码

  •  6、运行程序

 

 打开浏览器,输入访问地址:http://127.0.0.1:6688/api/home/ReadKeepReg?address=0

 这个地址格式中http://127.0.0.1:6688是form窗体中文本框设置的地址和端口,api/home/ReadKeepReg是访问控制器homecontroller中的方法ReadKeepReg,address=0是方法中参数address,0是参数的值,参数值为0是因为modbus从站设备的地址编号从0开始的,最后回顾下这个通讯过程:

 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜