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

这篇具有很好参考价值的文章主要介绍了Winform窗体利用WebApi接口实现ModbusTCP数据服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

1、创建一个Winform程序

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

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

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

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

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

 3、实现ModbusTCP连接

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

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

 3.2 填写三个数据

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

设置读取保存寄存器数据,Winform窗体利用WebApi接口实现ModbusTCP数据服务

 

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

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

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

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

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

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

 

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

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

 3.5断开连接的代码

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

 4、创建HttpServer

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

  • Microsoft.AspNet.WebApi.Client

  • Microsoft.AspNet.WebApi.SelfHost

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

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

    4.2 创建类,HttpServer主要是对HttpSelfHostServer的封装,HttpServer类如下:Winform窗体利用WebApi接口实现ModbusTCP数据服务 完整代码:

  • 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, 

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

     编写了一个方法可以读取一个保持寄存器存储区数据,代码如下所示:
  • Winform窗体利用WebApi接口实现ModbusTCP数据服务
  • 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、开启服务按钮的代码

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

     关闭服务按钮代码

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

     6、运行程序

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

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

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

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

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

 

Winform窗体利用WebApi接口实现ModbusTCP数据服务文章来源地址https://www.toymoban.com/news/detail-454431.html

到了这里,关于Winform窗体利用WebApi接口实现ModbusTCP数据服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# Winform无边框窗体实现界面拖动

    C# Winform无边框窗体实现界面拖动

    2024年02月07日
    浏览(47)
  • 【Winform学习笔记(八)】通过委托实现跨窗体传值

    在本文中主要介绍 如何通过委托实现跨窗体传值,并以简单的示例进行展示。 委托 :委托是方法的抽象,与类一样是一种用户自定义类型,存储的是一系列具有相同签名和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行; 委托类型声明 :委托是类

    2024年02月11日
    浏览(47)
  • C# winform usercontrol控件跟随主窗体实现自动大小

    usercontrol控件跟随主窗体实现自动大小 今天是跟着哗哩哗哩大学学习C的第N天,但是是学习usercontrol的第一天。 第一天遇到的问题就是如何将usercontrol的大小跟随主窗体的一起变大变小。视频中教得很详细,首先是将usercontrol控件实例化,接着就是设置usercontrol的dock属性为fil

    2024年02月12日
    浏览(48)
  • C# winform窗体UI美化后实现最大化、最小化、还原、关闭、窗体移动等等-2023/1/11

    在做winform窗体UI美化时,一般都需要将窗体的FormBorderStyle属性设为None,之后窗体就会没有最上面的标题栏,然后按照UI进行界面的设计。美化的代价就是窗体本来标题栏的相关操作,例如双击自动最大化,再次双击又恢复正常大小,以及上窗体关闭、最小化等功能就都需要自

    2024年02月08日
    浏览(55)
  • 使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

    在做C/S项目中,做好的窗体出现了页面加载控件缓慢,放大、缩小窗体之后,窗体加载卡顿,以及数据渲染缓慢。 百度介绍:我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(

    2024年02月02日
    浏览(46)
  • 【WinForm】WinForm常见窗体技术汇总

    窗体调用外部程序与渐变窗体 按回车键跳转窗体中的光标焦点 剪切板操作 实现拖放操作 移动的窗体 抓不到的窗体 MDI窗体 提示关闭窗体 窗体正在变色: 窗体调用网络页面–启动浏览器: 窗体调用本地程序–启动记事本: 按下enter键,光标会向下移动: 第一个text中输入内

    2024年02月08日
    浏览(51)
  • winform窗体

    WinForm,是·Net开发平台中对Windows Form的一种称谓。WinForm是窗体应用程序,由若干个窗体应用组成,基于C/S架构 (1)基本控件: label 文本提示 TextBox 文本框 button      按钮 radiobutton 单选按钮 panel       面板(相当于小容器) check 复选框 combox        下拉列表框 listbox  列表

    2024年02月08日
    浏览(71)
  • Winform窗体使用IOC容器

    Winform窗体如何使用IOC容器呢?在nuget中添加Microsoft.Extensions.DependencyInjection 接着在Program类Main方法中添加一下代码 在此类中继续补充以下代码 以后你的注入只需要在 static void ConfigureServices(IServiceCollection services)这个方法中注入就行了 全景图:   我把窗体也注入了,不过不是

    2024年02月12日
    浏览(52)
  • winform窗体闪烁问题解决方式

    winform窗体闪烁问题解决方式 1、使用窗体双缓冲 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); 窗体的DoubleBuffered 指示是否对控件进行双缓存处理。 2、使用CreateParams的使用解决闪屏问题

    2024年02月12日
    浏览(91)
  • 【C#】【WinForm】MDI窗体

    MDI窗体的相关学习使用 1、设置MDI父窗体  在属性中找到IsMdiContainer选项,设置为True 2、添加MDI子窗体,在项目中依次选择添加-窗体,然后一直默认即可  添加后的项目目录(Form1为父窗口,Form2、Form3为子窗口)  3、在Form1.cs中,创建对应MDI子窗口的对象并调用显示出来 保存

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包