Durante o processo de desenvolvimento do computador superior, às vezes é necessário fornecer interfaces de dados para MES ou outros sistemas. Hoje vou compartilhar com você como desenvolver interfaces WebApi em aplicativos de desktop, como o Winform, para fornecer serviços de dados para dispositivos modbus externos. O modelo de comunicação é:
Para melhor demonstrar o cenário da aplicação, este caso toma como exemplo a leitura do dispositivo ModbusTCP, após o desenvolvimento da interface WeiApi, o sistema de terceiros pode ler os dados do dispositivo através desta interface.
O ambiente técnico usado neste exemplo: VS2019, Modbus Slave, WebApi
1. Crie um programa Winform
2. Interface de layout da interface do usuário, o layout aqui não é bom e bonito, mas apenas um layout regular
3. Realize a conexão ModbusTCP
3.1 Instale o software Modbus Slave, que é um software de simulação de equipamento Modbus slave, utilizado para simular um equipamento Modbus Slave, ou seja, o equipamento do computador inferior, como sensor de temperatura, abra o software,
3.2 Preencha três dados
Definido para ler os dados do registro salvo,
3.3 Nuget procura por modbustcp e o instala, para que a conexão ModbusTCP possa ser realizada posteriormente.
3.4, o código do botão "Estabelecer Conexão" é o seguinte:
Preste atenção para adicionar o objeto de atributo no arquivo program.cs e atribua o objeto escravo à variável global ModbusDevice quando a conexão for bem-sucedida
Execute o programa, clique na conexão, ele mostrará sucesso
3.5 Código de desconexão
4. Criar HttpServer
4.1 Primeiro pesquise essas duas bibliotecas através do Nuget, adicione uma referência:
-
Microsoft.AspNet.WebApi.Client
-
Microsoft.AspNet.WebApi.SelfHost
-
4.2 Crie uma classe. HttpServer é principalmente o encapsulamento de HttpSelfHostServer. A classe HttpServer é a seguinte: Código completo:
-
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, adicione uma classe HomeController,
- Escreva um método para ler dados em uma área de armazenamento de registro de retenção, o código é o seguinte:
-
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. O código para abrir o botão de serviço
-
fechar código do botão de serviço
-
6. Execute o programa
Abra o navegador e digite o endereço de acesso: http://127.0.0.1:6688/api/home/ReadKeepReg?address=0
Neste formato de endereço, http://127.0.0.1:6688 é o endereço e a porta definidos na caixa de texto no formulário de formulário, api/home/ReadKeepReg é o método ReadKeepReg no controlador de acesso homecontroller, address=0 é o parâmetro endereço no método, 0 é o valor do parâmetro. O valor do parâmetro é 0 porque o número do endereço do dispositivo modbus escravo começa em 0. Finalmente, revise o processo de comunicação: