前言
在实际工作中,我们常常需要开发运行在后台、无需用户交互的应用程序。例如,定时读取西门子PLC的数据并保存到数据库中。为了实现这一目标,我们可以选择使用C#创建一个Windows服务。
在本篇文章中,将介绍如何基于C#创建一个Windows服务,并实现对西门子PLC的定时读取和保存功能,希望这篇文章能为大家提供有价值的参考。
Windows 服务说明
Windows 服务是一种特殊类型的应用程序,能够在系统启动时自动运行,并且无需用户登录即可执行。
它非常适合用于需要在后台持续运行的任务,尤其是在无人值守环境中。
适用场景
1、持续运行的任务
日志采集:定时收集系统或应用程序的日志数据。
网络代理:作为中间层处理网络请求和响应。
数据同步:定期同步不同系统之间的数据。
2、系统后台维护
自动更新:定时检查并安装系统或应用程序的更新。
性能监控:实时监控系统的性能指标(如CPU、内存使用率等)。
备份任务:定时执行数据备份操作。
3、无人值守环境中的任务
定时任务调度:在特定时间点执行预定义的任务。
设备监控:监控硬件设备的状态并进行相应处理(如读取PLC数据)。
核心特性
1、通过服务控制管理器(SCM)管理
SCM 是 Windows 操作系统中用于管理服务的一个组件。通过 SCM,可以方便地安装、启动、停止、暂停和删除服务。
2、与用户登录状态无关
Windows 服务可以在没有任何用户登录的情况下运行。这意味着即使没有用户活动,服务也可以在后台持续工作。
3、支持系统启动时自动运行
可以配置服务在系统启动时自动运行,确保关键任务始终处于激活状态。这对于需要高可用性的应用尤其重要。
4、灵活的权限设置
Windows 服务可以配置不同的权限级别,允许它们访问特定的系统资源或执行特定的操作。例如,某些服务可能需要管理员权限才能正常运行。
5、事件日志记录
Windows 服务可以将运行时的信息记录到系统事件日志中,便于后续的故障排查和审计。
6、多实例支持
在某些情况下,可以运行多个相同的服务实例,每个实例处理不同的任务或数据集。
开发与部署
开发工具:通常使用 C# 或其他 .NET 语言通过 Visual Studio 进行开发。
安装包:可以通过安装脚本或工具(如 sc.exe 命令行工具或第三方工具如 NSSM)来创建和管理服务。
调试与测试:可以使用 Visual Studio 的调试功能或专用的调试工具来测试服务的行为。
Windows服务创建
1、创建一个新项目,项目模板选择Windows服务(.Net Framework):
2、项目名称为WindowsServiceDemo,项目创建完成后如下:
3、修改服务名称为SiemensPLCService:
4、在设计界面的空白处,右击弹窗中,选择添加安装程序:
5、点击添加安装程序之后,会自动添加一个ProjectInstaller界面,里面有两个组件,分别是serviceProcessInstaller和serviceInstaller。
6、选择serviceInstaller,在右侧的属性进行设置,主要可以设置以下属性:
ServiceName:服务名称
Description:服务描述
StartType:启动类型
7、接着选择ProjectInstaller进行设置,主要设置Account,指示用来运行此服务的账户类型,可以设置为LocalSystem。
8、设置完成之后,切换到SiemensPLCService这个类,点击切换到代码视图,我们可以看到后台有一些自动生成的代码:
public partial class SiemensPLCService : ServiceBase
{
public SiemensPLCService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
}
我们可以在OnStart和OnStop里写一些代码逻辑。
9、写了一个简单的逻辑,就是每次服务启动或停止都会向指定的文件中写入一串信息。
private Plc siemens;
private CancellationTokenSource cts;
protected override void OnStart(string[] args)
{
try
{
this.siemens = new Plc(CpuType.S7200Smart, "192.168.2.150", 0, 0);
this.siemens.Open();
cts = new CancellationTokenSource();
Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
try
{
uint temp = Convert.ToUInt32(this.siemens.Read("DB1.DBD4"));
float val = temp.ConvertToFloat();
await Task.Delay(1000);
WriteInfo("读取PLC数据:"+val.ToString("f2"));
}
catch (Exception ex)
{
WriteInfo(ex.Message);
}
}
this.siemens.Close();
});
}
catch (Exception ex)
{
WriteInfo(ex.Message);
}
}
private string filePath = @"D:ServiceLog.txt";
private void WriteInfo(string info)
{
using (FileStream stream = new FileStream(filePath, FileMode.Append))
{
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine($"{DateTime.Now},{info}");
}
}
}
protected override void OnStop()
{
this.siemens?.Close();
}
Windows服务安装卸载
我们直接运行刚刚创建的服务,发现是无法运行的,提示如下:
接下来,我们使用这个exe来进行安装和卸载Windows服务。
1、首先,使用管理员权限打开cmd命令行,然后进入这个路径下,便于直接操作InstallUtil。cdC:\Windows\Microsoft.NET\Framework\v4.0.30319
2、安装服务命令:installutil exe绝对路径 ;
installutil C:\Users\Administrator\Desktop\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe
打开服务,可以看到TestService这个名称的服务已经安装完成,
3、安装完成后,双击打开,可以启动服务,也可以手动停止:
4、观察D盘文件,可以看到PLC的数据每秒会存一次到指定文件中:
5、需要卸载服务时,可以执行卸载服务命令:installutil exe绝对路径 -u ;
installutil C:\Users\Administrator\Desktop\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe -u
总结
在这篇文章中,探讨了 Windows 服务的核心特性,包括如何通过服务控制管理器(SCM)进行管理、如何配置服务在系统启动时自动运行,以及如何利用这些特性来实现各种后台任务。我们还讨论了开发和部署服务的基本步骤,希望能为你提供一个清晰的指导。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:上位机付工
出处:mp.weixin.qq.com/s/_YhKVfgNI50j0XJP3jaxfQ
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!