如何在Wonderware System Platform及Archestra IDE脚本中获取远程PC时间?
作为经常处理Wonderware系统集成的开发者,我来分享几种在System Platform里获取远程PC系统时间的靠谱方法,分InTouch Scripting和QuickScript.NET两种场景具体说明:
一、InTouch Scripting 实现方式
InTouch脚本里有两种实用的方案,看你的环境选择:
传统DDE/NetDDE通信:
先确保远程PC开启了DDE服务,然后在InTouch里通过DDE读取系统时间。脚本示例:string sRemoteTime; // 把RemotePCName替换成目标电脑的名称或IP地址 sRemoteTime = DDERead("\\\\RemotePCName\\System|DateTime", "", 1000);提醒:这种方式需要双方防火墙放行DDE相关端口,而且新版Windows系统里可能需要额外配置NetDDE的权限,适合老项目兼容。
调用Windows API(更稳定):
用NetRemoteTOD这个API直接获取远程时间,权限配置到位的话比DDE可靠。先在脚本里声明API:[DLLImport("netapi32.dll")] function long NetRemoteTOD(string UncServerName, ref long BufferPtr); [DLLImport("netapi32.dll")] function long NetApiBufferFree(long BufferPtr);然后编写获取逻辑:
long hBuffer; long lResult; // 替换成远程PC的UNC路径,比如\\192.168.1.100 string sRemotePC = "\\\\192.168.1.100"; lResult = NetRemoteTOD(sRemotePC, hBuffer); if (lResult == 0) { // 这里需要解析缓冲区里的TOD结构转换成可读的时间格式 // 记得最后一定要释放缓冲区,避免内存泄漏 NetApiBufferFree(hBuffer); }提示:运行InTouch的用户必须有远程PC的访问权限,比如读取系统时间的权限。
二、QuickScript.NET 实现方式
QuickScript.NET基于.NET框架,能用的工具更多,首推WMI查询:
WMI查询(推荐):
.NET对WMI的支持很完善,通过查询远程PC的Win32_OperatingSystem类就能拿到时间。代码示例:using System.Management; public string GetRemoteDateTime(string strPCName, string strUsername, string strPassword) { ConnectionOptions connOptions = new ConnectionOptions(); connOptions.Username = strUsername; connOptions.Password = strPassword; // 构建远程WMI连接范围 ManagementScope mgmtScope = new ManagementScope($"\\\\{strPCName}\\root\\cimv2", connOptions); mgmtScope.Connect(); // 查询本地时间 ObjectQuery timeQuery = new ObjectQuery("SELECT LocalDateTime FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(mgmtScope, timeQuery); foreach (ManagementObject obj in searcher.Get()) { string strRemoteTime = obj["LocalDateTime"].ToString(); // 把WMI的时间格式转换成.NET DateTime DateTime dtRemote = ManagementDateTimeConverter.ToDateTime(strRemoteTime); return dtRemote.ToString("yyyy-MM-dd HH:mm:ss"); } return "获取远程时间失败"; }调用的时候直接传参数就行:
string strRemoteTime = GetRemoteDateTime("192.168.1.100", "RemoteAdmin", "YourPassword");注意:远程PC要开启WMI服务,防火墙放行135端口和WMI动态端口,且提供的用户有远程WMI访问权限。
自定义Socket服务(特殊场景):
如果WMI配置太麻烦,可以在远程PC上写个轻量的Socket服务,启动后监听某个端口,收到请求就返回当前系统时间。然后在QuickScript.NET里通过Socket连接读取返回值。这种方式适合对权限控制有特殊要求的场景,但需要额外开发远程端的小服务。
三、通用注意事项
- 权限:无论用哪种方法,运行脚本的用户必须拥有远程PC的对应权限(读取系统时间、WMI访问、DDE访问等)。
- 防火墙:一定要确保远程PC的防火墙允许对应的通信端口,不然会连接失败。
- 网络:局域网内两台PC必须能互相ping通,网络连接稳定是基础。
内容的提问来源于stack exchange,提问作者Mikhail Kolmykov




