在上位机开发过程中,有时候会遇到需要提供数据接口给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类如下: 完整代码:
-
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.SelfHost; namespace WinFormsApI { 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); } /// <summary> /// 开启服务(异步任务方式) /// </summary> /// <returns></returns> public Task StartHttpServer() { return server.OpenAsync(); } /// <summary> /// 关闭服务(异步任务方式) /// </summary> /// <returns></returns> public Task CloseHttpServer() { return server.CloseAsync(); } } }
-
4.3,添加一个类HomeController,
- 编写了一个方法可以读取一个保持寄存器存储区数据,代码如下所示:
-
using EasyModbus; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace WinFormsApI { public class HomeController : ApiController { public static ModbusClient mc; public HomeController() { mc = Program.ModbusDevice; //从全局变量中获取指定属性 } /// <summary> /// 读保存寄存器 /// </summary> /// <param name="address">寄存器地址</param> /// <returns></returns> [HttpGet] public IHttpActionResult ReadKeepReg(int address) { int[] res = mc.ReadHoldingRegisters(address, 3);//读取保存寄存器数据,从指定地址address开始,读取3个地址 string mes = "温度:" + res[0] + ",湿度:" + res[1] + ",光照:"+res[2]; return Json(mes); } } }
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开始的,最后回顾下这个通讯过程: