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

在上位机开发过程中,有时候会遇到需要提供数据接口给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开始的,最后回顾下这个通讯过程:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt- QSS样式表用法及用例说明

这里写自定义目录标题 QSS样式表用法1.Qt样式表语法2.选择器3.属性列表4.冲突解决5.全局添加QSS QSS样式表用法 整理qss样式表语法知识&#xff0c;方便今后查看。 1.Qt样式表语法 Qt样式表支持各种属性、伪状态和子控件&#xff0c;可以自定义小部件的外观 selector { attr…

Day01 关系型数据MySQL简介与多平台安装配置

文章目录 第一章 数据库简介1.1 数据库的简介1.2 数据库的分类 第二章 数据库的安装与配置2.1 安装: Windows版2.2 卸载: Windows版2.3 安装: Mac直装版2.4 卸载: Mac直装版2.5 安装: Mac Homebrew版2.6 卸载: Mac Homebrew版2.7 启动、停止mysql服务2.8 登录到MySQL2.9 修改密…

【dcdc】AP2813 DCDC降压恒流芯片 两路输出 一路恒流 一路瀑闪 电动摩托汽车灯方案

1&#xff0c;方案来源&#xff1a;深圳市世微半导体有限公司 汤巧 2&#xff0c;产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达12W&#xff0c;最大电流…

从零开始学习JVM(五)-运行时数据区的方法区

1. 方法区基本介绍 官方文档&#xff1a;The Java Virtual Machine Specification 《Java虚拟机规范》中明确说明&#xff1a;“尽管所有的方法区在逻辑上是属于堆的一部分&#xff0c;但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言&…

webpack将vue3单页面应用改造成多页面应用

上篇文章搞了个单页面vue&#xff0c;现在要将其改成多页面&#xff0c;只是简单尝试&#xff0c;给了例子 其实也就是改个webpack的入口和html模版的配置&#xff0c;其他的话&#xff0c;每个页面都有自己的vue和路由实例&#xff0c;pinia的话就共享吧 &#xff01;import…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…

# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用 JProfiler是一个重量级的JVM监控工具&#xff0c;提供对JVM精确监控&#xff0c;其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据&#xff0c;定位性能问题。 官网地址&#xff1a;Java Profiler…

shallowRef和shallowReactive的使用?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 shallowRef&#xff1f;二、 shallowReactive&#xff1f;在什么时候使用&#xff1f; 三、案例1、shallowRef2、shallowReactive 提示&#xff1a;以下是本篇…

App Store上线APP流程

现在App Store上已经有数百万款应用&#xff0c;因此对于App的规范要求也越来越高&#xff0c;对于新上线的APP需要满足这些规则并不是件容易的事。今天和大家分享这方面的知识&#xff0c;希望大家喜欢。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff…

浙大数据结构第六周之初识图

题目详情&#xff1a;06-图1 列出连通集 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1…

飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章&#xff1a;飞书接入ChatGPT - 将ChatGPT集…

服务(第二十八篇)rsync

配置rsync源服务器&#xff1a; #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …

庄懂的TA笔记(十四十六)<特效:火焰 + 水流>

庄懂的TA笔记&#xff08;十四&十六&#xff09;&#xff1c;特效&#xff1a;火焰 水流&#xff1e; 目录 一、作业展示&#xff1a; 二、示范&#xff1a;火: 参考资料&#xff1a; 实现思路&#xff1a; 实践操作&#xff1a; 三、示范&#xff1a;水: 实现思路&am…

PCB 布线技术~PCB结构:Traces,电源平面

PCB导体:Traces • 铜是PCB中最常用的导体 – 走线或连接器一般通过镀金来提供一个抗腐蚀的电传导特性 – 走线的宽度和长度-由PCB布线工程师控制 • 在通常的制造工艺下&#xff0c;走线的宽度和之间的间距一般要≥5 mil – 走线厚度-制造工艺的变量 • 典型值 0.5oz – 3oz •…

C++(2):变量和基本类型

基本内置类型 C定义了一套包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。 算数类型 算数类型分为两类&#xff1a;整型&#xff0…

【Linux】多种环境变量介绍与设置

文章目录 一. linux环境变量介绍1. linux中的环境变量配置文件2. 环境变量加载顺序 二. 操作环境变量1. 读取环境变量envexportecho $PATH 2. 设置环境变量2.1. export PATH&#xff1a;临时的环境变量2.2. 用户的环境变量vim ~/.bashrcvim ~/.bash_profile 2.3. 所有用户的环境…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度&#xff08;udp 长度&#xff09; 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识&#xff0c;第二章和第三章我们通…

SpringBoot 整合 ChatGPT API 项目实战

SpringBoot 整合 ChatGPT API 项目实战 一、准备工作 二、补全接口示例 三、申请API-KEY 四、JavaScript调用API 五、SpringBoot使用ChatGPT API 体验到了ChatGPT的强大之后&#xff0c;那么我们会想&#xff0c;如果我们想基于ChatGPT开发一个自己的聊天机器人&#xff0…

论文、专利、文献检索及图像数据工具总结

一、文献检索 1、中文文献检索参考 中文文献途径网址用途1知网https://www.cnki.net/文献检索、下载2万方数据网https://www.wanfangdata.com.cn/文献检索、下载3维普期刊http://lib.cqvip.com/文献检索、下载4浙江图书馆https://www.zjlib.cn/#searchs_1_div文献检索、下载5…

html监听界面被隐藏或显示

vue相比于小程序和uni-app 显然少了两个有点用的生命周期 onShow 应用被展示 onHide 应用被隐藏 但其实这个 要做其实也很简单 JavaScript中 有对应的visibilitychange事件可以监听 我们Html参考代码如下 <!DOCTYPE html> <html lang"en"> <head>…