系统集成 · 2025-09-10

基于WebApi实现上位机数据接口

大家好!我是付工。

在上位机开发过程中,很多时候需要提供数据接口给Mes或第三方平台。

前面给大家介绍了ModbusTcp服务器的方式。

C#轻松实现ModbusTCP服务器接口

今天跟大家分享如何基于WebApi实现数据接口。

PLC采集

首先我们实现一下西门子PLC的数据采集。

为了快速实现,我们采取读取类的方式。

原文配图 1

1、首先我们参考PLC程序创建好一个PLC实体类。

public class PlcData
{
    public bool InPump1State { get; set; }
    public bool InPump2State { get; set; }
    public bool CirclePump1State { get; set; }
    public bool CirclePump2State { get; set; }
    public bool ValveInState { get; set; }
    public bool ValveOutState { get; set; }
    public bool SysRunState { get; set; }
    public bool SysAlarmState { get; set; }
    public byte[] SpareState { get; set; } = new byte[2];
    public float PressureIn { get; set; }
    public float PressureOut { get; set; }
    public float TempIn1 { get; set; }
    public float TempIn2 { get; set; }
    public float TempOut { get; set; }
    public float PressureTank1 { get; set; }
    public float PressureTank2 { get; set; }
    public float LevelTank1 { get; set; }
    public float LevelTank2 { get; set; }
    public float PressureTankOut { get; set; }
}

2、Nuget搜索s7netplus,添加西门子通信库。

原文配图 2

3、开始采集PLC程序,代码如下:

 private void btn_Connect_Click(object sender, EventArgs e)
 {
     cts = new CancellationTokenSource();
     CpuType cpuType = (CpuType)Enum.Parse(typeof(CpuType), this.cmb_CPU.Text);
     string ipAddress = this.txt_PLCIP.Text;
     Task.Run(() =>
     {
         plc = new Plc(cpuType, ipAddress, 0, 0);
         plc.Open();
         while (!cts.IsCancellationRequested)
         {
             Global.PlcData = plc.ReadClass<PlcData>(1, 0);
             this.Invoke(new Action(() =>
             {
                 this.lbl_PreIn.Text = Global.PlcData.PressureIn.ToString("f1");
                 this.lbl_PreOut.Text = Global.PlcData.PressureOut.ToString("f1");
                 this.lbl_TempIn.Text = Global.PlcData.TempIn1.ToString("f1");
                 this.lbl_TempOut.Text = Global.PlcData.TempOut.ToString("f1");
             }));
             Thread.Sleep(300);
         }
     });
 }

4、停止采集PLC程序,代码如下:

private void btn_DisConnect_Click(object sender, EventArgs e)
{
    cts?.Cancel();
    this.plc.Close();
}

5、最终实现效果如下:

原文配图 3

WebApi服务

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

Microsoft.AspNet.WebApi.Client

原文配图 4

Microsoft.AspNet.WebApi.SelfHost

2、创建HttpServer类,HttpServer主要是对HttpHostServer进行封装,代码如下:

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);
    }
    public Task StartHttpServer()
    {
        return server.OpenAsync();
    }
    public Task CloseHttpServer()
    {
        return server.CloseAsync();
    }
}

3、创建一个控制器HomeController,继承ApiController,并提供一个HttpGet的方法GetPlcData,代码如下:

public class HomeController : ApiController
{
    [HttpGet]
    public IHttpActionResult GetPlcData()
    {
        return Json(Global.PlcData);
    }
}

4、实现开启和停止Http服务,代码如下:

private HttpServer httpServer = null;
private async void btn_Start_Click(object sender, EventArgs e)
{
    try
    {
        httpServer = new HttpServer(this.txt_WebIp.Text, int.Parse(this.txt_WebPort.Text));
        await httpServer.StartHttpServer();
        MessageBox.Show("开始服务成功");
    }
    catch (Exception ex)
    {
        MessageBox.Show("开始服务失败:" + ex.Message);
    }
}
private async void btn_Stop_Click(object sender, EventArgs e)
{
    try
    {
        await httpServer.CloseHttpServer();
    }
    catch (Exception ex)
    {
        MessageBox.Show("停止服务失败:" + ex.Message);
    }
}

功能测试

1、运行程序后,先点击开始采集实现与PLC的采集,再点击开启服务,开启Http服务:

原文配图 5

2、浏览器输入http://127.0.0.1:3000/api/home/GetPlcData,即可获取PlcData的数据。

原文配图 6

3、这样第三方系统或Mes即可通过 WebApi来获取到该数据,可以参考:

C#上位机通过WebApi对接MES

本文为原文文字快照,已收录 6 张技术配图;二维码与推广图未收录。
标签:#WebApi #数据接口