基于WebApi实现上位机数据接口
大家好!我是付工。
在上位机开发过程中,很多时候需要提供数据接口给Mes或第三方平台。
前面给大家介绍了ModbusTcp服务器的方式。
C#轻松实现ModbusTCP服务器接口
今天跟大家分享如何基于WebApi实现数据接口。
PLC采集
首先我们实现一下西门子PLC的数据采集。
为了快速实现,我们采取读取类的方式。

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,添加西门子通信库。

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、最终实现效果如下:

WebApi服务
1、首先通过Nuget搜索这两个库,添加一下引用:
Microsoft.AspNet.WebApi.Client

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服务:

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

3、这样第三方系统或Mes即可通过 WebApi来获取到该数据,可以参考:
C#上位机通过WebApi对接MES