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

news2024/11/23 21:42:12

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【简单的解压缩算法】【2023Q1 200分】

一、题目描述 现需要实现一种算法&#xff0c;能将一组压缩字符串还原成原始字符串&#xff0c;还原规则如下&#xff1a; 1、字符后面加数字N&#xff0c;表示重复字符N次。例如&#xff1a;压缩内容为A3&#xff0c;表示原始字符串为AAA。 2、花括号中的字符串加数字N&…

MyBatis环境搭建+第一个MyBatis程序

目录 1.MyBatis是什么&#xff1f; 2.MyBatis开发环境搭建 3.我的第一个MyBatis程序 1.MyBatis是什么&#xff1f; MyBatis是一款数据库框架&#xff0c;是一款优秀的持久层框架&#xff0c;它不仅支持用户自定义SQL和存储过程&#xff0c;而且还具有高级映射功能。简单来说…

【重新定义matlab强大系列九】函数isoutlier查找数据中的离群值

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

【TikZ 简单学习(上):基础绘制】Latex下的绘图宏包

【TikZ 简单学习[上]基础绘制】Latex下的绘图宏包 前置简单图形绘制基本架构路径绘制添加样式/风格弧线绘制剪切抛物线和正弦曲线绘制填充和绘制渲染绘制箭头循环添加文本信息绘制一个角度 前置 Latex 可以解决绘制这些东西&#xff1a; ∫ a b 1 x d x \int_a^b\frac{1}{x}dx…

DoFE:Domain-oriented Feature Embedding

key : 通过利用多源领域的知识来提高CNN在未见目标领域上的泛化能力。 我们的DoFE框架通过动态丰富图像特征与来自多源领域学习的附加领域先验知识相结合&#xff0c;使语义特征更具辨别性。引入了一个领域知识池来学习和记忆从多源领域提取的先验信息。 然后&#xff0c;原始…

Raidrive安装配置,结合alist实现将webdav网盘挂载为本地磁盘(保姆级教程)

目录 1. 下载安装2. 添加网盘3. 常见报错3.1 不要勾选安全连接3.2 路径必须填写正确 4. 测试效果总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 书接上文 AList挂载工具安装搭建使用教程&#xff0c;快速访…

【数据结构】一文读懂循环队列的实现细节

循环队列最早出现在计算机系统设计中&#xff0c;它的出现主要是为了满足实际需求&#xff1a;在存储机制上&#xff0c;传统的队列存储方式难以满足一些实际应用中需要存储大量数据的场景。在有限的数组空间内&#xff0c;传统的队列存储方式可能会出现存储空间浪费过多、存储…

【操作系统】线程简介

线程简介 线程概念 在许多经典的操作系统教科书中&#xff0c;总是把进程定义为程序的执行实例&#xff0c;它并不执行什么, 只是维护应用程序所需的各种资源&#xff0c;而线程则是真正的执行实体。 所以&#xff0c;线程是轻量级的进程&#xff08;LWP&#xff1a;light w…

4.1 - 信息收集 - 子域名收集

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 子域名收集 一、域名爆破工具二、搜索引擎1、百度2、必应 三、第三方网站1、VirusTotal2、…

LLaMA模型系统解读

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

深度剖析,如何从底层代码层面理解Selenium和Appium的关联

目录 前言&#xff1a; 一、Selenium和WebDriver 二、Appium和WebDriver 三、Selenium和Appium的底层关联 1. Selenium WebDriver提供底层的浏览器控制机制 2. 利用JSON Wire Protocol通信协议实现通讯机制 四、实例代码 总结&#xff1a; 前言&#xff1a; Selenium和…

FFmpeg命令实战(中)

标题 1.ffplay命令播放2.ffplay简单过滤器3 .ffmpeg命令参数1.主要参数2. 音频参数3.视频参数 4.ffmpeg命令提取音视频数据1.保留封装格式2.提取视频3.提取音频 5.ffmpeg提取像素格式1.提取YUV2.提取RGB3.提取PCM 5.ffmpeg命令转封装格式1.保持编码格式2.改变编码格式3.修改帧率…

String源码

介绍 1&#xff09;String 是一个 final 类&#xff0c;即不能被继承的类 。 2&#xff09;String类实现了 java.io.Serializable 接口&#xff0c;可以实现序列化。 3&#xff09;String类实现了 Comparable< String>&#xff0c;可以用于比较大小&#xff08;按顺序…

49天精通Java,第34天,finalize、引用计数、JVM停止复制、JVM即时编译器

目录 一、finalize二、引用计数三、JVM停止复制四、JVM即时编译器五、惰性评估 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零基础手把手入门教程&#xff0c;系列课程包括&#xff1a;基础篇、集合篇、Java8…

chatgpt赋能Python-pythonchallenge

Python Challenge: 挑战你的Python技能 如果你正在寻找一种提高Python编程技能的有趣方法&#xff0c;那么Python Challenge是一个不错的选择。Python Challenge是一个在线的puzzle游戏&#xff0c;每个挑战都需要使用Python编写程序来解决。这些挑战是由一个名叫Nadav Samet的…

centos或ubuntu部署OpenSips

参考 Centos7安装opensips超详细教程 centos7 部署opensips信令服务器 【死磕opensips】sip协议解析 开源SIP Kamailio OpenSIPS的四种均衡负载算法详解和SBC呼叫路由 基于SIP协议的性能测试——奇林软件kylinPET OpenSIPS实战&#xff08;一&#xff09;&#xff1a;OpenSIPS…

【消息中间件】RocketMQ如何保证消息的可靠性?

文章目录 前言一 、发送端消息可靠性1. 同步发送2. 异步发送3. 单向发送4. 发送重试策略 二、存储端消息可靠性1. 存储可靠性挑战2. 同步刷盘3. 异步刷盘&#xff08;默认&#xff09;4. 过期文件删除 三、消费端消息可靠性1. 消费重试2. 死信队列3. 消息回溯 四、总结参考与感…

一文读懂“大语言模型”

1、背景 本文基于谷歌云的官方视频&#xff1a;《Introduction to Large Language Models》 &#xff0c;使用 ChatGPT4 整理而成&#xff0c;希望对大家入门大语言模型有帮助。 本课程主要包括以下 4 方面的内容&#xff1a; 大语言模型的定义描述大语言模型的用例解释提示…

网络安全分组混战靶机攻击与加固——BPlinux系列

网络安全分组混战靶机攻击与加固——BPlinux系列 目录 一、渗透过程 二、加固过程 三、中职网络安全竞赛知识星球 一、渗透过程 #这是一个以前混战阶段用的靶机然后C模块也会用 1、我们先使用nmap --scriptvuln(这是nmap自带的脚本&#xff0c;可以扫描可利用的漏洞&…

计算机网络|第四章:网络层:数据平面

前文回顾&#xff1a;第三章&#xff1a;传输层 运输层依赖于网络层的主机到主机的通信服务&#xff0c;提供各种形式的进程到进程的通信。网络层与传输层和应用层不同的是&#xff0c;在网络中的每一台主机和路由器中都有一个网络层部分。正因如此&#xff0c;网络层协议是协议…